mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
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:
parent
16f93bdd61
commit
cdb1efee54
1 changed files with 8 additions and 13 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue