]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: clean out caps that don't reconnect
authorSage Weil <sage@newdream.net>
Tue, 7 Jul 2009 23:07:27 +0000 (16:07 -0700)
committerSage Weil <sage@newdream.net>
Wed, 8 Jul 2009 17:48:10 +0000 (10:48 -0700)
We still need some additional work to turn these into EBADF.

src/TODO
src/kernel/mds_client.c

index f8ad2530957e95dede2dd6ab8fc1134550e19dee..3b8cd45a7b18d55050ab73f1c7b4ec071a52ed97 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -78,6 +78,7 @@ repair
 - mds scrubbing
 
 kclient
+- return EBADF on files without caps
 - fix up mds selection, and ESTALE handling
 - make cap import/export efficient
 - simplify mds auth tracking?
index 5a3779ded0f9fe390512f8d0a1e084fdff61ba31..b58749d64f33e767f0b193467ccf587edc89caaa 100644 (file)
@@ -675,23 +675,32 @@ static void remove_session_caps(struct ceph_mds_session *session)
        cleanup_cap_releases(session);
 }
 
+/*
+ * wake up any threads waiting on this session's caps.  if the cap is
+ * old (didn't get renewed on the client reconnect), remove it now.
+ *
+ * caller must hold s_mutex.
+ */
 static int wake_up_session_cb(struct inode *inode, struct ceph_cap *cap,
-                              void *arg)
+                             void *arg)
 {
+       struct ceph_mds_session *session = arg;
+
        spin_lock(&inode->i_lock);
-       wake_up(&cap->ci->i_cap_wq);
+       if (cap->gen != session->s_cap_gen) {
+               dout(0, "failed to reconnect %p cap %p (gen %d < session %d)\n",
+                    inode, cap, cap->gen, session->s_cap_gen);
+               __ceph_remove_cap(cap, NULL);
+       }
+       wake_up(&ceph_inode(inode)->i_cap_wq);
        spin_unlock(&inode->i_lock);
        return 0;
 }
-/*
- * wake up any threads waiting on this session's caps
- *
- * caller must hold s_mutex.
- */
+
 static void wake_up_session_caps(struct ceph_mds_session *session)
 {
        dout(10, "wake_up_session_caps %p mds%d\n", session, session->s_mds);
-       iterate_session_caps(session, wake_up_session_cb, NULL);
+       iterate_session_caps(session, wake_up_session_cb, session);
 }
 
 /*