Commit 979abfdd authored by Yan, Zheng's avatar Yan, Zheng

ceph: fix trim caps

- don't trim auth cap if there are flusing caps
- don't trim auth cap if any 'write' cap is wanted
- allow trimming non-auth cap even if the inode is dirty
Signed-off-by: default avatarYan, Zheng <zheng.z.yan@intel.com>
parent 9563f88c
...@@ -1214,7 +1214,7 @@ static int trim_caps_cb(struct inode *inode, struct ceph_cap *cap, void *arg) ...@@ -1214,7 +1214,7 @@ static int trim_caps_cb(struct inode *inode, struct ceph_cap *cap, void *arg)
{ {
struct ceph_mds_session *session = arg; struct ceph_mds_session *session = arg;
struct ceph_inode_info *ci = ceph_inode(inode); struct ceph_inode_info *ci = ceph_inode(inode);
int used, oissued, mine; int used, wanted, oissued, mine;
if (session->s_trim_caps <= 0) if (session->s_trim_caps <= 0)
return -1; return -1;
...@@ -1222,14 +1222,19 @@ static int trim_caps_cb(struct inode *inode, struct ceph_cap *cap, void *arg) ...@@ -1222,14 +1222,19 @@ static int trim_caps_cb(struct inode *inode, struct ceph_cap *cap, void *arg)
spin_lock(&ci->i_ceph_lock); spin_lock(&ci->i_ceph_lock);
mine = cap->issued | cap->implemented; mine = cap->issued | cap->implemented;
used = __ceph_caps_used(ci); used = __ceph_caps_used(ci);
wanted = __ceph_caps_file_wanted(ci);
oissued = __ceph_caps_issued_other(ci, cap); oissued = __ceph_caps_issued_other(ci, cap);
dout("trim_caps_cb %p cap %p mine %s oissued %s used %s\n", dout("trim_caps_cb %p cap %p mine %s oissued %s used %s wanted %s\n",
inode, cap, ceph_cap_string(mine), ceph_cap_string(oissued), inode, cap, ceph_cap_string(mine), ceph_cap_string(oissued),
ceph_cap_string(used)); ceph_cap_string(used), ceph_cap_string(wanted));
if (ci->i_dirty_caps) if (cap == ci->i_auth_cap) {
goto out; /* dirty caps */ if (ci->i_dirty_caps | ci->i_flushing_caps)
if ((used & ~oissued) & mine) goto out;
if ((used | wanted) & CEPH_CAP_ANY_WR)
goto out;
}
if ((used | wanted) & ~oissued & mine)
goto out; /* we need these caps */ goto out; /* we need these caps */
session->s_trim_caps--; session->s_trim_caps--;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment