Skip to content

Commit

Permalink
cifs: add FALLOC_FL_INSERT_RANGE support
Browse files Browse the repository at this point in the history
Emulated via server side copy and setsize for
SMB3 and later. In the future we could compound
this (and/or optionally use DUPLICATE_EXTENTS
if supported by the server).

Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
  • Loading branch information
Ronnie Sahlberg authored and Steve French committed Apr 25, 2021
1 parent 5476b5d commit 7fe6fe9
Showing 1 changed file with 40 additions and 0 deletions.
40 changes: 40 additions & 0 deletions fs/cifs/smb2ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -3721,6 +3721,44 @@ static long smb3_collapse_range(struct file *file, struct cifs_tcon *tcon,
return rc;
}

static long smb3_insert_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;
__u64 count;

xid = get_xid();

if (off >= i_size_read(file->f_inode)) {
rc = -EINVAL;
goto out;
}

count = i_size_read(file->f_inode) - off;
eof = cpu_to_le64(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 = smb2_copychunk_range(xid, cfile, cfile, off, count, off + len);
if (rc < 0)
goto out;

rc = smb3_zero_range(file, tcon, off, len, 1);
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;
Expand Down Expand Up @@ -3894,6 +3932,8 @@ static long smb3_fallocate(struct file *file, struct cifs_tcon *tcon, int mode,
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 == FALLOC_FL_INSERT_RANGE)
return smb3_insert_range(file, tcon, off, len);
else if (mode == 0)
return smb3_simple_falloc(file, tcon, off, len, false);

Expand Down

0 comments on commit 7fe6fe9

Please sign in to comment.