]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: caps bug fixes, less verbose
authorYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 1 Apr 2009 21:57:34 +0000 (14:57 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 1 Apr 2009 21:57:34 +0000 (14:57 -0700)
src/kernel/caps.c
src/kernel/debugfs.c
src/kernel/mds_client.c
src/kernel/super.c
src/kernel/super.h

index 66bf49235448e202de511f9e9f30e642898c6a8c..99f4aff62c0e40820dfcb51fcb00e03a77470996 100644 (file)
@@ -1974,7 +1974,7 @@ void ceph_put_fmode(struct ceph_inode_info *ci, int fmode)
                ceph_check_caps(ci, 0, 0, NULL);
 }
 
-void caps_init(void)
+void ceph_caps_init(void)
 {
        INIT_LIST_HEAD(&caps_list);
        spin_lock_init(&caps_list_lock);
@@ -1992,6 +1992,8 @@ int ceph_reserve_caps(struct ceph_caps_reservation *ctx, int need)
 
        alloc_count = need;
 
+       dout(30, "reserve caps, ctx=%p, need=%d\n", ctx, need);
+
        spin_lock(&caps_list_lock);
        /* how much can we actually use? */
        have = caps_count - caps_use_count - caps_reserve_count;
@@ -2007,7 +2009,7 @@ int ceph_reserve_caps(struct ceph_caps_reservation *ctx, int need)
 
        /* no need to allocate anything, exit */
        if (alloc_count == 0)
-               return 0;
+               goto out_success;
 
        for (i=0; i<alloc_count; i++) {
                cap = kmem_cache_alloc(ceph_cap_cachep, GFP_NOFS);
@@ -2024,7 +2026,10 @@ int ceph_reserve_caps(struct ceph_caps_reservation *ctx, int need)
                reserved++;
        }
 
+out_success:
        ctx->count = need;
+       dout(30, "reserve caps, ctx=%p, total=%d reserved=%d used=%d\n",
+               ctx, caps_count, caps_reserve_count, caps_use_count);
 
        return 0;
 out_alloc_count:
@@ -2038,10 +2043,16 @@ out_alloc_count:
 
 int ceph_unreserve_caps(struct ceph_caps_reservation *ctx)
 {
-       spin_lock(&caps_list_lock);
-       caps_reserve_count -= min(caps_reserve_count, ctx->count);
-       ctx->count = 0;
-       spin_unlock(&caps_list_lock);
+       if (ctx->count) {
+               spin_lock(&caps_list_lock);
+               caps_reserve_count -= min(caps_reserve_count, ctx->count);
+               dout(30, "unreserve caps ctx=%p, ctx->count=%d\n", ctx, ctx->count);
+               ctx->count = 0;
+               spin_unlock(&caps_list_lock);
+
+               dout(30, "unreserve caps, total=%d reserved=%d used=%d\n",
+                       caps_count, caps_reserve_count, caps_use_count);
+       }
 
        return 0;
 }
@@ -2050,6 +2061,9 @@ struct ceph_cap *ceph_get_cap(struct ceph_caps_reservation *ctx, int mode)
 {
        struct ceph_cap *cap = NULL;
 
+       dout(30, "get_cap ctx=%p, total=%d reserved=%d used=%d\n",
+               ctx, caps_count, caps_reserve_count, caps_use_count);
+
        spin_lock(&caps_list_lock);
 
        if (ctx) {
@@ -2072,6 +2086,8 @@ out_unlock:
        if (!ctx) {
                cap = kmem_cache_alloc(ceph_cap_cachep, mode);
        }
+       dout(30, "get_cap caps (exit) ctx=%p, total=%d reserved=%d used=%d\n",
+               ctx, caps_count, caps_reserve_count, caps_use_count);
        return cap;
 }
 
@@ -2082,11 +2098,15 @@ struct ceph_cap *ceph_get_reserved_cap(struct ceph_caps_reservation *ctx)
 
 void ceph_put_cap(struct ceph_cap *cap)
 {
+       dout(30, "put_cap caps, total=%d reserved=%d used=%d\n",
+               caps_count, caps_reserve_count, caps_use_count);
        spin_lock(&caps_list_lock);
        caps_count++;
        caps_use_count--;
        list_add(&cap->caps_item, &caps_list);
        spin_unlock(&caps_list_lock);
+       dout(30, "put_cap(exit) caps, total=%d reserved=%d used=%d\n",
+               caps_count, caps_reserve_count, caps_use_count);
 }
 
 void ceph_reservation_status(int *total, int *used, int *reserved)
index 0d95dc2a93665b6b46fcc80d0594842430721a95..10a892bc39ac8897298f61c2ee6762b3373734e5 100644 (file)
@@ -374,8 +374,8 @@ static int caps_reservation_show(struct seq_file *s, void *p)
 
        ceph_reservation_status(&total, &used, &reserved);
 
-       seq_printf(s, "total\t%d\n"
-                     "used\t%d\n"
+       seq_printf(s, "total\t\t%d\n"
+                     "used\t\t%d\n"
                      "reserved\t%d\n",
                      total, used, reserved);
        return 0;
index 9db75e820c8a31268bf1e3cdfebc293b26cf4ce5..b9a2641894318cae101f368a347bfea5b5987e8d 100644 (file)
@@ -381,6 +381,7 @@ void ceph_mdsc_put_request(struct ceph_mds_request *req)
                        dput(req->r_old_dentry);
                }
                put_request_sessions(req);
+               ceph_unreserve_caps(&req->r_caps_reservation);
                kfree(req);
        }
 }
