Running xfstests on this patch (along with the previous INSERT_RANGE patch) fixes at least six xfstests which were skipped before: # ./check -cifs generic/072 generic/145 generic/147 generic/153 generic/351 generic/458 FSTYP -- cifs PLATFORM -- Linux/x86_64 smfrench-Virtual-Machine 5.12.0-051200rc4-generic #202103212230 SMP Sun Mar 21 22:33:27 UTC 2021 generic/072 7s ... 6s generic/145 0s ... 1s generic/147 1s ... 0s generic/153 0s ... 1s generic/351 5s ... 3s generic/458 1s ... 1s Ran: generic/072 generic/145 generic/147 generic/153 generic/351 generic/458 Passed all 6 tests Promising ... there are additional fallocate related tests that still fail or are skipped, but good progress ... On Fri, Mar 26, 2021 at 2:52 PM Ronnie Sahlberg <lsahlber@xxxxxxxxxx> wrote: > > Reported-by: kernel test robot <lkp@xxxxxxxxx> > Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx> > Signed-off-by: Ronnie Sahlberg <lsahlber@xxxxxxxxxx> > --- > fs/cifs/smb2ops.c | 40 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 40 insertions(+) > > diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c > index 9bae7e8deb09..3bb18944aaa4 100644 > --- a/fs/cifs/smb2ops.c > +++ b/fs/cifs/smb2ops.c > @@ -3640,6 +3640,44 @@ static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon, > return rc; > } > > +static long smb3_collapse_range(struct file *file, struct cifs_tcon *tcon, > + loff_t off, loff_t len) > +{ > + int rc; > + unsigned int xid; > + struct cifsFileInfo *cfile = file->private_data; > + __le64 eof; > + > + xid = get_xid(); > + > + if (off + len < off) { > + rc = -EFBIG; > + goto out; > + } > + > + if (off >= i_size_read(file->f_inode) || > + off + len >= i_size_read(file->f_inode)) { > + rc = -EINVAL; > + goto out; > + } > + > + rc = smb2_copychunk_range(xid, cfile, cfile, off + len, > + i_size_read(file->f_inode) - off - len, off); > + if (rc < 0) > + goto out; > + > + eof = i_size_read(file->f_inode) - len; > + rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, > + cfile->fid.volatile_fid, cfile->pid, &eof); > + if (rc < 0) > + goto out; > + > + rc = 0; > + out: > + free_xid(xid); > + return rc; > +} > + > static loff_t smb3_llseek(struct file *file, struct cifs_tcon *tcon, loff_t offset, int whence) > { > struct cifsFileInfo *wrcfile, *cfile = file->private_data; > @@ -3811,6 +3849,8 @@ static long smb3_fallocate(struct file *file, struct cifs_tcon *tcon, int mode, > return smb3_zero_range(file, tcon, off, len, false); > } else if (mode == FALLOC_FL_KEEP_SIZE) > return smb3_simple_falloc(file, tcon, off, len, true); > + else if (mode == FALLOC_FL_COLLAPSE_RANGE) > + return smb3_collapse_range(file, tcon, off, len); > else if (mode == 0) > return smb3_simple_falloc(file, tcon, off, len, false); > > -- > 2.29.2 > -- Thanks, Steve