From 9a3988e4f7ed6e0c6f41a62037c55cf0c3025f4d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 31 Dec 2008 11:19:38 -0800 Subject: [PATCH] kclient: setattr on inode (not path) if holding WR cap For newly created files, this avoids contention in the MDS over the dentry xlock (e.g., for an untar). It is slightly risky, because we could race with a caps release and MDS cache trim. Pretty unlikely, however, because cap release would also involve MDS journaling. --- src/kernel/inode.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 6a7d36e2bed8f..faf01bfa3a102 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -1415,8 +1415,10 @@ static struct ceph_mds_request *prepare_setattr(struct ceph_mds_client *mdsc, int pathlen; struct ceph_mds_request *req; u64 pathbase; + int issued = ceph_caps_issued(ceph_inode(dentry->d_inode)); - if (ia_valid & ATTR_FILE) { + if ((ia_valid & ATTR_FILE) || + (issued & (CEPH_CAP_WR|CEPH_CAP_WRBUFFER))) { dout(5, "prepare_setattr dentry %p (inode %llx.%llx)\n", dentry, ceph_vinop(dentry->d_inode)); req = ceph_mdsc_create_request(mdsc, op, -- 2.39.5