__u64 fe_length; /* length in bytes for this extent */
__u64 fe_reserved64[2];
__u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */
- __u32 fe_device; /* device number (fs-specific if FIEMAP_EXTENT_NET)*/
+ __u32 fe_device; /* device number (fs-specific if FIEMAP_EXTENT_NET)
+ * only use the low 16 bits */
__u32 fe_reserved[2];
};
#define FIEMAP_EXTENT_SHARED 0x00002000 /* Space shared with other
* files. */
+#define FIEMAP_EXTENT_DATA_MIRROR 0x40000000 /* indicate will start to
+ map a new mirror */
/* Network filesystem flags - use a high bit, don't conflict with upstream */
#define FIEMAP_EXTENT_NET 0x80000000 /* Data stored remotely. */
}
if (device_offset)
- sprintf(flags, "%04x: ", fm_extent->fe_device);
+ sprintf(flags, "%04x: ", fm_extent->fe_device & 0xffff);
else if (expected)
sprintf(flags, ext_fmt == hex_fmt ? "%*llx:" : "%*llu: ",
physical_width, expected >> blk_shift);
print_flag(&fe_flags, FIEMAP_EXTENT_MERGED, flags, "merged,");
print_flag(&fe_flags, FIEMAP_EXTENT_SHARED, flags, "shared,");
print_flag(&fe_flags, FIEMAP_EXTENT_NET, flags, "net,");
+ print_flag(&fe_flags, FIEMAP_EXTENT_DATA_MIRROR, flags,"");
/* print any unknown flags as hex values */
for (mask = 1; fe_flags != 0 && mask != 0; mask <<= 1) {
unsigned int i;
int fiemap_header_printed = 0;
int tot_extents = 0, n = 0;
- int previous_device = 0;
+ int previous_device = -1;
int last = 0;
int rc;
}
for (i = 0; i < fiemap->fm_mapped_extents; i++) {
- if (previous_device != fm_ext[i].fe_device)
- previous_device = fm_ext[i].fe_device;
-
expected_dense = fm_last.fe_physical +
fm_last.fe_length;
expected = fm_last.fe_physical +
fm_ext[i].fe_logical - fm_last.fe_logical;
- if (fm_ext[i].fe_logical != 0 &&
- fm_ext[i].fe_physical != expected &&
- fm_ext[i].fe_physical != expected_dense) {
+ if ((fm_ext[i].fe_logical != 0 &&
+ fm_ext[i].fe_physical != expected &&
+ fm_ext[i].fe_physical != expected_dense) ||
+ ((fm_ext[i].fe_device & 0xffff) != previous_device)) {
tot_extents++;
} else {
expected = 0;
last = 1;
fm_last = fm_ext[i];
n++;
+ if (previous_device != (fm_ext[i].fe_device & 0xffff))
+ previous_device = fm_ext[i].fe_device & 0xffff;
+
}
/* For DEVICE_ORDER mappings, if EXTENT_LAST not yet found then
if (flags & FIEMAP_FLAG_DEVICE_ORDER) {
fm_ext[0].fe_logical = fm_ext[i - 1].fe_logical +
fm_ext[i - 1].fe_length;
- fm_ext[0].fe_device = fm_ext[i - 1].fe_device;
- fiemap->fm_start = 0;
+ fm_ext[0].fe_device &= 0xffff0000;
+ fm_ext[0].fe_device |= fm_ext[i - 1].fe_device & 0xffff;
+ if (fm_ext[i - 1].fe_flags & FIEMAP_EXTENT_DATA_MIRROR) {
+ fiemap->fm_start = 0;
+ fm_ext[0].fe_logical = 0;
+ }
} else {
fiemap->fm_start = fm_ext[i - 1].fe_logical +
fm_ext[i - 1].fe_length;
memset(&fm_ext, 0, sizeof(fm_ext));
memset(&fm_last, 0, sizeof(fm_last));
if (force_extent) {
- fm_ext.fe_device = st->st_dev;
+ fm_ext.fe_device &= 0xffff0000;
+ fm_ext.fe_device |= st->st_dev;
fm_ext.fe_flags = FIEMAP_EXTENT_MERGED;
}