ceph: restore ctime as well in the case of restoring old mode
authorChengguang Xu <cgxu519@gmx.com>
Fri, 22 Jun 2018 07:01:13 +0000 (15:01 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Thu, 2 Aug 2018 19:26:11 +0000 (21:26 +0200)
It's better to restore ctime as well in the case of restoring old mode
in ceph_set_acl().

Signed-off-by: Chengguang Xu <cgxu519@gmx.com>
Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/acl.c

index eb9d567..3351ea1 100644 (file)
@@ -101,6 +101,7 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type)
        const char *name = NULL;
        char *value = NULL;
        struct iattr newattrs;
+       struct timespec64 old_ctime = inode->i_ctime;
        umode_t new_mode = inode->i_mode, old_mode = inode->i_mode;
 
        switch (type) {
@@ -145,7 +146,7 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type)
        if (new_mode != old_mode) {
                newattrs.ia_ctime = current_time(inode);
                newattrs.ia_mode = new_mode;
-               newattrs.ia_valid = ATTR_MODE;
+               newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
                ret = __ceph_setattr(inode, &newattrs);
                if (ret)
                        goto out_free;
@@ -154,8 +155,9 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type)
        ret = __ceph_setxattr(inode, name, value, size, 0);
        if (ret) {
                if (new_mode != old_mode) {
+                       newattrs.ia_ctime = old_ctime;
                        newattrs.ia_mode = old_mode;
-                       newattrs.ia_valid = ATTR_MODE;
+                       newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
                        __ceph_setattr(inode, &newattrs);
                }
                goto out_free;