@@ -440,8 +441,6 @@ static void __unregister_request(struct ceph_mds_client *mdsc,
                list_del_init(&req->r_unsafe_dir_item);
                spin_unlock(&ci->i_unsafe_lock);
        }
-
-       ceph_unreserve_caps(&req->r_caps_reservation);
 }
 
 static bool __have_session(struct ceph_mds_client *mdsc, int mds)
@@ -1464,6 +1463,7 @@ void ceph_mdsc_handle_reply(struct ceph_mds_client *mdsc, struct ceph_msg *msg)
                        ceph_readdir_prepopulate(req, req->r_session);
        }
 
+       ceph_unreserve_caps(&req->r_caps_reservation);
        add_cap_releases(mdsc, req->r_session, -1);
 
 done:
index 3e0e9302267b072fe4f5a525951a3f76596bf7b6..5f31862f99855e57c363a3bbefe77e7ca5f09feb 100644 (file)
@@ -183,7 +183,7 @@ static int init_caches(void)
        return 0;
 }
 
-static void destroy_inodecache(void)
+static void destroy_caches(void)
 {
        kmem_cache_destroy(ceph_inode_cachep);
        kmem_cache_destroy(ceph_cap_cachep);
@@ -1159,7 +1159,6 @@ static int __init init_ceph(void)
 #ifdef CONFIG_CEPH_BOOKKEEPER
        ceph_bookkeeper_init();
 #endif
-
        ret = ceph_debugfs_init();
        if (ret < 0)
                goto out;
@@ -1172,13 +1171,15 @@ static int __init init_ceph(void)
        if (ret)
                goto out_msgr;
 
+       ceph_caps_init();
+
        ret = register_filesystem(&ceph_fs_type);
        if (ret)
                goto out_icache;
        return 0;
 
 out_icache:
-       destroy_inodecache();
+       destroy_caches();
 out_msgr:
        ceph_msgr_exit();
 out_debugfs:
@@ -1191,7 +1192,7 @@ static void __exit exit_ceph(void)
 {
        dout(1, "exit_ceph\n");
        unregister_filesystem(&ceph_fs_type);
-       destroy_inodecache();
+       destroy_caches();
        ceph_msgr_exit();
        ceph_debugfs_cleanup();
 #ifdef CONFIG_CEPH_BOOKKEEPER
index 17632e3c67d258f4996bb562a46cec1ea3986c27..d9e46a12ef62215ff59f117f08418a3dcc27d6c4 100644 (file)
@@ -512,6 +512,7 @@ static inline int __ceph_caps_wanted(struct ceph_inode_info *ci)
 /* what the mds thinks we want */
 extern int __ceph_caps_mds_wanted(struct ceph_inode_info *ci);
 
+extern void ceph_caps_init(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);