summaryrefslogtreecommitdiffstats
path: root/fs/ceph/super.c
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-02-17 19:02:43 +0100
committerSage Weil <sage@newdream.net>2010-02-17 19:02:43 +0100
commit85ccce43a3fc15a40ded6ae1603e3f68a17f4d24 (patch)
tree1e15fb7dc7df43da4a3feacff671c8169e96291d /fs/ceph/super.c
parentceph: fix authentication races, auth_none oops (diff)
downloadlinux-85ccce43a3fc15a40ded6ae1603e3f68a17f4d24.tar.xz
linux-85ccce43a3fc15a40ded6ae1603e3f68a17f4d24.zip
ceph: clean up readdir caps reservation
Use a global counter for the minimum number of allocated caps instead of hard coding a check against readdir_max. This takes into account multiple client instances, and avoids examining the superblock mount options when a cap is dropped. Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/super.c')
-rw-r--r--fs/ceph/super.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index 39aaf29a04a0..74953be75f8f 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -578,6 +578,9 @@ static struct ceph_client *ceph_create_client(struct ceph_mount_args *args)
if (!client->wb_pagevec_pool)
goto fail_trunc_wq;
+ /* caps */
+ client->min_caps = args->max_readdir;
+ ceph_adjust_min_caps(client->min_caps);
/* subsystems */
err = ceph_monc_init(&client->monc, client);
@@ -619,6 +622,8 @@ static void ceph_destroy_client(struct ceph_client *client)
ceph_monc_stop(&client->monc);
ceph_osdc_stop(&client->osdc);
+ ceph_adjust_min_caps(-client->min_caps);
+
ceph_debugfs_client_cleanup(client);
destroy_workqueue(client->wb_wq);
destroy_workqueue(client->pg_inv_wq);