Commit c3a72bb2 authored by David Howells's avatar David Howells Committed by Steve French
Browse files

smb3: Move the flush out of smb2_copychunk_range() into its callers



Move the flush out of smb2_copychunk_range() into its callers.  This will
allow the pagecache to be invalidated between the flush and the operation
in smb3_collapse_range() and smb3_insert_range().

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
cc: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent b90cb105
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1219,6 +1219,8 @@ ssize_t cifs_file_copychunk_range(unsigned int xid,

	cifs_dbg(FYI, "copychunk range\n");

	filemap_write_and_wait(src_inode->i_mapping);

	if (!src_file->private_data || !dst_file->private_data) {
		rc = -EBADF;
		cifs_dbg(VFS, "missing cifsFileInfo on copy range src file\n");
+8 −12
Original line number Diff line number Diff line
@@ -1600,17 +1600,8 @@ smb2_copychunk_range(const unsigned int xid,
	int chunks_copied = 0;
	bool chunk_sizes_updated = false;
	ssize_t bytes_written, total_bytes_written = 0;
	struct inode *inode;

	pcchunk = kmalloc(sizeof(struct copychunk_ioctl), GFP_KERNEL);

	/*
	 * We need to flush all unwritten data before we can send the
	 * copychunk ioctl to the server.
	 */
	inode = d_inode(trgtfile->dentry);
	filemap_write_and_wait(inode->i_mapping);

	if (pcchunk == NULL)
		return -ENOMEM;

@@ -3694,6 +3685,8 @@ static long smb3_collapse_range(struct file *file, struct cifs_tcon *tcon,
		goto out;
	}

	filemap_write_and_wait(inode->i_mapping);

	rc = smb2_copychunk_range(xid, cfile, cfile, off + len,
				  i_size_read(inode) - off - len, off);
	if (rc < 0)
@@ -3721,18 +3714,21 @@ static long smb3_insert_range(struct file *file, struct cifs_tcon *tcon,
	int rc;
	unsigned int xid;
	struct cifsFileInfo *cfile = file->private_data;
	struct inode *inode = file_inode(file);
	__le64 eof;
	__u64  count;

	xid = get_xid();

	if (off >= i_size_read(file->f_inode)) {
	if (off >= i_size_read(inode)) {
		rc = -EINVAL;
		goto out;
	}

	count = i_size_read(file->f_inode) - off;
	eof = cpu_to_le64(i_size_read(file->f_inode) + len);
	count = i_size_read(inode) - off;
	eof = cpu_to_le64(i_size_read(inode) + len);

	filemap_write_and_wait(inode->i_mapping);

	rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
			  cfile->fid.volatile_fid, cfile->pid, &eof);