Unverified Commit 62fea783 authored by Konstantin Komarov's avatar Konstantin Komarov
Browse files

fs/ntfs3: Fix sparse warning in ni_fiemap



The interface of fiemap_fill_next_extent_k() was modified
to eliminate the sparse warning.

Fixes: d57431c6 ("fs/ntfs3: Do copy_to_user out of run_lock")
Reported-by: default avatarkernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202406271920.hndE8N6D-lkp@intel.com/


Signed-off-by: default avatarKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
parent 5b2db723
Loading
Loading
Loading
Loading
+8 −13
Original line number Diff line number Diff line
@@ -1900,13 +1900,13 @@ enum REPARSE_SIGN ni_parse_reparse(struct ntfs_inode *ni, struct ATTRIB *attr,

/*
 * fiemap_fill_next_extent_k - a copy of fiemap_fill_next_extent
 * but it accepts kernel address for fi_extents_start
 * but it uses 'fe_k' instead of fieinfo->fi_extents_start
 */
static int fiemap_fill_next_extent_k(struct fiemap_extent_info *fieinfo,
				     u64 logical, u64 phys, u64 len, u32 flags)
				     struct fiemap_extent *fe_k, u64 logical,
				     u64 phys, u64 len, u32 flags)
{
	struct fiemap_extent extent;
	struct fiemap_extent __user *dest = fieinfo->fi_extents_start;

	/* only count the extents */
	if (fieinfo->fi_extents_max == 0) {
@@ -1930,8 +1930,7 @@ static int fiemap_fill_next_extent_k(struct fiemap_extent_info *fieinfo,
	extent.fe_length = len;
	extent.fe_flags = flags;

	dest += fieinfo->fi_extents_mapped;
	memcpy(dest, &extent, sizeof(extent));
	memcpy(fe_k + fieinfo->fi_extents_mapped, &extent, sizeof(extent));

	fieinfo->fi_extents_mapped++;
	if (fieinfo->fi_extents_mapped == fieinfo->fi_extents_max)
@@ -1949,7 +1948,6 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
	      __u64 vbo, __u64 len)
{
	int err = 0;
	struct fiemap_extent __user *fe_u = fieinfo->fi_extents_start;
	struct fiemap_extent *fe_k = NULL;
	struct ntfs_sb_info *sbi = ni->mi.sbi;
	u8 cluster_bits = sbi->cluster_bits;
@@ -2008,7 +2006,6 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
		err = -ENOMEM;
		goto out;
	}
	fieinfo->fi_extents_start = fe_k;

	end = vbo + len;
	alloc_size = le64_to_cpu(attr->nres.alloc_size);
@@ -2098,8 +2095,8 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
			if (vbo + dlen >= end)
				flags |= FIEMAP_EXTENT_LAST;

			err = fiemap_fill_next_extent_k(fieinfo, vbo, lbo, dlen,
							flags);
			err = fiemap_fill_next_extent_k(fieinfo, fe_k, vbo, lbo,
							dlen, flags);

			if (err < 0)
				break;
@@ -2120,7 +2117,7 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
		if (vbo + bytes >= end)
			flags |= FIEMAP_EXTENT_LAST;

		err = fiemap_fill_next_extent_k(fieinfo, vbo, lbo, bytes,
		err = fiemap_fill_next_extent_k(fieinfo, fe_k, vbo, lbo, bytes,
						flags);
		if (err < 0)
			break;
@@ -2137,15 +2134,13 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
	/*
	 * Copy to user memory out of lock
	 */
	if (copy_to_user(fe_u, fe_k,
	if (copy_to_user(fieinfo->fi_extents_start, fe_k,
			 fieinfo->fi_extents_max *
				 sizeof(struct fiemap_extent))) {
		err = -EFAULT;
	}

out:
	/* Restore original pointer. */
	fieinfo->fi_extents_start = fe_u;
	kfree(fe_k);
	return err;
}