]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: fix locking snafu in ESTALE handling
authorSage Weil <sage@newdream.net>
Tue, 4 Aug 2009 00:29:39 +0000 (17:29 -0700)
committerSage Weil <sage@newdream.net>
Tue, 4 Aug 2009 22:33:36 +0000 (15:33 -0700)
src/kernel/mds_client.c

index 10f8745f0928449b4d9f77bf7500d0eb89516609..9557d50a3e76cab21adbd2ad964d397c703a00c4 100644 (file)
@@ -370,7 +370,11 @@ static void unregister_session(struct ceph_mds_client *mdsc, int mds)
        mdsc->sessions[mds] = NULL;
 }
 
-/* drop session refs in request */
+/*
+ * drop session refs in request.
+ *
+ * should be last ref, or hold mdsc->mutex
+ */
 static void put_request_sessions(struct ceph_mds_request *req)
 {
        if (req->r_session) {
@@ -1724,9 +1728,12 @@ void ceph_mdsc_handle_reply(struct ceph_mds_client *mdsc, struct ceph_msg *msg)
                req->r_direct_mode = USE_AUTH_MDS;
                req->r_num_stale++;
                if (req->r_num_stale <= 2) {
+                       mutex_unlock(&req->r_session->s_mutex);
+                       mutex_lock(&mdsc->mutex);
                        put_request_sessions(req);
                        __do_request(mdsc, req);
-                       goto out_session_unlock;
+                       mutex_unlock(&mdsc->mutex);
+                       goto out;
                }
        } else {
                req->r_num_stale = 0;