Whamcloud - gitweb
filefrag: support PFL and FLR file 65/40765/3
authorBobi Jam <bobijam@whamcloud.com>
Thu, 26 Nov 2020 06:29:30 +0000 (14:29 +0800)
committerAndreas Dilger <adilger@whamcloud.com>
Tue, 1 Dec 2020 08:09:17 +0000 (08:09 +0000)
Add FIEMAP_EXTENT_DATA_MIRROR support FLR file, which is returned
from Lustre indicating that a new mirror will be processed, so we'd
reset the fm_start and fe_logical.

Change-Id: Ifa68d951ac68d9f141eae915e58c13d73833c8c9
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/40765
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Wang Shilong <wshilong@whamcloud.com>
Tested-by: Andreas Dilger <adilger@whamcloud.com>
lib/ext2fs/fiemap.h
misc/filefrag.c

index fc022c0..4df139d 100644 (file)
@@ -19,7 +19,8 @@ struct fiemap_extent {
        __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];
 };
 
@@ -76,6 +77,8 @@ struct fiemap {
 #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. */
 
index 52fb65d..bb69cfd 100644 (file)
@@ -164,7 +164,7 @@ static void print_extent_info(struct fiemap_extent *fm_extent, int cur_ex,
        }
 
        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);
@@ -182,6 +182,7 @@ static void print_extent_info(struct fiemap_extent *fm_extent, int cur_ex,
        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) {
@@ -223,7 +224,7 @@ static int filefrag_fiemap(int fd, int blk_shift, int *num_extents,
        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;
 
@@ -274,16 +275,14 @@ retry_wo_device_order:
                }
 
                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;
@@ -297,6 +296,9 @@ retry_wo_device_order:
                                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
@@ -307,8 +309,12 @@ retry_wo_device_order:
                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;
@@ -336,7 +342,8 @@ static int filefrag_fibmap(int fd, int blk_shift, int *num_extents,
        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;
        }