@@ -1900,13 +1900,13 @@ enum REPARSE_SIGN ni_parse_reparse(struct ntfs_inode *ni, struct ATTRIB *attr,
1900
1900
1901
1901
/*
1902
1902
* 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
1904
1904
*/
1905
1905
static 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 )
1907
1908
{
1908
1909
struct fiemap_extent extent ;
1909
- struct fiemap_extent __user * dest = fieinfo -> fi_extents_start ;
1910
1910
1911
1911
/* only count the extents */
1912
1912
if (fieinfo -> fi_extents_max == 0 ) {
@@ -1930,8 +1930,7 @@ static int fiemap_fill_next_extent_k(struct fiemap_extent_info *fieinfo,
1930
1930
extent .fe_length = len ;
1931
1931
extent .fe_flags = flags ;
1932
1932
1933
- dest += fieinfo -> fi_extents_mapped ;
1934
- memcpy (dest , & extent , sizeof (extent ));
1933
+ memcpy (fe_k + fieinfo -> fi_extents_mapped , & extent , sizeof (extent ));
1935
1934
1936
1935
fieinfo -> fi_extents_mapped ++ ;
1937
1936
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,
1949
1948
__u64 vbo , __u64 len )
1950
1949
{
1951
1950
int err = 0 ;
1952
- struct fiemap_extent __user * fe_u = fieinfo -> fi_extents_start ;
1953
1951
struct fiemap_extent * fe_k = NULL ;
1954
1952
struct ntfs_sb_info * sbi = ni -> mi .sbi ;
1955
1953
u8 cluster_bits = sbi -> cluster_bits ;
@@ -2008,7 +2006,6 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
2008
2006
err = - ENOMEM ;
2009
2007
goto out ;
2010
2008
}
2011
- fieinfo -> fi_extents_start = fe_k ;
2012
2009
2013
2010
end = vbo + len ;
2014
2011
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,
2098
2095
if (vbo + dlen >= end )
2099
2096
flags |= FIEMAP_EXTENT_LAST ;
2100
2097
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 );
2103
2100
2104
2101
if (err < 0 )
2105
2102
break ;
@@ -2120,7 +2117,7 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
2120
2117
if (vbo + bytes >= end )
2121
2118
flags |= FIEMAP_EXTENT_LAST ;
2122
2119
2123
- err = fiemap_fill_next_extent_k (fieinfo , vbo , lbo , bytes ,
2120
+ err = fiemap_fill_next_extent_k (fieinfo , fe_k , vbo , lbo , bytes ,
2124
2121
flags );
2125
2122
if (err < 0 )
2126
2123
break ;
@@ -2137,15 +2134,13 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
2137
2134
/*
2138
2135
* Copy to user memory out of lock
2139
2136
*/
2140
- if (copy_to_user (fe_u , fe_k ,
2137
+ if (copy_to_user (fieinfo -> fi_extents_start , fe_k ,
2141
2138
fieinfo -> fi_extents_max *
2142
2139
sizeof (struct fiemap_extent ))) {
2143
2140
err = - EFAULT ;
2144
2141
}
2145
2142
2146
2143
out :
2147
- /* Restore original pointer. */
2148
- fieinfo -> fi_extents_start = fe_u ;
2149
2144
kfree (fe_k );
2150
2145
return err ;
2151
2146
}
0 commit comments