mirror of https://gitee.com/openkylin/linux.git
cifs: copy_file_range needs to strip setuid bits and update timestamps
cifs has both source and destination inodes locked throughout the copy. Like ->write_iter(), we update mtime and strip setuid bits of destination file before copy and like ->read_iter(), we update atime of source file after copy. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
7e5a70ad88
commit
bf3c90ee1e
|
@ -1104,6 +1104,10 @@ ssize_t cifs_file_copychunk_range(unsigned int xid,
|
|||
goto out;
|
||||
}
|
||||
|
||||
rc = -EOPNOTSUPP;
|
||||
if (!target_tcon->ses->server->ops->copychunk_range)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Note: cifs case is easier than btrfs since server responsible for
|
||||
* checks for proper open modes and file type and if it wants
|
||||
|
@ -1115,11 +1119,12 @@ ssize_t cifs_file_copychunk_range(unsigned int xid,
|
|||
/* should we flush first and last page first */
|
||||
truncate_inode_pages(&target_inode->i_data, 0);
|
||||
|
||||
if (target_tcon->ses->server->ops->copychunk_range)
|
||||
rc = file_modified(dst_file);
|
||||
if (!rc)
|
||||
rc = target_tcon->ses->server->ops->copychunk_range(xid,
|
||||
smb_file_src, smb_file_target, off, len, destoff);
|
||||
else
|
||||
rc = -EOPNOTSUPP;
|
||||
|
||||
file_accessed(src_file);
|
||||
|
||||
/* force revalidate of size and timestamps of target file now
|
||||
* that target is updated on the server
|
||||
|
|
Loading…
Reference in New Issue