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);
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;
/* 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);
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:
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;
}
{
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) {
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;
}
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)