150
160
sprintf(flags, "%.*s ", physical_width, " ");
152
if (fm_extent->fe_flags & FIEMAP_EXTENT_UNKNOWN)
153
strcat(flags, "unknown,");
154
if (fm_extent->fe_flags & FIEMAP_EXTENT_DELALLOC)
155
strcat(flags, "delalloc,");
156
if (fm_extent->fe_flags & FIEMAP_EXTENT_DATA_ENCRYPTED)
157
strcat(flags, "encrypted,");
158
if (fm_extent->fe_flags & FIEMAP_EXTENT_NOT_ALIGNED)
159
strcat(flags, "not_aligned,");
160
if (fm_extent->fe_flags & FIEMAP_EXTENT_DATA_INLINE)
161
strcat(flags, "inline,");
162
if (fm_extent->fe_flags & FIEMAP_EXTENT_DATA_TAIL)
163
strcat(flags, "tail_packed,");
164
if (fm_extent->fe_flags & FIEMAP_EXTENT_UNWRITTEN)
165
strcat(flags, "unwritten,");
166
if (fm_extent->fe_flags & FIEMAP_EXTENT_MERGED)
167
strcat(flags, "merged,");
168
if (fm_extent->fe_flags & FIEMAP_EXTENT_SHARED)
169
strcat(flags, "shared,");
171
if (fm_extent->fe_logical + fm_extent->fe_length >= (__u64) st->st_size)
162
fe_flags = fm_extent->fe_flags;
163
print_flag(&fe_flags, FIEMAP_EXTENT_LAST, flags, "last,");
164
print_flag(&fe_flags, FIEMAP_EXTENT_UNKNOWN, flags, "unknown_loc,");
165
print_flag(&fe_flags, FIEMAP_EXTENT_DELALLOC, flags, "delalloc,");
166
print_flag(&fe_flags, FIEMAP_EXTENT_ENCODED, flags, "encoded,");
167
print_flag(&fe_flags, FIEMAP_EXTENT_DATA_ENCRYPTED, flags,"encrypted,");
168
print_flag(&fe_flags, FIEMAP_EXTENT_NOT_ALIGNED, flags, "not_aligned,");
169
print_flag(&fe_flags, FIEMAP_EXTENT_DATA_INLINE, flags, "inline,");
170
print_flag(&fe_flags, FIEMAP_EXTENT_DATA_TAIL, flags, "tail_packed,");
171
print_flag(&fe_flags, FIEMAP_EXTENT_UNWRITTEN, flags, "unwritten,");
172
print_flag(&fe_flags, FIEMAP_EXTENT_MERGED, flags, "merged,");
173
print_flag(&fe_flags, FIEMAP_EXTENT_SHARED, flags, "shared,");
174
/* print any unknown flags as hex values */
175
for (mask = 1; fe_flags != 0 && mask != 0; mask <<= 1) {
178
if ((fe_flags & mask) == 0)
180
sprintf(hex, "%#04x,", mask);
181
print_flag(&fe_flags, mask, flags, hex);
184
if (fm_extent->fe_logical + fm_extent->fe_length >= st->st_size)
172
185
strcat(flags, "eof,");
174
187
/* Remove trailing comma, if any */
176
flags[strlen(flags) - 1] = '\0';
188
if (flags[0] != '\0')
189
flags[strnlen(flags, sizeof(flags)) - 1] = '\0';
178
191
printf(ext_fmt, cur_ex, logical_width, logical_blk,
179
192
logical_width, logical_blk + ext_blks,
313
329
print_extent_info(&fm_ext, *num_extents - 1,
314
330
(last_block + 1) * st->st_blksize,
316
fm_ext.fe_logical = logical;
317
fm_ext.fe_physical = block * st->st_blksize;
318
332
fm_ext.fe_length = 0;
319
333
(*num_extents)++;
320
} else if (verbose && last_block && (block != last_block + 1)) {
321
printf("Discontinuity: Block %ld is at %lu (was %lu)\n",
322
i, block, last_block + 1);
334
} else if (last_block && (block != last_block + 1)) {
336
printf("Discontinuity: Block %ld is at %lu (was "
337
"%lu)\n", i, block, last_block + 1);
338
fm_ext.fe_length = 0;
323
339
(*num_extents)++;
341
fm_ext.fe_logical = logical;
342
fm_ext.fe_physical = block * st->st_blksize;
325
343
fm_ext.fe_length += st->st_blksize;
326
344
last_block = block;
363
383
if (fstat(fd, &st) < 0) {
370
390
if (last_device != st.st_dev) {
371
391
if (fstatfs(fd, &fsinfo) < 0) {
373
393
perror("fstatfs");
396
if (ioctl(fd, FIGETBSZ, &blksize) < 0)
397
blksize = fsinfo.f_bsize;
377
399
printf("Filesystem type is: %lx\n",
378
(unsigned long) fsinfo.f_type);
380
st.st_blksize = fsinfo.f_bsize;
381
if (ioctl(fd, EXT3_IOC_GETFLAGS, &flags) < 0)
383
if (!(flags & EXT4_EXTENTS_FL) &&
384
((fsinfo.f_type == 0xef51) || (fsinfo.f_type == 0xef52) ||
385
(fsinfo.f_type == 0xef53)))
400
(unsigned long)fsinfo.f_type);
402
st.st_blksize = blksize;
403
if (fsinfo.f_type == 0xef51 || fsinfo.f_type == 0xef52 ||
404
fsinfo.f_type == 0xef53) {
407
if (ioctl(fd, EXT3_IOC_GETFLAGS, &flags) == 0 &&
408
!(flags & EXT4_EXTENTS_FL))
389
long cylgroups = div_ceil(fsinfo.f_blocks, fsinfo.f_bsize * 8);
413
long cylgroups = div_ceil(fsinfo.f_blocks, blksize * 8);
391
415
if (verbose && last_device != st.st_dev)
392
416
printf("Filesystem cylinder groups approximately %ld\n",
395
data_blocks_per_cyl = fsinfo.f_bsize * 8 -
419
data_blocks_per_cyl = blksize * 8 -
396
420
(fsinfo.f_files / 8 / cylgroups) - 3;
398
422
last_device = st.st_dev;
401
425
if (width > physical_width)
402
426
physical_width = width;
404
numblocks = (st.st_size + fsinfo.f_bsize - 1) / fsinfo.f_bsize;
428
numblocks = (st.st_size + blksize - 1) / blksize;
405
429
if (blocksize != 0)
406
430
blk_shift = int_log2(blocksize);
408
blk_shift = int_log2(fsinfo.f_bsize);
432
blk_shift = int_log2(blksize);
410
434
width = int_log10(numblocks);
411
435
if (width > logical_width)
412
436
logical_width = width;
414
printf("File size of %s is %llu (%lu block%s of %d bytes)\n",
438
printf("File size of %s is %llu (%llu block%s of %d bytes)\n",
415
439
filename, (unsigned long long)st.st_size,
416
numblocks * fsinfo.f_bsize >> blk_shift,
440
numblocks * blksize >> blk_shift,
417
441
numblocks == 1 ? "" : "s", 1 << blk_shift);
420
filefrag_fiemap(fd, blk_shift, &num_extents, &st) != 0) {
444
rc = filefrag_fiemap(fd, blk_shift, &num_extents, &st);
448
if (force_bmap || rc < 0) { /* FIEMAP failed, try FIBMAP instead */
421
449
expected = filefrag_fibmap(fd, blk_shift, &num_extents,
422
450
&st, numblocks, is_ext2);
423
451
if (expected < 0) {
424
if (errno == EINVAL || errno == ENOTTY) {
452
if (expected == -EINVAL || expected == -ENOTTY) {
425
453
fprintf(stderr, "%s: FIBMAP unsupported\n",
427
} else if (errno != EPERM) {
455
} else if (expected == -EPERM) {
457
"%s: FIBMAP requires root privileges\n",
428
460
fprintf(stderr, "%s: FIBMAP error: %s",
429
filename, strerror(errno));
461
filename, strerror(expected));
433
468
expected = expected / data_blocks_per_cyl + 1;