Whamcloud - gitweb
LU-17908 layout: preserve non-FLR state layout flags 19/55319/5
authorBobi Jam <bobijam@whamcloud.com>
Wed, 5 Jun 2024 13:46:27 +0000 (21:46 +0800)
committerOleg Drokin <green@whamcloud.com>
Thu, 2 Jan 2025 20:41:05 +0000 (20:41 +0000)
lfsck and layout split/merge would set FLR state but ditch non-FLR
flags in error, this patch preserves them.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I7a8717756fba09ba10635bb3fbeed6afb4ed73a8
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/55319
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lustre/lfsck/lfsck_layout.c
lustre/lod/lod_object.c
lustre/mdd/mdd_object.c

index 2844b21..cf0f336 100644 (file)
@@ -1938,9 +1938,10 @@ static void lfsck_layout_update_lcm(struct lov_comp_md_v1 *lcm,
        __u64 end = le64_to_cpu(lcme->lcme_extent.e_end);
        __u32 gen = version + range;
        __u32 tmp_gen;
-       int i;
        __u16 count = le16_to_cpu(lcm->lcm_entry_count);
        __u16 flags = le16_to_cpu(lcm->lcm_flags);
+       __u16 flr_state = flags & LCM_FL_FLR_MASK;
+       int i;
 
        if (!gen)
                gen = 1;
@@ -1949,9 +1950,12 @@ static void lfsck_layout_update_lcm(struct lov_comp_md_v1 *lcm,
                lcm->lcm_layout_gen = cpu_to_le32(gen);
 
        if (range)
-               lcm->lcm_flags = cpu_to_le16(LCM_FL_WRITE_PENDING);
-       else if (flags == LCM_FL_NONE && le16_to_cpu(lcm->lcm_mirror_count) > 0)
-               lcm->lcm_flags = cpu_to_le16(LCM_FL_RDONLY);
+               lcm->lcm_flags = cpu_to_le16((flags & ~LCM_FL_FLR_MASK) |
+                                            LCM_FL_WRITE_PENDING);
+       else if (flr_state == LCM_FL_NONE &&
+                le16_to_cpu(lcm->lcm_mirror_count) > 0)
+               lcm->lcm_flags = cpu_to_le16((flags & ~LCM_FL_FLR_MASK) |
+                                            LCM_FL_RDONLY);
 
        for (i = 0; i < count; i++) {
                tmp = &lcm->lcm_entries[i];
index edf893b..130d057 100644 (file)
@@ -3508,7 +3508,9 @@ static int lod_declare_layout_merge(const struct lu_env *env,
        lcm->lcm_entry_count = cpu_to_le16(cur_entry_count + merge_entry_count);
        lcm->lcm_mirror_count = cpu_to_le16(mirror_count);
        if ((le16_to_cpu(lcm->lcm_flags) & LCM_FL_FLR_MASK) == LCM_FL_NONE)
-               lcm->lcm_flags = cpu_to_le32(LCM_FL_RDONLY);
+               lcm->lcm_flags = cpu_to_le16((le16_to_cpu(lcm->lcm_flags) &
+                                             ~LCM_FL_FLR_MASK) |
+                                            LCM_FL_RDONLY);
 
        rc = lod_striping_reload(env, lo, buf, 0);
        if (rc)
index fc9dc13..c497833 100644 (file)
@@ -1816,14 +1816,16 @@ static int mdd_split_ea(struct lov_comp_md_v1 *comp_v1, __u16 mirror_id,
        comp_rem->lcm_entry_count = cpu_to_le32(comp_cnt - count);
        comp_rem->lcm_size = cpu_to_le32(lmm_size - lmm_size_vic);
        if (!comp_rem->lcm_mirror_count)
-               comp_rem->lcm_flags = cpu_to_le16(LCM_FL_NONE);
+               comp_rem->lcm_flags = cpu_to_le16(comp_rem->lcm_flags &
+                                                 ~LCM_FL_FLR_MASK);
 
        memset(comp_vic, 0, sizeof(*comp_v1));
        comp_vic->lcm_magic = cpu_to_le32(LOV_MAGIC_COMP_V1);
        comp_vic->lcm_mirror_count = 0;
        comp_vic->lcm_entry_count = cpu_to_le32(count);
        comp_vic->lcm_size = cpu_to_le32(lmm_size_vic + sizeof(*comp_vic));
-       comp_vic->lcm_flags = cpu_to_le16(LCM_FL_NONE);
+       comp_vic->lcm_flags = cpu_to_le16(comp_vic->lcm_flags &
+                                         ~LCM_FL_FLR_MASK);
        comp_vic->lcm_layout_gen = 0;
 
        offset = sizeof(*comp_v1) + sizeof(*entry) * comp_cnt;