ceph: try to send partial cap release on cap message on missing inode
If we have enough memory to allocate a new cap release message, do so, so that we can send a partial release message immediately. This keeps us from making the MDS wait when the cap release it needs is in a partially full release message. If we fail because of ENOMEM, oh well, they'll just have to wait a bit longer. Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
Родитель
3d7ded4d81
Коммит
2b2300d62e
|
@ -2708,6 +2708,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
|
|||
* along for the mds (who clearly thinks we still have this
|
||||
* cap).
|
||||
*/
|
||||
ceph_add_cap_releases(mdsc, session, -1);
|
||||
ceph_send_cap_releases(mdsc, session);
|
||||
goto done;
|
||||
}
|
||||
|
|
|
@ -1066,9 +1066,9 @@ static int trim_caps(struct ceph_mds_client *mdsc,
|
|||
*
|
||||
* Called under s_mutex.
|
||||
*/
|
||||
static int add_cap_releases(struct ceph_mds_client *mdsc,
|
||||
struct ceph_mds_session *session,
|
||||
int extra)
|
||||
int ceph_add_cap_releases(struct ceph_mds_client *mdsc,
|
||||
struct ceph_mds_session *session,
|
||||
int extra)
|
||||
{
|
||||
struct ceph_msg *msg;
|
||||
struct ceph_mds_cap_release *head;
|
||||
|
@ -1980,7 +1980,7 @@ out_err:
|
|||
}
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
|
||||
add_cap_releases(mdsc, req->r_session, -1);
|
||||
ceph_add_cap_releases(mdsc, req->r_session, -1);
|
||||
mutex_unlock(&session->s_mutex);
|
||||
|
||||
/* kick calling process */
|
||||
|
@ -2690,7 +2690,7 @@ static void delayed_work(struct work_struct *work)
|
|||
send_renew_caps(mdsc, s);
|
||||
else
|
||||
ceph_con_keepalive(&s->s_con);
|
||||
add_cap_releases(mdsc, s, -1);
|
||||
ceph_add_cap_releases(mdsc, s, -1);
|
||||
if (s->s_state == CEPH_MDS_SESSION_OPEN ||
|
||||
s->s_state == CEPH_MDS_SESSION_HUNG)
|
||||
ceph_send_cap_releases(mdsc, s);
|
||||
|
|
|
@ -322,6 +322,9 @@ static inline void ceph_mdsc_put_request(struct ceph_mds_request *req)
|
|||
kref_put(&req->r_kref, ceph_mdsc_release_request);
|
||||
}
|
||||
|
||||
extern int ceph_add_cap_releases(struct ceph_mds_client *mdsc,
|
||||
struct ceph_mds_session *session,
|
||||
int extra);
|
||||
extern void ceph_send_cap_releases(struct ceph_mds_client *mdsc,
|
||||
struct ceph_mds_session *session);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче