From 4c7fe0c7cdae7170e9ec1a6a48423dd20046500e Mon Sep 17 00:00:00 2001 From: Vitaly Fertman Date: Wed, 5 Jun 2019 17:23:40 +0300 Subject: [PATCH] LU-10070 lod: SEL: interoperability support 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 Change-Id: Ib3f0b1402cd920e56beaad78a74da485bd7ad342 Reviewed-on: https://review.whamcloud.com/35144 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Alexey Lyashkov Reviewed-by: Patrick Farrell Reviewed-by: Oleg Drokin --- lustre/include/uapi/linux/lustre/lustre_idl.h | 1 + lustre/include/uapi/linux/lustre/lustre_user.h | 1 + lustre/lod/lod_lov.c | 8 ++++-- lustre/lod/lod_object.c | 35 +++++++++++++++++++++++--- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/lustre/include/uapi/linux/lustre/lustre_idl.h b/lustre/include/uapi/linux/lustre/lustre_idl.h index 025734f..e5e9633 100644 --- a/lustre/include/uapi/linux/lustre/lustre_idl.h +++ b/lustre/include/uapi/linux/lustre/lustre_idl.h @@ -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 diff --git a/lustre/include/uapi/linux/lustre/lustre_user.h b/lustre/include/uapi/linux/lustre/lustre_user.h index 14c10f7..339714c 100644 --- a/lustre/include/uapi/linux/lustre/lustre_user.h +++ b/lustre/include/uapi/linux/lustre/lustre_user.h @@ -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*/ diff --git a/lustre/lod/lod_lov.c b/lustre/lod/lod_lov.c index aafb4a6..b37bdcf 100644 --- a/lustre/lod/lod_lov.c +++ b/lustre/lod/lod_lov.c @@ -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) diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index 27c5e8d..10bfe4d 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -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) -- 1.8.3.1