ksmbd: remove setattr preparations in set_file_basic_info()
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>
This commit is contained in:
parent
eb5784f0c6
commit
db7fb6fe3d
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user