Message ID | 20190314140848.11476-1-lsahlber@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | cifs: fix incorrect handling of smb2_set_sparse() return in smb3_simple_falloc | expand |
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 >
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,