diff mbox series

cifs: add support for FALLOC_FL_COLLAPSE_RANGE

Message ID 20210326013146.80962-1-lsahlber@redhat.com (mailing list archive)
State New, archived
Headers show
Series cifs: add support for FALLOC_FL_COLLAPSE_RANGE | expand

Commit Message

Ronnie Sahlberg March 26, 2021, 1:31 a.m. UTC
Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
---
 fs/cifs/smb2ops.c | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

Comments

kernel test robot March 26, 2021, 5:58 a.m. UTC | #1
Hi Ronnie,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on cifs/for-next]
[also build test WARNING on v5.12-rc4 next-20210325]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Ronnie-Sahlberg/cifs-add-support-for-FALLOC_FL_COLLAPSE_RANGE/20210326-093328
base:   git://git.samba.org/sfrench/cifs-2.6.git for-next
config: x86_64-randconfig-a015-20210325 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project f490a5969bd52c8a48586f134ff8f02ccbb295b3)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install x86_64 cross compiling tool for clang build
        # apt-get install binutils-x86-64-linux-gnu
        # https://github.com/0day-ci/linux/commit/0536911dc253bdf2243c8054b5f6fbd256dcdb49
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Ronnie-Sahlberg/cifs-add-support-for-FALLOC_FL_COLLAPSE_RANGE/20210326-093328
        git checkout 0536911dc253bdf2243c8054b5f6fbd256dcdb49
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   fs/cifs/smb2ops.c:3654:6: warning: expression result unused [-Wunused-value]
                   rc -EFBIG;
                   ~~ ^~~~~~
   fs/cifs/smb2ops.c:3660:6: warning: expression result unused [-Wunused-value]
                   rc -EINVAL;
                   ~~ ^~~~~~~
>> fs/cifs/smb2ops.c:3654:3: warning: variable 'rc' is uninitialized when used here [-Wuninitialized]
                   rc -EFBIG;
                   ^~
   fs/cifs/smb2ops.c:3646:8: note: initialize the variable 'rc' to silence this warning
           int rc;
                 ^
                  = 0
   3 warnings generated.


vim +/rc +3654 fs/cifs/smb2ops.c

  3642	
  3643	static long smb3_collapse_range(struct file *file, struct cifs_tcon *tcon,
  3644				    loff_t off, loff_t len)
  3645	{
  3646		int rc;
  3647		unsigned int xid;
  3648		struct cifsFileInfo *cfile = file->private_data;
  3649		__le64 eof;
  3650	
  3651		xid = get_xid();
  3652	
  3653		if (off + len < off) {
> 3654			rc -EFBIG;
  3655			goto out;
  3656		}
  3657	
  3658		if (off >= i_size_read(file->f_inode) ||
  3659		    off + len >= i_size_read(file->f_inode)) {
  3660			rc -EINVAL;
  3661			goto out;
  3662		}
  3663	
  3664		rc = smb2_copychunk_range(xid, cfile, cfile, off + len,
  3665					  i_size_read(file->f_inode) - off - len, off);
  3666		if (rc < 0)
  3667			goto out;
  3668	
  3669		eof = i_size_read(file->f_inode) - len;
  3670		rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
  3671				  cfile->fid.volatile_fid, cfile->pid, &eof);
  3672		if (rc < 0)
  3673			goto out;
  3674	
  3675		rc = 0;
  3676	 out:
  3677		free_xid(xid);
  3678		return rc;
  3679	}
  3680	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Dan Carpenter March 26, 2021, 8:35 a.m. UTC | #2
Hi Ronnie,

url:    https://github.com/0day-ci/linux/commits/Ronnie-Sahlberg/cifs-add-support-for-FALLOC_FL_COLLAPSE_RANGE/20210326-093328
base:   git://git.samba.org/sfrench/cifs-2.6.git for-next
config: i386-randconfig-m021-20210325 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
fs/cifs/smb2ops.c:3654 smb3_collapse_range() warn: statement has no effect 5
fs/cifs/smb2ops.c:3654 smb3_collapse_range() error: uninitialized symbol 'rc'.

Old smatch warnings:
fs/cifs/smb2ops.c:3660 smb3_collapse_range() warn: statement has no effect 5
fs/cifs/smb2ops.c:3660 smb3_collapse_range() error: uninitialized symbol 'rc'.

vim +3654 fs/cifs/smb2ops.c

0536911dc253bd Ronnie Sahlberg 2021-03-26  3643  static long smb3_collapse_range(struct file *file, struct cifs_tcon *tcon,
0536911dc253bd Ronnie Sahlberg 2021-03-26  3644  			    loff_t off, loff_t len)
0536911dc253bd Ronnie Sahlberg 2021-03-26  3645  {
0536911dc253bd Ronnie Sahlberg 2021-03-26  3646  	int rc;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3647  	unsigned int xid;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3648  	struct cifsFileInfo *cfile = file->private_data;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3649  	__le64 eof;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3650  
0536911dc253bd Ronnie Sahlberg 2021-03-26  3651  	xid = get_xid();
0536911dc253bd Ronnie Sahlberg 2021-03-26  3652  
0536911dc253bd Ronnie Sahlberg 2021-03-26  3653  	if (off + len < off) {
0536911dc253bd Ronnie Sahlberg 2021-03-26 @3654  		rc -EFBIG;

Missing = character.

0536911dc253bd Ronnie Sahlberg 2021-03-26  3655  		goto out;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3656  	}
0536911dc253bd Ronnie Sahlberg 2021-03-26  3657  
0536911dc253bd Ronnie Sahlberg 2021-03-26  3658  	if (off >= i_size_read(file->f_inode) ||
0536911dc253bd Ronnie Sahlberg 2021-03-26  3659  	    off + len >= i_size_read(file->f_inode)) {
0536911dc253bd Ronnie Sahlberg 2021-03-26  3660  		rc -EINVAL;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3661  		goto out;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3662  	}
0536911dc253bd Ronnie Sahlberg 2021-03-26  3663  
0536911dc253bd Ronnie Sahlberg 2021-03-26  3664  	rc = smb2_copychunk_range(xid, cfile, cfile, off + len,
0536911dc253bd Ronnie Sahlberg 2021-03-26  3665  				  i_size_read(file->f_inode) - off - len, off);
0536911dc253bd Ronnie Sahlberg 2021-03-26  3666  	if (rc < 0)
0536911dc253bd Ronnie Sahlberg 2021-03-26  3667  		goto out;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3668  
0536911dc253bd Ronnie Sahlberg 2021-03-26  3669  	eof = i_size_read(file->f_inode) - len;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3670  	rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
0536911dc253bd Ronnie Sahlberg 2021-03-26  3671  			  cfile->fid.volatile_fid, cfile->pid, &eof);
0536911dc253bd Ronnie Sahlberg 2021-03-26  3672  	if (rc < 0)
0536911dc253bd Ronnie Sahlberg 2021-03-26  3673  		goto out;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3674  
0536911dc253bd Ronnie Sahlberg 2021-03-26  3675  	rc = 0;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3676   out:
0536911dc253bd Ronnie Sahlberg 2021-03-26  3677  	free_xid(xid);
0536911dc253bd Ronnie Sahlberg 2021-03-26  3678  	return rc;
0536911dc253bd Ronnie Sahlberg 2021-03-26  3679  }

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index 9bae7e8deb09..1082c22551d7 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);