@@ -1900,13 +1900,13 @@ enum REPARSE_SIGN ni_parse_reparse(struct ntfs_inode *ni, struct ATTRIB *attr,
19001900
19011901/*
19021902 * fiemap_fill_next_extent_k - a copy of fiemap_fill_next_extent
1903- * but it accepts kernel address for fi_extents_start
1903+ * but it uses 'fe_k' instead of fieinfo-> fi_extents_start
19041904 */
19051905static int fiemap_fill_next_extent_k (struct fiemap_extent_info * fieinfo ,
1906- u64 logical , u64 phys , u64 len , u32 flags )
1906+ struct fiemap_extent * fe_k , u64 logical ,
1907+ u64 phys , u64 len , u32 flags )
19071908{
19081909 struct fiemap_extent extent ;
1909- struct fiemap_extent __user * dest = fieinfo -> fi_extents_start ;
19101910
19111911 /* only count the extents */
19121912 if (fieinfo -> fi_extents_max == 0 ) {
@@ -1930,8 +1930,7 @@ static int fiemap_fill_next_extent_k(struct fiemap_extent_info *fieinfo,
19301930 extent .fe_length = len ;
19311931 extent .fe_flags = flags ;
19321932
1933- dest += fieinfo -> fi_extents_mapped ;
1934- memcpy (dest , & extent , sizeof (extent ));
1933+ memcpy (fe_k + fieinfo -> fi_extents_mapped , & extent , sizeof (extent ));
19351934
19361935 fieinfo -> fi_extents_mapped ++ ;
19371936 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,
19491948 __u64 vbo , __u64 len )
19501949{
19511950 int err = 0 ;
1952- struct fiemap_extent __user * fe_u = fieinfo -> fi_extents_start ;
19531951 struct fiemap_extent * fe_k = NULL ;
19541952 struct ntfs_sb_info * sbi = ni -> mi .sbi ;
19551953 u8 cluster_bits = sbi -> cluster_bits ;
@@ -2008,7 +2006,6 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
20082006 err = - ENOMEM ;
20092007 goto out ;
20102008 }
2011- fieinfo -> fi_extents_start = fe_k ;
20122009
20132010 end = vbo + len ;
20142011 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,
20982095 if (vbo + dlen >= end )
20992096 flags |= FIEMAP_EXTENT_LAST ;
21002097
2101- err = fiemap_fill_next_extent_k (fieinfo , vbo , lbo , dlen ,
2102- flags );
2098+ err = fiemap_fill_next_extent_k (fieinfo , fe_k , vbo , lbo ,
2099+ dlen , flags );
21032100
21042101 if (err < 0 )
21052102 break ;
@@ -2120,7 +2117,7 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
21202117 if (vbo + bytes >= end )
21212118 flags |= FIEMAP_EXTENT_LAST ;
21222119
2123- err = fiemap_fill_next_extent_k (fieinfo , vbo , lbo , bytes ,
2120+ err = fiemap_fill_next_extent_k (fieinfo , fe_k , vbo , lbo , bytes ,
21242121 flags );
21252122 if (err < 0 )
21262123 break ;
@@ -2137,15 +2134,13 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
21372134 /*
21382135 * Copy to user memory out of lock
21392136 */
2140- if (copy_to_user (fe_u , fe_k ,
2137+ if (copy_to_user (fieinfo -> fi_extents_start , fe_k ,
21412138 fieinfo -> fi_extents_max *
21422139 sizeof (struct fiemap_extent ))) {
21432140 err = - EFAULT ;
21442141 }
21452142
21462143out :
2147- /* Restore original pointer. */
2148- fieinfo -> fi_extents_start = fe_u ;
21492144 kfree (fe_k );
21502145 return err ;
21512146}
0 commit comments