Skip to content

Commit

Permalink
cifs: copy_file_range needs to strip setuid bits and update timestamps
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Steve French <[email protected]>
  • Loading branch information
amir73il authored and Steve French committed Jul 18, 2019
1 parent 7e5a70a commit bf3c90e
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions fs/cifs/cifsfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit bf3c90e

Please sign in to comment.