diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-07-06 17:15:15 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-07-06 17:15:15 -0700 |
| commit | 1cc9629402b1eba0d4e21b2cc43eec9bd737f9bd (patch) | |
| tree | 6bd52203d0d071acd3311d5093b4aa61c313faad /fs/ceph/caps.c | |
| parent | 8b8ce8810b092cef35e15af6577ad569f6145c0a (diff) | |
| parent | 153a10939ea6e42e9c0115b0645060d0d7bb4697 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client:
ceph: fix crush device 'out' threshold to 1.0, not 0.1
ceph: fix caps usage accounting for import (non-reserved) case
ceph: only release clean, unused caps with mds requests
ceph: fix crush CHOOSE_LEAF when type is already a leaf
ceph: fix crush recursion
ceph: fix caps debugfs entry
ceph: delay umount until all mds requests drop inode+dentry refs
ceph: handle splice_dentry/d_materialize_unique error in readdir_prepopulate
ceph: fix crush map update decoding
ceph: fix message memory leak, uninitialized variable
ceph: fix map handler error path
ceph: some endianity fixes
Diffstat (limited to 'fs/ceph/caps.c')
| -rw-r--r-- | fs/ceph/caps.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 619b61655ee5..74144d6389f0 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -244,8 +244,14 @@ static struct ceph_cap *get_cap(struct ceph_cap_reservation *ctx) struct ceph_cap *cap = NULL; /* temporary, until we do something about cap import/export */ - if (!ctx) - return kmem_cache_alloc(ceph_cap_cachep, GFP_NOFS); + if (!ctx) { + cap = kmem_cache_alloc(ceph_cap_cachep, GFP_NOFS); + if (cap) { + caps_use_count++; + caps_total_count++; + } + return cap; + } spin_lock(&caps_list_lock); dout("get_cap ctx=%p (%d) %d = %d used + %d resv + %d avail\n", @@ -2886,18 +2892,19 @@ int ceph_encode_inode_release(void **p, struct inode *inode, struct ceph_inode_info *ci = ceph_inode(inode); struct ceph_cap *cap; struct ceph_mds_request_release *rel = *p; + int used, dirty; int ret = 0; - int used = 0; spin_lock(&inode->i_lock); used = __ceph_caps_used(ci); + dirty = __ceph_caps_dirty(ci); - dout("encode_inode_release %p mds%d used %s drop %s unless %s\n", inode, - mds, ceph_cap_string(used), ceph_cap_string(drop), + dout("encode_inode_release %p mds%d used|dirty %s drop %s unless %s\n", + inode, mds, ceph_cap_string(used|dirty), ceph_cap_string(drop), ceph_cap_string(unless)); - /* only drop unused caps */ - drop &= ~used; + /* only drop unused, clean caps */ + drop &= ~(used | dirty); cap = __get_cap_for_mds(ci, mds); if (cap && __cap_is_valid(cap)) { |
