aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/acl.c
diff options
context:
space:
mode:
authorChengguang Xu <cgxu519@gmx.com>2018-06-22 15:01:13 +0800
committerIlya Dryomov <idryomov@gmail.com>2018-08-02 21:26:11 +0200
commit93d35c754d97a57bda2a2c6c39dce9b67a9f3c99 (patch)
treeaf4dad338fa9df711bf864b89f4c15abdf16d516 /fs/ceph/acl.c
parentceph: add retry logic for error -ERANGE in ceph_get_acl() (diff)
downloadlinux-dev-93d35c754d97a57bda2a2c6c39dce9b67a9f3c99.tar.xz
linux-dev-93d35c754d97a57bda2a2c6c39dce9b67a9f3c99.zip
ceph: restore ctime as well in the case of restoring old mode
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>
Diffstat (limited to 'fs/ceph/acl.c')
-rw-r--r--fs/ceph/acl.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
index eb9d567c9ef8..3351ea14390b 100644
--- a/fs/ceph/acl.c
+++ b/fs/ceph/acl.c
@@ -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;