]> granicus.if.org Git - zfs/commitdiff
Simplify time handling logic in zfs_settattr
authorNikolay Borisov <n.borisov.lkml@gmail.com>
Mon, 12 Sep 2016 19:35:56 +0000 (22:35 +0300)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 13 Sep 2016 19:00:18 +0000 (12:00 -0700)
Simplify time handling in zfs_setattr by mimicking the logic in
setattr_copy from the linux kernel. In order to achieve this
in the case when ZFS' log is being replayed it is necessary
to unconditionally set the ctime in zfs_replay_setattr.

Also use the timespec_trunc function when assigning values to the
generic inode struct. This is currently a noop since zfs sets
s_time_gran to 1, however in the future rules about precision might
change.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Chunwei Chen <david.chen@osnexus.com>
Signed-off-by: Nikolay Borisov <n.borisov.lkml@gmail.com>
Closes #4916

module/zfs/zfs_replay.c
module/zfs/zfs_vnops.c
module/zfs/zpl_inode.c

index 54c17543727c2394178985441b225c4794da51b6..b631ba65b96c76287bd22345df7a26d8e00a8b57 100644 (file)
@@ -805,6 +805,8 @@ zfs_replay_setattr(zfs_sb_t *zsb, lr_setattr_t *lr, boolean_t byteswap)
        vap->va_size = lr->lr_size;
        ZFS_TIME_DECODE(&vap->va_atime, lr->lr_atime);
        ZFS_TIME_DECODE(&vap->va_mtime, lr->lr_mtime);
+       gethrestime(&vap->va_ctime);
+       vap->va_mask |= ATTR_CTIME;
 
        /*
         * Fill in xvattr_t portions if necessary.
index 82016af750497f6defcdccd0a0cb4596d403c3ae..405b37c1925d6e555b9365ea9aa9794e199bf45d 100644 (file)
@@ -3001,7 +3001,6 @@ top:
                aclp = NULL;
        }
 
-
        if ((mask & ATTR_ATIME) || zp->z_atime_dirty) {
                zp->z_atime_dirty = 0;
                ZFS_TIME_ENCODE(&ip->i_atime, atime);
@@ -3011,29 +3010,27 @@ top:
 
        if (mask & ATTR_MTIME) {
                ZFS_TIME_ENCODE(&vap->va_mtime, mtime);
+               ZTOI(zp)->i_mtime = timespec_trunc(vap->va_mtime,
+                   ZTOI(zp)->i_sb->s_time_gran);
+
                SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zsb), NULL,
                    mtime, sizeof (mtime));
        }
 
-       /* XXX - shouldn't this be done *before* the ATIME/MTIME checks? */
-       if (mask & ATTR_SIZE && !(mask & ATTR_MTIME)) {
-               SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zsb),
-                   NULL, mtime, sizeof (mtime));
+       if (mask & ATTR_CTIME) {
+               ZFS_TIME_ENCODE(&vap->va_ctime, ctime);
+               ZTOI(zp)->i_ctime = timespec_trunc(vap->va_ctime,
+                   ZTOI(zp)->i_sb->s_time_gran);
                SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), NULL,
-                   &ctime, sizeof (ctime));
-               zfs_tstamp_update_setup(zp, CONTENT_MODIFIED, mtime, ctime);
-       } else if (mask != 0) {
-               SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), NULL,
-                   &ctime, sizeof (ctime));
-               zfs_tstamp_update_setup(zp, STATE_CHANGED, mtime, ctime);
-               if (attrzp) {
-                       SA_ADD_BULK_ATTR(xattr_bulk, xattr_count,
-                           SA_ZPL_CTIME(zsb), NULL,
-                           &ctime, sizeof (ctime));
-                       zfs_tstamp_update_setup(attrzp, STATE_CHANGED,
-                           mtime, ctime);
-               }
+                   ctime, sizeof (ctime));
        }
+
+       if (attrzp && mask) {
+               SA_ADD_BULK_ATTR(xattr_bulk, xattr_count,
+                   SA_ZPL_CTIME(zsb), NULL, &ctime,
+                   sizeof (ctime));
+       }
+
        /*
         * Do this after setting timestamps to prevent timestamp
         * update from toggling bit
index 8c75698e5881cd91c39fc5c5e95c9361c7dfdd93..010f0fd4e21ff5c3ebbe8b409f07941d5203e23c 100644 (file)
@@ -335,7 +335,8 @@ zpl_setattr(struct dentry *dentry, struct iattr *ia)
        vap->va_ctime = ia->ia_ctime;
 
        if (vap->va_mask & ATTR_ATIME)
-               ip->i_atime = ia->ia_atime;
+               ip->i_atime = timespec_trunc(ia->ia_atime,
+                               ip->i_sb->s_time_gran);
 
        cookie = spl_fstrans_mark();
        error = -zfs_setattr(ip, vap, 0, cr);