From f6ee8ee580305bf70cc50164cdd11702b243f6be Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 1 Apr 2009 14:57:34 -0700 Subject: [PATCH] kclient: caps bug fixes, less verbose --- src/kernel/caps.c | 32 ++++++++++++++++++++++++++------ src/kernel/debugfs.c | 4 ++-- src/kernel/mds_client.c | 4 ++-- src/kernel/super.c | 9 +++++---- src/kernel/super.h | 1 + 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/kernel/caps.c b/src/kernel/caps.c index 66bf49235448e..99f4aff62c0e4 100644 --- a/src/kernel/caps.c +++ b/src/kernel/caps.c @@ -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; icount = 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) diff --git a/src/kernel/debugfs.c b/src/kernel/debugfs.c index 0d95dc2a93665..10a892bc39ac8 100644 --- a/src/kernel/debugfs.c +++ b/src/kernel/debugfs.c @@ -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; diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 9db75e820c8a3..b9a2641894318 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -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: diff --git a/src/kernel/super.c b/src/kernel/super.c index 3e0e9302267b0..5f31862f99855 100644 --- a/src/kernel/super.c +++ b/src/kernel/super.c @@ -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 diff --git a/src/kernel/super.h b/src/kernel/super.h index 17632e3c67d25..d9e46a12ef622 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -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); -- 2.39.5