ksmbd: remove setattr preparations in set_file_basic_info()
authorChristian Brauner <christian.brauner@ubuntu.com>
Thu, 26 Aug 2021 01:07:05 +0000 (10:07 +0900)
committerSteve French <stfrench@microsoft.com>
Sat, 4 Sep 2021 04:29:45 +0000 (23:29 -0500)
Permission checking and copying over ownership information is the task
of the underlying filesystem not ksmbd. The order is also wrong here.
This modifies the inode before notify_change(). If notify_change() fails
this will have changed ownership nonetheless. All of this is unnecessary
though since the underlying filesystem's ->setattr handler will do all
this (if required) by itself.

Cc: Steve French <stfrench@microsoft.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Namjae Jeon <namjae.jeon@samsung.com>
Cc: Hyunchul Lee <hyc.lee@gmail.com>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: linux-cifs@vger.kernel.org
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/ksmbd/smb2pdu.c

index 1148e52..e2224b9 100644 (file)
@@ -5440,7 +5440,7 @@ static int set_file_basic_info(struct ksmbd_file *fp, char *buf,
 {
        struct smb2_file_all_info *file_info;
        struct iattr attrs;
-       struct iattr temp_attrs;
+       struct timespec64 ctime;
        struct file *filp;
        struct inode *inode;
        struct user_namespace *user_ns;
@@ -5464,11 +5464,11 @@ static int set_file_basic_info(struct ksmbd_file *fp, char *buf,
        }
 
        if (file_info->ChangeTime) {
-               temp_attrs.ia_ctime = ksmbd_NTtimeToUnix(file_info->ChangeTime);
-               attrs.ia_ctime = temp_attrs.ia_ctime;
+               attrs.ia_ctime = ksmbd_NTtimeToUnix(file_info->ChangeTime);
+               ctime = attrs.ia_ctime;
                attrs.ia_valid |= ATTR_CTIME;
        } else {
-               temp_attrs.ia_ctime = inode->i_ctime;
+               ctime = inode->i_ctime;
        }
 
        if (file_info->LastWriteTime) {
@@ -5507,13 +5507,6 @@ static int set_file_basic_info(struct ksmbd_file *fp, char *buf,
                rc = 0;
        }
 
-       /*
-        * HACK : set ctime here to avoid ctime changed
-        * when file_info->ChangeTime is zero.
-        */
-       attrs.ia_ctime = temp_attrs.ia_ctime;
-       attrs.ia_valid |= ATTR_CTIME;
-
        if (attrs.ia_valid) {
                struct dentry *dentry = filp->f_path.dentry;
                struct inode *inode = d_inode(dentry);
@@ -5521,14 +5514,12 @@ static int set_file_basic_info(struct ksmbd_file *fp, char *buf,
                if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
                        return -EACCES;
 
-               rc = setattr_prepare(user_ns, dentry, &attrs);
-               if (rc)
-                       return -EINVAL;
-
                inode_lock(inode);
-               setattr_copy(user_ns, inode, &attrs);
-               attrs.ia_valid &= ~ATTR_CTIME;
                rc = notify_change(user_ns, dentry, &attrs, NULL);
+               if (!rc) {
+                       inode->i_ctime = ctime;
+                       mark_inode_dirty(inode);
+               }
                inode_unlock(inode);
        }
        return rc;