]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: fix caps reservation cleanup
authorYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 1 Apr 2009 22:06:45 +0000 (15:06 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 1 Apr 2009 22:06:45 +0000 (15:06 -0700)
src/kernel/caps.c
src/kernel/super.c
src/kernel/super.h

index 99f4aff62c0e40820dfcb51fcb00e03a77470996..307440c5ee15616b6c81ea536942a9b2cc65d520 100644 (file)
@@ -1982,6 +1982,21 @@ void ceph_caps_init(void)
        caps_use_count = 0;
 }
 
+void ceph_caps_finalize(void)
+{
+       struct ceph_cap *cap;
+       spin_lock(&caps_list_lock);
+        while (!list_empty(&caps_list)) {
+               cap = list_first_entry(&caps_list, struct ceph_cap, caps_item);
+               list_del(&cap->caps_item);
+               kmem_cache_free(ceph_cap_cachep, cap);
+       }
+       caps_count = 0;
+       caps_use_count = 0;
+       caps_reserve_count = 0;
+       spin_unlock(&caps_list_lock);
+}
+
 int ceph_reserve_caps(struct ceph_caps_reservation *ctx, int need)
 {
        int i;
index 5f31862f99855e57c363a3bbefe77e7ca5f09feb..67e7367e9e0d3f7a914f29bc9e10246f5dec9ee6 100644 (file)
@@ -1192,6 +1192,7 @@ static void __exit exit_ceph(void)
 {
        dout(1, "exit_ceph\n");
        unregister_filesystem(&ceph_fs_type);
+       ceph_caps_finalize();
        destroy_caches();
        ceph_msgr_exit();
        ceph_debugfs_cleanup();
index d9e46a12ef62215ff59f117f08418a3dcc27d6c4..85aba62b256a2e3915377d794f2b190ee8f8058b 100644 (file)
@@ -513,6 +513,7 @@ static inline int __ceph_caps_wanted(struct ceph_inode_info *ci)
 extern int __ceph_caps_mds_wanted(struct ceph_inode_info *ci);
 
 extern void ceph_caps_init(void);
+extern void ceph_caps_finalize(void);
 extern int ceph_reserve_caps(struct ceph_caps_reservation *ctx, int need);
 extern int ceph_unreserve_caps(struct ceph_caps_reservation *ctx);
 extern struct ceph_cap *ceph_get_cap(struct ceph_caps_reservation *ctx, int mode);