Re: [PATCH] cifs: fix i_size inconsistency in smb2_duplicate_extents() on FSCTL failure

kernel test robot <[email protected]>
Newsgroups org.kernel.vger.linux-cifs,dev.linux.lists.llvm,dev.linux.lists.oe-kbuild-all,org.kernel.vger.stable
Message-ID <[email protected]>
Hi Frank,

kernel test robot noticed the following build errors:

[auto build test ERROR on brauner-vfs/vfs.all]
[also build test ERROR on cifs/for-next linus/master v7.2 next-20260821]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Frank-Sorenson/cifs-fix-i_size-inconsistency-in-smb2_duplicate_extents-on-FSCTL-failure/20260820-161443
base:   https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git vfs.all
patch link:    https://lore.kernel.org/r/20260820211443.1472310-1-sorenson%40redhat.com
patch subject: [PATCH] cifs: fix i_size inconsistency in smb2_duplicate_extents() on FSCTL failure
config: x86_64-kexec (https://download.01.org/0day-ci/archive/20260823/[email protected]/config)
compiler: clang version 22.1.3 (https://github.com/llvm/llvm-project e9846648fd6183ee6d8cbdb4502213fcf902a211)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260823/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

>> fs/smb/client/smb2ops.c:2251:4: error: call to undeclared function 'cifs_resize_file_locked'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
    2251 |                         cifs_resize_file_locked(inode, orig_size);
         |                         ^
   1 error generated.


vim +/cifs_resize_file_locked +2251 fs/smb/client/smb2ops.c

  2188	
  2189	static int
  2190	smb2_duplicate_extents(const unsigned int xid,
  2191				struct cifsFileInfo *srcfile,
  2192				struct cifsFileInfo *trgtfile, u64 src_off,
  2193				u64 len, u64 dest_off)
  2194	{
  2195		int rc;
  2196		int qrc;
  2197		unsigned int ret_data_len;
  2198		struct inode *inode;
  2199		struct smb2_file_all_info file_inf;
  2200		struct duplicate_extents_to_file dup_ext_buf;
  2201		struct timespec64 ts;
  2202		struct cifs_tcon *tcon = tlink_tcon(trgtfile->tlink);
  2203		loff_t orig_size;
  2204		u64 asize;
  2205	
  2206		/* server fileays advertise duplicate extent support with this flag */
  2207		if ((le32_to_cpu(tcon->fsAttrInfo.Attributes) &
  2208		     FILE_SUPPORTS_BLOCK_REFCOUNTING) == 0)
  2209			return -EOPNOTSUPP;
  2210	
  2211		dup_ext_buf.VolatileFileHandle = srcfile->fid.volatile_fid;
  2212		dup_ext_buf.PersistentFileHandle = srcfile->fid.persistent_fid;
  2213		dup_ext_buf.SourceFileOffset = cpu_to_le64(src_off);
  2214		dup_ext_buf.TargetFileOffset = cpu_to_le64(dest_off);
  2215		dup_ext_buf.ByteCount = cpu_to_le64(len);
  2216		cifs_dbg(FYI, "Duplicate extents: src off %lld dst off %lld len %lld\n",
  2217			src_off, dest_off, len);
  2218		trace_smb3_clone_enter(xid, srcfile->fid.volatile_fid,
  2219				       trgtfile->fid.volatile_fid, tcon->tid,
  2220				       tcon->ses->Suid, src_off, dest_off, len);
  2221		inode = d_inode(trgtfile->dentry);
  2222		orig_size = i_size_read(inode);
  2223		if (orig_size < dest_off + len) {
  2224			rc = smb2_set_file_size(xid, tcon, trgtfile, dest_off + len, false);
  2225			if (rc)
  2226				goto duplicate_extents_out;
  2227			netfs_resize_file(netfs_inode(inode), dest_off + len, true);
  2228			cifs_setsize(inode, dest_off + len);
  2229		}
  2230		rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid,
  2231				trgtfile->fid.volatile_fid,
  2232				FSCTL_DUPLICATE_EXTENTS_TO_FILE,
  2233				(char *)&dup_ext_buf,
  2234				sizeof(struct duplicate_extents_to_file),
  2235				CIFSMaxBufSize, NULL,
  2236				&ret_data_len);
  2237	
  2238		if (ret_data_len > 0)
  2239			cifs_dbg(FYI, "Non-zero response length in duplicate extents\n");
  2240	
  2241		if (rc && i_size_read(inode) > orig_size) {
  2242			int rrc;
  2243	
  2244			/*
  2245			 * FSCTL failed after we pre-extended the file.  Attempt to
  2246			 * restore the original size so the caller sees a consistent
  2247			 * file rather than a larger file with uncloned content.
  2248			 */
  2249			rrc = smb2_set_file_size(xid, tcon, trgtfile, orig_size, false);
  2250			if (rrc == 0)
> 2251				cifs_resize_file_locked(inode, orig_size);
  2252			else {
  2253				CIFS_I(inode)->time = 0; /* force reval */
  2254				cifs_invalidate_cache(inode, 0);
  2255			}
  2256		}
  2257	
  2258		if (rc == 0) {
  2259			qrc = SMB2_query_info(xid, tcon, trgtfile->fid.persistent_fid,
  2260					      trgtfile->fid.volatile_fid, &file_inf);
  2261			spin_lock(&inode->i_lock);
  2262			if (qrc == 0) {
  2263				asize = le64_to_cpu(file_inf.AllocationSize);
  2264				CIFS_I(inode)->time = jiffies;
  2265				if (file_inf.LastWriteTime) {
  2266					ts = cifs_NTtimeToUnix(file_inf.LastWriteTime);
  2267					inode_set_mtime_to_ts(inode, ts);
  2268				}
  2269				if (file_inf.ChangeTime) {
  2270					ts = cifs_NTtimeToUnix(file_inf.ChangeTime);
  2271					inode_set_ctime_to_ts(inode, ts);
  2272				}
  2273				if (file_inf.LastAccessTime) {
  2274					ts = cifs_NTtimeToUnix(file_inf.LastAccessTime);
  2275					inode_set_atime_to_ts(inode, ts);
  2276				}
  2277				inode->i_blocks = CIFS_INO_BLOCKS(asize);
  2278			} else {
  2279				CIFS_I(inode)->time = 0; /* force reval */
  2280			}
  2281			spin_unlock(&inode->i_lock);
  2282		}
  2283	
  2284	duplicate_extents_out:
  2285		if (rc)
  2286			trace_smb3_clone_err(xid, srcfile->fid.volatile_fid,
  2287					     trgtfile->fid.volatile_fid,
  2288					     tcon->tid, tcon->ses->Suid, src_off,
  2289					     dest_off, len, rc);
  2290		else
  2291			trace_smb3_clone_done(xid, srcfile->fid.volatile_fid,
  2292					      trgtfile->fid.volatile_fid, tcon->tid,
  2293					      tcon->ses->Suid, src_off, dest_off, len);
  2294		return rc;
  2295	}
  2296	

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.