cifs: fix incorrect handling of smb2_set_sparse() return in smb3_simple_falloc
diff mbox series

Message ID 20190314140848.11476-1-lsahlber@redhat.com
State New
Headers show
Series
  • cifs: fix incorrect handling of smb2_set_sparse() return in smb3_simple_falloc
Related show

Commit Message

Ronnie Sahlberg March 14, 2019, 2:08 p.m. UTC
smb2_set_sparse does not return -errno, it returns a boolean where
true means success.
Change this to just ignore the return value just like the other callsites.

Additionally add code to handle the case where we must set the file sparse
and possibly also extending it.

Fixes xfstests: generic/236 generic/350 generic/420

Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
---
 fs/cifs/smb2ops.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

Comments

Steve French March 14, 2019, 3:56 p.m. UTC | #1
Merged into cifs-2.6.git fo-next and kicked off the buildbot with
current for-next

http://smb3-test-rhel-75.southcentralus.cloudapp.azure.com/#/builders/2/builds/162

On Thu, Mar 14, 2019 at 9:08 AM Ronnie Sahlberg <lsahlber@redhat.com> wrote:
>
> smb2_set_sparse does not return -errno, it returns a boolean where
> true means success.
> Change this to just ignore the return value just like the other callsites.
>
> Additionally add code to handle the case where we must set the file sparse
> and possibly also extending it.
>
> Fixes xfstests: generic/236 generic/350 generic/420
>
> Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
> Signed-off-by: Steve French <stfrench@microsoft.com>
> ---
>  fs/cifs/smb2ops.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
> index 32dde87feaa9..03814b9f113d 100644
> --- a/fs/cifs/smb2ops.c
> +++ b/fs/cifs/smb2ops.c
> @@ -2718,6 +2718,7 @@ static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon,
>         struct cifsFileInfo *cfile = file->private_data;
>         long rc = -EOPNOTSUPP;
>         unsigned int xid;
> +       __le64 eof;
>
>         xid = get_xid();
>
> @@ -2777,9 +2778,18 @@ static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon,
>                         return rc;
>                 }
>
> -               rc = smb2_set_sparse(xid, tcon, cfile, inode, false);
> +               smb2_set_sparse(xid, tcon, cfile, inode, false);
> +               rc = 0;
> +       } else {
> +               smb2_set_sparse(xid, tcon, cfile, inode, false);
> +               rc = 0;
> +               if (i_size_read(inode) < off + len) {
> +                       eof = cpu_to_le64(off + len);
> +                       rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
> +                                         cfile->fid.volatile_fid, cfile->pid,
> +                                         &eof);
> +               }
>         }
> -       /* BB: else ... in future add code to extend file and set sparse */
>
>         if (rc)
>                 trace_smb3_falloc_err(xid, cfile->fid.persistent_fid, tcon->tid,
> --
> 2.13.6
>

Patch
diff mbox series

diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index 32dde87feaa9..03814b9f113d 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -2718,6 +2718,7 @@  static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon,
 	struct cifsFileInfo *cfile = file->private_data;
 	long rc = -EOPNOTSUPP;
 	unsigned int xid;
+	__le64 eof;
 
 	xid = get_xid();
 
@@ -2777,9 +2778,18 @@  static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon,
 			return rc;
 		}
 
-		rc = smb2_set_sparse(xid, tcon, cfile, inode, false);
+		smb2_set_sparse(xid, tcon, cfile, inode, false);
+		rc = 0;
+	} else {
+		smb2_set_sparse(xid, tcon, cfile, inode, false);
+		rc = 0;
+		if (i_size_read(inode) < off + len) {
+			eof = cpu_to_le64(off + len);
+			rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
+					  cfile->fid.volatile_fid, cfile->pid,
+					  &eof);
+		}
 	}
-	/* BB: else ... in future add code to extend file and set sparse */
 
 	if (rc)
 		trace_smb3_falloc_err(xid, cfile->fid.persistent_fid, tcon->tid,