]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: avoid mds op if lease indicates utimes() is a no-op
authorSage Weil <sage@newdream.net>
Fri, 4 Apr 2008 20:20:40 +0000 (13:20 -0700)
committerSage Weil <sage@newdream.net>
Fri, 4 Apr 2008 20:20:40 +0000 (13:20 -0700)
src/TODO
src/kernel/inode.c

index 636cd590f9774dd144043367f2b1e6c8a0ac4ac2..e38089a577cc1b3bda38cad4dafe47f2729e3e49 100644 (file)
--- 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
index b5177f7bad4784a7886e5e53928d7067c40a3baf..212ca6f92304a23dc91136041c7969521c8393ef 100644 (file)
@@ -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;