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

Commit eb65b919 authored by Yan, Zheng's avatar Yan, Zheng Committed by Ilya Dryomov
Browse files

ceph: avoid updating mds_wanted too frequently



user space may open/close single file frequently. It's not good
to send a clientcaps message to mds for each open/close syscall.

Signed-off-by: default avatarYan, Zheng <zyan@redhat.com>
parent 7c94ba27
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -1184,6 +1184,13 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
		delayed = 1;
	}
	ci->i_ceph_flags &= ~(CEPH_I_NODELAY | CEPH_I_FLUSH);
	if (want & ~cap->mds_wanted) {
		/* user space may open/close single file frequently.
		 * This avoids droping mds_wanted immediately after
		 * requesting new mds_wanted.
		 */
		__cap_set_timeouts(mdsc, ci);
	}

	cap->issued &= retain;  /* drop bits we don't want */
	if (cap->implemented & ~cap->issued) {
@@ -2485,15 +2492,14 @@ static int try_get_cap_refs(struct ceph_inode_info *ci, int need, int want,
				goto out_unlock;
			}
			mds_wanted = __ceph_caps_mds_wanted(ci);
			if ((mds_wanted & need) != need) {
			if (need & ~(mds_wanted & need)) {
				dout("get_cap_refs %p caps were dropped"
				     " (session killed?)\n", inode);
				*err = -ESTALE;
				ret = 1;
				goto out_unlock;
			}
			if ((mds_wanted & file_wanted) ==
			    (file_wanted & (CEPH_CAP_FILE_RD|CEPH_CAP_FILE_WR)))
			if (!(file_wanted & ~mds_wanted))
				ci->i_ceph_flags &= ~CEPH_I_CAP_DROPPED;
		}