]> www.infradead.org Git - users/willy/linux.git/commitdiff
fs/ntfs3: Fix sparse warning in ni_fiemap
authorKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Mon, 19 Aug 2024 13:23:02 +0000 (16:23 +0300)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Tue, 3 Sep 2024 13:58:41 +0000 (16:58 +0300)
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>
fs/ntfs3/frecord.c

index a469c608a39488bc5695043994e4a19a7b611435..60c975ac38e610252955ee31a560f1d13b27d132 100644 (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
- * 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;
 }