]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
ceph: try to send partial cap release on cap message on missing inode
authorSage Weil <sage@newdream.net>
Wed, 9 Jun 2010 23:52:04 +0000 (16:52 -0700)
committerSage Weil <sage@newdream.net>
Thu, 10 Jun 2010 20:30:25 +0000 (13:30 -0700)
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>
fs/ceph/caps.c
fs/ceph/mds_client.c
fs/ceph/mds_client.h

index 7c692e746237fae0ea70da0a0b5f74cca4cb3082..619b61655ee5dd4496ca4ec6374849c09f892817 100644 (file)
@@ -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;
        }
index d28b6a9c0f96800210e2051e54cbe37b0af81334..1766947fc07ab0892027fd5a3fc042e552310275 100644 (file)
@@ -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);
index e43752b526351e91cbb27a34459d551862b65df6..b292fa42a66d8026b49a0217ffc0b4e89f381497 100644 (file)
@@ -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);