fs/ntfs3: Fix sparse warning in ni_fiemap

[ Upstream commit 62fea783f96ce825f0ac9e40ce9530ddc1ea2a29 ]

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

Fixes: d57431c6f511 ("fs/ntfs3: Do copy_to_user out of run_lock")
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202406271920.hndE8N6D-lkp@intel.com/
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Konstantin Komarov 2024-08-19 16:23:02 +03:00 committed by Greg Kroah-Hartman
parent 16f93bdd61
commit cdb1efee54

View file

@ -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 * 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, 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 extent;
struct fiemap_extent __user *dest = fieinfo->fi_extents_start;
/* only count the extents */ /* only count the extents */
if (fieinfo->fi_extents_max == 0) { 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_length = len;
extent.fe_flags = flags; extent.fe_flags = flags;
dest += fieinfo->fi_extents_mapped; memcpy(fe_k + fieinfo->fi_extents_mapped, &extent, sizeof(extent));
memcpy(dest, &extent, sizeof(extent));
fieinfo->fi_extents_mapped++; fieinfo->fi_extents_mapped++;
if (fieinfo->fi_extents_mapped == fieinfo->fi_extents_max) 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) __u64 vbo, __u64 len)
{ {
int err = 0; int err = 0;
struct fiemap_extent __user *fe_u = fieinfo->fi_extents_start;
struct fiemap_extent *fe_k = NULL; struct fiemap_extent *fe_k = NULL;
struct ntfs_sb_info *sbi = ni->mi.sbi; struct ntfs_sb_info *sbi = ni->mi.sbi;
u8 cluster_bits = sbi->cluster_bits; u8 cluster_bits = sbi->cluster_bits;
@ -2008,7 +2006,6 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
err = -ENOMEM; err = -ENOMEM;
goto out; goto out;
} }
fieinfo->fi_extents_start = fe_k;
end = vbo + len; end = vbo + len;
alloc_size = le64_to_cpu(attr->nres.alloc_size); 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) if (vbo + dlen >= end)
flags |= FIEMAP_EXTENT_LAST; flags |= FIEMAP_EXTENT_LAST;
err = fiemap_fill_next_extent_k(fieinfo, vbo, lbo, dlen, err = fiemap_fill_next_extent_k(fieinfo, fe_k, vbo, lbo,
flags); dlen, flags);
if (err < 0) if (err < 0)
break; break;
@ -2120,7 +2117,7 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
if (vbo + bytes >= end) if (vbo + bytes >= end)
flags |= FIEMAP_EXTENT_LAST; 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); flags);
if (err < 0) if (err < 0)
break; break;
@ -2137,15 +2134,13 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
/* /*
* Copy to user memory out of lock * 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 * fieinfo->fi_extents_max *
sizeof(struct fiemap_extent))) { sizeof(struct fiemap_extent))) {
err = -EFAULT; err = -EFAULT;
} }
out: out:
/* Restore original pointer. */
fieinfo->fi_extents_start = fe_u;
kfree(fe_k); kfree(fe_k);
return err; return err;
} }