[PATCH] cifs: add support for FALLOC_FL_COLLAPSE_RANGE
Steve French
smfrench at gmail.com
Thu Apr 1 05:41:11 UTC 2021
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 at redhat.com> wrote:
>
> Reported-by: kernel test robot <lkp at intel.com>
> Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
> Signed-off-by: Ronnie Sahlberg <lsahlber at redhat.com>
> ---
> 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
More information about the samba-technical
mailing list