]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: drop leases before kill_anon_super
authorSage Weil <sage@newdream.net>
Mon, 28 Apr 2008 17:54:37 +0000 (10:54 -0700)
committerSage Weil <sage@newdream.net>
Mon, 28 Apr 2008 17:54:37 +0000 (10:54 -0700)
src/kernel/mds_client.c
src/kernel/mds_client.h
src/kernel/super.c

index d177bf7f1b23d2220fad016581224019f921d367..53526957130c8ae4c2705de6f94e67d1257d111d 100644 (file)
@@ -848,6 +848,24 @@ bad:
 }
 
 
+/*
+ * drop all leases (and dentry refs) in preparation for umount
+ */
+void ceph_mdsc_drop_leases(struct ceph_mds_client *mdsc)
+{
+       int i;
+       
+       spin_lock(&mdsc->lock);
+       for (i = 0; i < mdsc->max_sessions; i++) {
+               struct ceph_mds_session *session = __get_session(mdsc, i);
+               if (!session)
+                       continue;
+               spin_unlock(&mdsc->lock);
+               remove_session_leases(session);
+               spin_lock(&mdsc->lock);
+       }
+       spin_unlock(&mdsc->lock);
+}
 
 
 /* exported functions */
index 63ec1f5786e7cc902aa39850938bb08432f6c0e7..a865aa35fbf546be67432ef1ee3ab1a828f638d9 100644 (file)
@@ -145,5 +145,6 @@ extern int __ceph_mdsc_send_cap(struct ceph_mds_client *mdsc,
                                struct ceph_mds_session *session,
                                struct ceph_inode_cap *cap,
                                int used, int wanted, int cancel_work);
+extern void ceph_mdsc_drop_leases(struct ceph_mds_client *mdsc);
 
 #endif
index 3cb58972150871fc83809fe8709b57f1660a59e9..cf4111beb66d593cc3256aa290efe4bc5a3c6d52 100644 (file)
@@ -535,6 +535,7 @@ static void ceph_kill_sb(struct super_block *s)
 {
        struct ceph_client *client = ceph_sb_to_client(s);
        dout(1, "kill_sb %p\n", s);
+       ceph_mdsc_drop_leases(&client->mdsc);
        kill_anon_super(s);    /* will call put_super after sb is r/o */
        ceph_destroy_client(client);
 }