@@ -79,10 +79,10 @@ FT_IO_NAMESPACE_BEGIN
79
79
static int ff_posix_fibmap (int fd, ft_uoff dev_length, fr_vector<ft_uoff> & ret_list, ft_uoff & ret_block_size_bitmask)
80
80
{
81
81
#ifdef FIBMAP
82
- ft_uoff file_length, file_block_count, dev_block_count;
82
+ ft_uoff file_length, file_block_count, dev_block_count;
83
83
ft_uoff ioctl_n = 0 , block_size = 0 , logical_uoff, physical_uoff;
84
84
85
- ft_size extent_n = ret_list.size ();
85
+ ft_size extent_n = ret_list.size ();
86
86
87
87
/* lower-level API ff_posix_ioctl(FIGETBSZ) and ff_posix_ioctl(FIBMAP) need these to be int */
88
88
int err = 0 , block_size_int, logical, physical;
@@ -129,7 +129,7 @@ static int ff_posix_fibmap(int fd, ft_uoff dev_length, fr_vector<ft_uoff> & ret_
129
129
130
130
for (logical = 0 ; logical < n; logical++) {
131
131
physical = logical;
132
- ioctl_n++;
132
+ ioctl_n++;
133
133
if ((err = ff_posix_ioctl (fd, FIBMAP, & physical))) {
134
134
err = ff_log (FC_ERROR, err, " ff_posix_fibmap(): error in ioctl(%d, FIBMAP, %" FT_ULL" )" , fd, (ft_ull) logical);
135
135
break ;
@@ -146,15 +146,15 @@ static int ff_posix_fibmap(int fd, ft_uoff dev_length, fr_vector<ft_uoff> & ret_
146
146
} while (0 );
147
147
148
148
if (err == 0 ) {
149
- static ft_ull log_count = 0 ;
149
+ static ft_ull log_count = 0 ;
150
150
151
- if (log_count++ == 5 )
151
+ if (log_count++ == 5 )
152
152
ff_log (FC_DEBUG, 0 , " decreasing to level TRACE any further DEBUG message 'ioctl(FIBMAP) successful'" );
153
153
154
- extent_n = ret_list.size () - extent_n;
154
+ extent_n = ret_list.size () - extent_n;
155
155
156
156
ff_log (log_count < 5 ? FC_DEBUG : FC_TRACE, 0 , " ioctl(%d, FIBMAP) successful: retrieved %" FT_ULL" extent%s in %" FT_ULL" call%s" ,
157
- fd, (ft_ull) extent_n, extent_n == 1 ? " " : " s" , (ft_ull) ioctl_n, ioctl_n == 1 ? " " : " s" );
157
+ fd, (ft_ull) extent_n, extent_n == 1 ? " " : " s" , (ft_ull) ioctl_n, ioctl_n == 1 ? " " : " s" );
158
158
/* keep track of bits used by extents. needed to compute effective block size */
159
159
ret_block_size_bitmask |= block_size;
160
160
}
@@ -172,22 +172,22 @@ static int ff_linux_fiemap(int fd, ft_uoff file_start, ft_uoff file_end, ft_u32
172
172
173
173
memset (k_map, 0 , k_len);
174
174
175
- k_map->fm_start = (ft_u64) file_start;
176
- k_map->fm_length = (ft_u64) (file_end - file_start);
177
- k_map->fm_flags = FIEMAP_FLAG_SYNC;
178
- k_map->fm_extent_count = extent_n;
179
-
180
- int err = 0 ;
181
- if ((err = ff_posix_ioctl (fd, FS_IOC_FIEMAP, k_map)) != 0 ) {
182
- static ft_ull log_count = 0 ;
183
- if (log_count++ == 5 )
184
- ff_log (FC_DEBUG, 0 , " decreasing to level TRACE any further DEBUG message 'ioctl(FIEMAP) failed'" );
185
-
186
- /* do not mark the error as reported, this is just a DEBUG message */
187
- ff_log (log_count < 5 ? FC_DEBUG : FC_TRACE, 0 ,
188
- " ioctl(%d, FIEMAP, extents[%" FT_ULL" ]) failed (%s), falling back on ioctl(FIBMAP) ..." ,
189
- fd, (ft_ull) extent_n, strerror (err));
190
- }
175
+ k_map->fm_start = (ft_u64) file_start;
176
+ k_map->fm_length = (ft_u64) (file_end - file_start);
177
+ k_map->fm_flags = FIEMAP_FLAG_SYNC;
178
+ k_map->fm_extent_count = extent_n;
179
+
180
+ int err = 0 ;
181
+ if ((err = ff_posix_ioctl (fd, FS_IOC_FIEMAP, k_map)) != 0 ) {
182
+ static ft_ull log_count = 0 ;
183
+ if (log_count++ == 5 )
184
+ ff_log (FC_DEBUG, 0 , " decreasing to level TRACE any further DEBUG message 'ioctl(FIEMAP) failed'" );
185
+
186
+ /* do not mark the error as reported, this is just a DEBUG message */
187
+ ff_log (log_count < 5 ? FC_DEBUG : FC_TRACE, 0 ,
188
+ " ioctl(%d, FIEMAP, extents[%" FT_ULL" ]) failed (%s), falling back on ioctl(FIBMAP) ..." ,
189
+ fd, (ft_ull) extent_n, strerror (err));
190
+ }
191
191
return err;
192
192
}
193
193
#endif /* FS_IOC_FIEMAP */
@@ -208,93 +208,93 @@ static int ff_linux_fiemap(int fd, fr_vector<ft_uoff> & ret_list, ft_uoff & ret_
208
208
int err;
209
209
210
210
if ((err = ff_posix_size (fd, & file_size)) || file_size == 0 )
211
- return err;
211
+ return err;
212
212
213
- fr_vector<ft_uoff> tmp_list;
213
+ fr_vector<ft_uoff> tmp_list;
214
214
215
- enum { K_EXTENT_N = 1024 , K_SIZEOF_FIEMAP = sizeof (struct fiemap ) + K_EXTENT_N * sizeof (struct fiemap_extent ) };
216
- char buf[K_SIZEOF_FIEMAP];
215
+ enum { K_EXTENT_N = 1024 , K_SIZEOF_FIEMAP = sizeof (struct fiemap ) + K_EXTENT_N * sizeof (struct fiemap_extent ) };
216
+ char buf[K_SIZEOF_FIEMAP];
217
217
struct fiemap * k_map = (struct fiemap *) buf;
218
218
ft_uoff ioctl_n = 0 , block_size_bitmask = ret_block_size_bitmask;
219
219
220
- // call ioctl() repeatedly until we retrieve all extents
220
+ // call ioctl() repeatedly until we retrieve all extents
221
221
while (ioctl_n++, (err = ff_linux_fiemap (fd, file_start, file_size, K_EXTENT_N, k_map)) == 0 ) {
222
222
223
- ft_u32 i, extent_n = k_map->fm_mapped_extents ;
224
- if (extent_n == 0 ) {
225
- /* we did not get any extent... bail out */
226
- ff_log (FC_WARN, 0 , " ioctl(%d, FS_IOC_FIEMAP) is refusing to return any extent after file offset = %" FT_ULL
227
- " , falling back on ioctl(FIBMAP) ..." , fd, (ft_ull) file_start);
228
- /* mark the error as reported, WARN is quite a severe level */
229
- err = -ENOSYS; /* ioctl(FS_IOC_FIEMAP) not working as expected... */
230
- break ;
231
- }
232
-
233
- const struct fiemap_extent & last_e = k_map->fm_extents [extent_n - 1 ];
234
- const ft_uoff new_file_start = (ft_uoff) last_e.fe_logical + (ft_uoff) last_e.fe_length ;
235
- if (new_file_start <= file_start) {
236
- ff_log (FC_WARN, 0 , " ioctl(%d, FS_IOC_FIEMAP) returned extents ending at %" FT_ULL" , i.e. _before_ start of requested range [%" FT_ULL" , %" FT_ULL" ]"
237
- " , falling back on ioctl(FIBMAP) ..." , fd, (ft_ull) new_file_start, (ft_ull) file_start, (ft_ull) file_size);
238
- /* mark the error as reported, WARN is quite a severe level */
239
- err = -ENOSYS; /* ioctl(FS_IOC_FIEMAP) not working as expected... */
240
- break ;
241
- }
242
-
243
- tmp_list.reserve (tmp_list.size () + extent_n);
244
-
245
- for (i = 0 ; i < extent_n; i++) {
246
- const struct fiemap_extent & e = k_map->fm_extents [i];
247
-
248
- ft_u32 flag = e.fe_flags & (FIEMAP_EXTENT_UNKNOWN | FIEMAP_EXTENT_ENCODED);
249
-
250
- if (flag) {
251
- ff_log (FC_DEBUG, 0 , " ioctl(%d, FS_IOC_FIEMAP, extents[%" FT_ULL" ]) returned unsupported %s%s%s extents, falling back on ioctl(FIBMAP) ..." ,
252
- fd, (ft_ull) extent_n,
253
- (flag & FIEMAP_EXTENT_UNKNOWN ? " UNKNOWN" : " " ),
254
- (flag == (FIEMAP_EXTENT_UNKNOWN|FIEMAP_EXTENT_ENCODED) ? " +" : " " ),
255
- (flag & FIEMAP_EXTENT_ENCODED ? " ENCODED" : " " )
256
- );
257
- // do not mark the error as reported, this is just a DEBUG message
258
- err = ENOSYS;
259
- break ;
260
- }
261
- /*
262
- * keep track of bits used by all physical, logical and lengths.
263
- * needed to check against block size
264
- */
265
- block_size_bitmask |= e.fe_physical | e.fe_logical | e.fe_length ;
266
-
267
- // save what we retrieved
268
- tmp_list.append ((ft_uoff) e.fe_physical ,
269
- (ft_uoff) e.fe_logical ,
270
- (ft_uoff) e.fe_length ,
271
- (e.fe_flags & FIEMAP_EXTENT_UNWRITTEN) ? FC_EXTENT_ZEROED : FC_DEFAULT_USER_DATA);
272
- }
273
- if (err != 0 || (last_e.fe_flags & FIEMAP_EXTENT_LAST))
274
- break ;
275
-
276
- // no FIEMAP_EXTENT_LAST found, we did not get all the extents. keep trying...
277
- if (new_file_start >= file_size)
278
- // should not happen, but not too dangerous
279
- file_size = new_file_start + 1 ;
280
- file_start = new_file_start;
281
- }
282
- if (err != 0 )
283
- return err;
284
-
285
- ft_size extent_n = tmp_list.size ();
223
+ ft_u32 i, extent_n = k_map->fm_mapped_extents ;
224
+ if (extent_n == 0 ) {
225
+ /* we did not get any extent... bail out */
226
+ ff_log (FC_WARN, 0 , " ioctl(%d, FS_IOC_FIEMAP) is refusing to return any extent after file offset = %" FT_ULL
227
+ " , falling back on ioctl(FIBMAP) ..." , fd, (ft_ull) file_start);
228
+ /* mark the error as reported, WARN is quite a severe level */
229
+ err = -ENOSYS; /* ioctl(FS_IOC_FIEMAP) not working as expected... */
230
+ break ;
231
+ }
232
+
233
+ const struct fiemap_extent & last_e = k_map->fm_extents [extent_n - 1 ];
234
+ const ft_uoff new_file_start = (ft_uoff) last_e.fe_logical + (ft_uoff) last_e.fe_length ;
235
+ if (new_file_start <= file_start) {
236
+ ff_log (FC_WARN, 0 , " ioctl(%d, FS_IOC_FIEMAP) returned extents ending at %" FT_ULL" , i.e. _before_ start of requested range [%" FT_ULL" , %" FT_ULL" ]"
237
+ " , falling back on ioctl(FIBMAP) ..." , fd, (ft_ull) new_file_start, (ft_ull) file_start, (ft_ull) file_size);
238
+ /* mark the error as reported, WARN is quite a severe level */
239
+ err = -ENOSYS; /* ioctl(FS_IOC_FIEMAP) not working as expected... */
240
+ break ;
241
+ }
242
+
243
+ tmp_list.reserve (tmp_list.size () + extent_n);
244
+
245
+ for (i = 0 ; i < extent_n; i++) {
246
+ const struct fiemap_extent & e = k_map->fm_extents [i];
247
+
248
+ ft_u32 flag = e.fe_flags & (FIEMAP_EXTENT_UNKNOWN | FIEMAP_EXTENT_ENCODED);
249
+
250
+ if (flag) {
251
+ ff_log (FC_DEBUG, 0 , " ioctl(%d, FS_IOC_FIEMAP, extents[%" FT_ULL" ]) returned unsupported %s%s%s extents, falling back on ioctl(FIBMAP) ..." ,
252
+ fd, (ft_ull) extent_n,
253
+ (flag & FIEMAP_EXTENT_UNKNOWN ? " UNKNOWN" : " " ),
254
+ (flag == (FIEMAP_EXTENT_UNKNOWN|FIEMAP_EXTENT_ENCODED) ? " +" : " " ),
255
+ (flag & FIEMAP_EXTENT_ENCODED ? " ENCODED" : " " )
256
+ );
257
+ // do not mark the error as reported, this is just a DEBUG message
258
+ err = ENOSYS;
259
+ break ;
260
+ }
261
+ /*
262
+ * keep track of bits used by all physical, logical and lengths.
263
+ * needed to check against block size
264
+ */
265
+ block_size_bitmask |= e.fe_physical | e.fe_logical | e.fe_length ;
266
+
267
+ // save what we retrieved
268
+ tmp_list.append ((ft_uoff) e.fe_physical ,
269
+ (ft_uoff) e.fe_logical ,
270
+ (ft_uoff) e.fe_length ,
271
+ (e.fe_flags & FIEMAP_EXTENT_UNWRITTEN) ? FC_EXTENT_ZEROED : FC_DEFAULT_USER_DATA);
272
+ }
273
+ if (err != 0 || (last_e.fe_flags & FIEMAP_EXTENT_LAST))
274
+ break ;
275
+
276
+ // no FIEMAP_EXTENT_LAST found, we did not get all the extents. keep trying...
277
+ if (new_file_start >= file_size)
278
+ // should not happen, but not too dangerous
279
+ file_size = new_file_start + 1 ;
280
+ file_start = new_file_start;
281
+ }
282
+ if (err != 0 )
283
+ return err;
284
+
285
+ ft_size extent_n = tmp_list.size ();
286
286
287
287
/* ok, no strange extents: we can now add them to ret_list */
288
- ret_list.reserve (ret_list.size () + extent_n);
289
- ret_list.append_all (tmp_list);
288
+ ret_list.reserve (ret_list.size () + extent_n);
289
+ ret_list.append_all (tmp_list);
290
290
291
- static ft_ull log_count = 0 ;
292
- if (log_count++ == 5 )
291
+ static ft_ull log_count = 0 ;
292
+ if (log_count++ == 5 )
293
293
ff_log (FC_DEBUG, 0 , " decreasing to level TRACE any further DEBUG message 'ioctl(FIEMAP) successful'" );
294
294
295
- ff_log (log_count < 5 ? FC_DEBUG : FC_TRACE, 0 , " ioctl(%d, FIEMAP) successful: retrieved %" FT_ULL" extent%s in %" FT_ULL" call%s" ,
296
- fd, (ft_ull) extent_n, extent_n == 1 ? " " : " s" , (ft_ull) ioctl_n, ioctl_n == 1 ? " " : " s" );
297
- ret_block_size_bitmask = block_size_bitmask;
295
+ ff_log (log_count < 5 ? FC_DEBUG : FC_TRACE, 0 , " ioctl(%d, FIEMAP) successful: retrieved %" FT_ULL" extent%s in %" FT_ULL" call%s" ,
296
+ fd, (ft_ull) extent_n, extent_n == 1 ? " " : " s" , (ft_ull) ioctl_n, ioctl_n == 1 ? " " : " s" );
297
+ ret_block_size_bitmask = block_size_bitmask;
298
298
299
299
return err;
300
300
#else
0 commit comments