|
@@ -2886,18 +2886,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)) {
|