From: Sage Weil Date: Fri, 4 Apr 2008 20:20:40 +0000 (-0700) Subject: kclient: avoid mds op if lease indicates utimes() is a no-op X-Git-Tag: v0.3~239^2~85 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2af40a2c2562c2528c66fb3511cd4c4eb9d6b299;p=ceph.git kclient: avoid mds op if lease indicates utimes() is a no-op --- diff --git a/src/TODO b/src/TODO index 636cd590f97..e38089a577c 100644 --- a/src/TODO +++ b/src/TODO @@ -16,6 +16,9 @@ userspace client - reference count lease validations on path lookup? kernel client +- truncate + - do locally if EXCL + - helper that is called when mds does a truncate - setattr should check lease before believing something is a no-op - trim expired leases so we don't indefinitely hold dcache refs... - procfs/debugfs diff --git a/src/kernel/inode.c b/src/kernel/inode.c index b5177f7bad4..212ca6f9230 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -1119,17 +1119,20 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) } /* utimes */ - if (((ia_valid & ATTR_ATIME) && - !timespec_equal(&inode->i_atime, &attr->ia_atime)) || - ((ia_valid & ATTR_MTIME) && - !timespec_equal(&inode->i_mtime, &attr->ia_mtime))) { + if (ia_valid & (ATTR_ATIME|ATTR_MTIME)) { /* do i hold CAP_EXCL? */ if (__ceph_caps_issued(ci) & CEPH_CAP_EXCL) { - dout(10, "utime holding EXCL, doing nothing\n"); + dout(10, "utime holding EXCL, doing locally\n"); inode->i_atime = attr->ia_atime; inode->i_mtime = attr->ia_mtime; return 0; } + if (ceph_inode_lease_valid(inode, CEPH_LOCK_ICONTENT) && + !(((ia_valid & ATTR_MTIME) && + !timespec_equal(&inode->i_atime, &attr->ia_atime)) || + ((ia_valid & ATTR_MTIME) && + !timespec_equal(&inode->i_mtime, &attr->ia_mtime)))) + return 0; /* lease is valid, and this is a no-op */ req = prepare_setattr(mdsc, dentry, CEPH_MDS_OP_UTIME); if (IS_ERR(req)) return PTR_ERR(req); @@ -1150,10 +1153,12 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) dout(10, "truncate: ia_size %d i_size %d\n", (int)attr->ia_size, (int)inode->i_size); if (ia_valid & ATTR_FILE) - req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_TRUNCATE, - ceph_ino(dentry->d_inode), "", 0, 0); + req = ceph_mdsc_create_request(mdsc, + CEPH_MDS_OP_TRUNCATE, + ceph_ino(dentry->d_inode), "", 0, 0); else - req = prepare_setattr(mdsc, dentry, CEPH_MDS_OP_TRUNCATE); + req = prepare_setattr(mdsc, dentry, + CEPH_MDS_OP_TRUNCATE); if (IS_ERR(req)) return PTR_ERR(req); reqh = req->r_request->front.iov_base;