diff mbox series

[1/3] cifs: Fix FALLOC_FL_ZERO_RANGE by setting i_size if EOF moved

Message ID 20231129165619.2339490-2-dhowells@redhat.com (mailing list archive)
State New
Headers show
Series cifs: Fixes for copy_file_range() and FALLOC_FL_INSERT/ZERO_RANGE | expand

Commit Message

David Howells Nov. 29, 2023, 4:56 p.m. UTC
Fix the cifs filesystem implementations of FALLOC_FL_ZERO_RANGE, in
smb3_zero_range(), to set i_size after extending the file on the server.

Fixes: 72c419d9b073 ("cifs: fix smb3_zero_range so it can expand the file-size when required")
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Steve French <sfrench@samba.org>
cc: Paulo Alcantara <pc@manguebit.com>
cc: Shyam Prasad N <nspmangalore@gmail.com>
cc: Rohith Surabattula <rohiths.msft@gmail.com>
cc: Jeff Layton <jlayton@kernel.org>
cc: linux-cifs@vger.kernel.org
cc: linux-mm@kvack.org
---
 fs/smb/client/smb2ops.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Comments

Paulo Alcantara Nov. 29, 2023, 10:19 p.m. UTC | #1
David Howells <dhowells@redhat.com> writes:

> @@ -3307,6 +3307,7 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
>  	struct inode *inode = file_inode(file);
>  	struct cifsInodeInfo *cifsi = CIFS_I(inode);
>  	struct cifsFileInfo *cfile = file->private_data;
> +	unsigned long long new_size;
>  	long rc;
>  	unsigned int xid;
>  	__le64 eof;
> @@ -3337,10 +3338,15 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
>  	/*
>  	 * do we also need to change the size of the file?
>  	 */

Perhaps remove the comment above as we're now updating the inode size?

> -	if (keep_size == false && i_size_read(inode) < offset + len) {
> -		eof = cpu_to_le64(offset + len);
> +	new_size = offset + len;
> +	if (keep_size == false && (unsigned long long)i_size_read(inode) < new_size) {
> +		eof = cpu_to_le64(new_size);
>  		rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
>  				  cfile->fid.volatile_fid, cfile->pid, &eof);
> +		if (rc >= 0) {
> +			truncate_setsize(inode, new_size);
> +			fscache_resize_cookie(cifs_inode_cookie(inode), new_size);
> +		}
>  	}
>  
>   zero_range_exit:

Looks good,

Acked-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
diff mbox series

Patch

diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c
index a959ed2c9b22..572d2c22a703 100644
--- a/fs/smb/client/smb2ops.c
+++ b/fs/smb/client/smb2ops.c
@@ -3307,6 +3307,7 @@  static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
 	struct inode *inode = file_inode(file);
 	struct cifsInodeInfo *cifsi = CIFS_I(inode);
 	struct cifsFileInfo *cfile = file->private_data;
+	unsigned long long new_size;
 	long rc;
 	unsigned int xid;
 	__le64 eof;
@@ -3337,10 +3338,15 @@  static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
 	/*
 	 * do we also need to change the size of the file?
 	 */
-	if (keep_size == false && i_size_read(inode) < offset + len) {
-		eof = cpu_to_le64(offset + len);
+	new_size = offset + len;
+	if (keep_size == false && (unsigned long long)i_size_read(inode) < new_size) {
+		eof = cpu_to_le64(new_size);
 		rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
 				  cfile->fid.volatile_fid, cfile->pid, &eof);
+		if (rc >= 0) {
+			truncate_setsize(inode, new_size);
+			fscache_resize_cookie(cifs_inode_cookie(inode), new_size);
+		}
 	}
 
  zero_range_exit: