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: Yan, Zheng <zheng.z.yan@intel.com>
This commit is contained in:
parent
9563f88c1f
commit
979abfdd5c
1 changed files with 11 additions and 6 deletions
|
@ -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)
|
||||||
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--;
|
||||||
|
|
Loading…
Add table
Reference in a new issue