Whamcloud - gitweb
LU-10070 lod: SEL: interoperability support 44/35144/8
authorVitaly Fertman <c17818@cray.com>
Wed, 5 Jun 2019 14:23:40 +0000 (17:23 +0300)
committerOleg Drokin <green@whamcloud.com>
Fri, 12 Jul 2019 05:22:08 +0000 (05:22 +0000)
Add a new SEL magic for storing SEL components on disk.
It is never gets out of LOD, converted on read/write to COMP_V1.
A the result, old MDS is not able to open SEL files.
At the same time old clients are able to work with existing files
seamlessly. Old clients still lacks lustre utils support, thus not
possible to create new SEL files, etc.

Cray-bug-id: LUS-2528
Signed-off-by: Vitaly Fertman <c17818@cray.com>
Change-Id: Ib3f0b1402cd920e56beaad78a74da485bd7ad342
Reviewed-on: https://review.whamcloud.com/35144
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Alexey Lyashkov <c17817@cray.com>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/uapi/linux/lustre/lustre_idl.h
lustre/include/uapi/linux/lustre/lustre_user.h
lustre/lod/lod_lov.c
lustre/lod/lod_object.c

index 025734f..e5e9633 100644 (file)
@@ -1118,6 +1118,7 @@ enum obdo_flags {
 #define LOV_MAGIC              LOV_MAGIC_V1
 #define LOV_MAGIC_COMP_V1      (0x0BD60000 | LOV_MAGIC_MAGIC)
 #define LOV_MAGIC_FOREIGN      (0x0BD70000 | LOV_MAGIC_MAGIC)
+#define LOV_MAGIC_SEL          (0x0BD80000 | LOV_MAGIC_MAGIC)
 
 /*
  * magic for fully defined striping
index 14c10f7..339714c 100644 (file)
@@ -555,6 +555,7 @@ struct fsxattr {
 #define LOV_USER_MAGIC_SPECIFIC 0x0BD50BD0     /* for specific OSTs */
 #define LOV_USER_MAGIC_COMP_V1 0x0BD60BD0
 #define LOV_USER_MAGIC_FOREIGN 0x0BD70BD0
+#define LOV_USER_MAGIC_SEL     0x0BD80BD0
 
 #define LMV_USER_MAGIC         0x0CD30CD0    /* default lmv magic */
 #define LMV_USER_MAGIC_V0      0x0CD20CD0    /* old default lmv magic*/
index aafb4a6..b37bdcf 100644 (file)
@@ -1013,6 +1013,9 @@ int lod_generate_lovea(const struct lu_env *env, struct lod_object *lo,
                if (lod_comp->llc_flags & LCME_FL_NOSYNC)
                        lcme->lcme_timestamp =
                                cpu_to_le64(lod_comp->llc_timestamp);
+               if (lod_comp->llc_flags & LCME_FL_EXTENSION)
+                       lcm->lcm_magic = cpu_to_le32(LOV_MAGIC_SEL);
+
                lcme->lcme_extent.e_start =
                        cpu_to_le64(lod_comp->llc_extent.e_start);
                lcme->lcme_extent.e_end =
@@ -1270,7 +1273,8 @@ int lod_parse_striping(const struct lu_env *env, struct lod_object *lo,
        magic = le32_to_cpu(lmm->lmm_magic);
 
        if (magic != LOV_MAGIC_V1 && magic != LOV_MAGIC_V3 &&
-           magic != LOV_MAGIC_COMP_V1 && magic != LOV_MAGIC_FOREIGN)
+           magic != LOV_MAGIC_COMP_V1 && magic != LOV_MAGIC_FOREIGN &&
+           magic != LOV_MAGIC_SEL)
                GOTO(out, rc = -EINVAL);
 
        if (lo->ldo_is_foreign)
@@ -1278,7 +1282,7 @@ int lod_parse_striping(const struct lu_env *env, struct lod_object *lo,
        else
                lod_free_comp_entries(lo);
 
-       if (magic == LOV_MAGIC_COMP_V1) {
+       if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                comp_v1 = (struct lov_comp_md_v1 *)lmm;
                comp_cnt = le16_to_cpu(comp_v1->lcm_entry_count);
                if (comp_cnt == 0)
index 27c5e8d..10bfe4d 100644 (file)
@@ -1419,7 +1419,7 @@ static int lod_attr_set(const struct lu_env *env,
                buf->lb_len = info->lti_ea_store_size;
                lmm = info->lti_ea_store;
                magic = le32_to_cpu(lmm->lmm_magic);
-               if (magic == LOV_MAGIC_COMP_V1) {
+               if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) {
                        struct lov_comp_md_v1 *lcm = buf->lb_buf;
                        struct lov_comp_md_entry_v1 *lcme =
                                                &lcm->lcm_entries[0];
@@ -1453,7 +1453,8 @@ static int lod_attr_set(const struct lu_env *env,
                buf->lb_buf = info->lti_ea_store;
                buf->lb_len = info->lti_ea_store_size;
                lcm = buf->lb_buf;
-               if (le32_to_cpu(lcm->lcm_magic) != LOV_MAGIC_COMP_V1)
+               if (le32_to_cpu(lcm->lcm_magic) != LOV_MAGIC_COMP_V1 &&
+                   le32_to_cpu(lcm->lcm_magic) != LOV_MAGIC_SEL)
                        RETURN(-EINVAL);
 
                le32_add_cpu(&lcm->lcm_layout_gen, 1);
@@ -1543,6 +1544,13 @@ static int lod_xattr_get(const struct lu_env *env, struct dt_object *dt,
                RETURN(rc = rc1 != 0 ? rc1 : rc);
        }
 
+       if ((rc > 0) && buf->lb_buf && strcmp(name, XATTR_NAME_LOV) == 0) {
+               struct lov_comp_md_v1 *lcm = buf->lb_buf;
+
+               if (lcm->lcm_magic == cpu_to_le32(LOV_MAGIC_SEL))
+                       lcm->lcm_magic = cpu_to_le32(LOV_MAGIC_COMP_V1);
+       }
+
        if (rc != -ENODATA || !S_ISDIR(dt->do_lu.lo_header->loh_attr & S_IFMT))
                RETURN(rc);
 
@@ -3264,6 +3272,7 @@ static int lod_declare_layout_merge(const struct lu_env *env,
                rc = lod_layout_convert(info);
                break;
        case LOV_MAGIC_COMP_V1:
+       case LOV_MAGIC_SEL:
                rc = 0;
                break;
        default:
@@ -3630,8 +3639,23 @@ static int lod_xattr_set_lov_on_dir(const struct lu_env *env,
                                             pool_name);
                break;
        case LOV_USER_MAGIC_COMP_V1:
+       {
+               struct lov_comp_md_v1 *lcm = (struct lov_comp_md_v1 *)lum;
+               struct lov_comp_md_entry_v1 *lcme;
+               int i, comp_cnt;
+
+               comp_cnt = le16_to_cpu(lcm->lcm_entry_count);
+               for (i = 0; i < comp_cnt; i++) {
+                       lcme = &lcm->lcm_entries[i];
+                       if (lcme->lcme_flags & cpu_to_le32(LCME_FL_EXTENSION)) {
+                               lcm->lcm_magic = cpu_to_le32(LOV_MAGIC_SEL);
+                               break;
+                       }
+               }
+
                is_del = false;
                break;
+       }
        default:
                CERROR("Invalid magic %x\n", lum->lmm_magic);
                RETURN(-EINVAL);
@@ -4783,17 +4807,20 @@ static int lod_get_default_lov_striping(const struct lu_env *env,
                lustre_swab_lov_user_md_v3(v3);
                lustre_swab_lov_user_md_objects(v3->lmm_objects,
                                                v3->lmm_stripe_count);
-       } else if (v1->lmm_magic == __swab32(LOV_USER_MAGIC_COMP_V1)) {
+       } else if (v1->lmm_magic == __swab32(LOV_USER_MAGIC_COMP_V1) ||
+                  v1->lmm_magic == __swab32(LOV_USER_MAGIC_SEL)) {
                comp_v1 = (struct lov_comp_md_v1 *)v1;
                lustre_swab_lov_comp_md_v1(comp_v1);
        }
 
        if (v1->lmm_magic != LOV_MAGIC_V3 && v1->lmm_magic != LOV_MAGIC_V1 &&
            v1->lmm_magic != LOV_MAGIC_COMP_V1 &&
+           v1->lmm_magic != LOV_MAGIC_SEL &&
            v1->lmm_magic != LOV_USER_MAGIC_SPECIFIC)
                RETURN(-ENOTSUPP);
 
-       if (v1->lmm_magic == LOV_MAGIC_COMP_V1) {
+       if (v1->lmm_magic == LOV_MAGIC_COMP_V1 ||
+           v1->lmm_magic == LOV_MAGIC_SEL) {
                comp_v1 = (struct lov_comp_md_v1 *)v1;
                comp_cnt = comp_v1->lcm_entry_count;
                if (comp_cnt == 0)