Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+11 −6
Original line number Original line Diff line number Diff line
@@ -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--;