Whamcloud - gitweb
LU-18247 nodemap: initialize unused fields on disk 50/56450/5
authorAndreas Dilger <adilger@whamcloud.com>
Sat, 21 Sep 2024 20:42:57 +0000 (14:42 -0600)
committerOleg Drokin <green@whamcloud.com>
Tue, 8 Oct 2024 06:20:26 +0000 (06:20 +0000)
Initialize the unused fields in the on-disk nodemap records to zero.
This will allow them to be used in the future for expanded nodemap
functionality.

It may be that initial usage will also depend on storing a magic
into one of the fields so that the rest of the fields can be trusted.

Test-Parameters: trivial testlist=sanity-sec
Test-Parameters: testlist=sanity-quota
Test-Parameters: testlist=sanity-selinux
Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Change-Id: I58f46396911e28f91e03a287c5b308dcaf3ebbe5
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56450
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Sebastien Buisson <sbuisson@ddn.com>
Reviewed-by: Timothy Day <timday@amazon.com>
Reviewed-by: Maximilian Dilger <mdilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/uapi/linux/lustre/lustre_disk.h
lustre/ptlrpc/nodemap_storage.c
lustre/ptlrpc/wiretest.c
lustre/tests/sanity-sec.sh
lustre/utils/wirecheck.c
lustre/utils/wiretest.c

index 7f0411b..e1124e5 100644 (file)
@@ -271,7 +271,7 @@ struct nodemap_cluster_rec {
        char                    ncr_name[LUSTRE_NODEMAP_NAME_LENGTH + 1];
        enum nm_flag_bits       ncr_flags:8;
        enum nm_flag2_bits      ncr_flags2:8;
-       __u8                    ncr_padding1;
+       __u8                    ncr_padding1;   /* zeroed since 2.16 */
        __u32                   ncr_squash_projid;
        __u32                   ncr_squash_uid;
        __u32                   ncr_squash_gid;
@@ -281,42 +281,42 @@ struct nodemap_cluster_rec {
 struct nodemap_range_rec {
        lnet_nid_t      nrr_start_nid;
        lnet_nid_t      nrr_end_nid;
-       __u64           nrr_padding1;
-       __u64           nrr_padding2;
+       __u64           nrr_padding1;   /* zeroed since 2.16 */
+       __u64           nrr_padding2;   /* zeroed since 2.16 */
 };
 
 struct nodemap_range2_rec {
        struct lnet_nid nrr_nid_prefix;
-       __u32           nrr_padding1; /* these fields may be used if */
-       __u32           nrr_padding2; /* nrr_nid_prefix.nid_size > 12 */
-       __u16           nrr_padding3;
-       __u8            nrr_padding4;
+       __u32           nrr_padding1;   /* padding may be used for nid_prefix */
+       __u32           nrr_padding2;   /* if nrr_nid_prefix.nid_size > 12 */
+       __u16           nrr_padding3;   /* zeroed since 2.16 */
+       __u8            nrr_padding4;   /* zeroed since 2.16 */
        __u8            nrr_netmask;
 };
 
 struct nodemap_id_rec {
        __u32   nir_id_fs;
-       __u32   nir_padding1;
-       __u64   nir_padding2;
-       __u64   nir_padding3;
-       __u64   nir_padding4;
+       __u32   nir_padding1;           /* zeroed since 2.16 */
+       __u64   nir_padding2;           /* zeroed since 2.16 */
+       __u64   nir_padding3;           /* zeroed since 2.16 */
+       __u64   nir_padding4;           /* zeroed since 2.16 */
 };
 
 struct nodemap_global_rec {
        __u8    ngr_is_active;
-       __u8    ngr_padding1;
-       __u16   ngr_padding2;
-       __u32   ngr_padding3;
-       __u64   ngr_padding4;
-       __u64   ngr_padding5;
-       __u64   ngr_padding6;
+       __u8    ngr_padding1;           /* zeroed since 2.16 */
+       __u16   ngr_padding2;           /* zeroed since 2.16 */
+       __u32   ngr_padding3;           /* zeroed since 2.16 */
+       __u64   ngr_padding4;           /* zeroed since 2.16 */
+       __u64   ngr_padding5;           /* zeroed since 2.16 */
+       __u64   ngr_padding6;           /* zeroed since 2.16 */
 };
 
 struct nodemap_cluster_roles_rec {
-       __u64 ncrr_roles;       /* enum nodemap_rbac_roles */
-       __u64 ncrr_unused1;
-       __u64 ncrr_unused2;
-       __u64 ncrr_unused3;
+       __u64 ncrr_roles;               /* enum nodemap_rbac_roles */
+       __u64 ncrr_padding1;            /* zeroed since 2.16 (always) */
+       __u64 ncrr_padding2;            /* zeroed since 2.16 (always) */
+       __u64 ncrr_padding3;            /* zeroed since 2.16 (always) */
 };
 
 union nodemap_rec {
index 6cc3fa2..e74d028 100644 (file)
@@ -87,10 +87,7 @@ static void nodemap_cluster_rec_init(union nodemap_rec *nr,
 {
        BUILD_BUG_ON(sizeof(nr->ncr.ncr_name) != sizeof(nodemap->nm_name));
 
-       strncpy(nr->ncr.ncr_name, nodemap->nm_name, sizeof(nr->ncr.ncr_name));
-       nr->ncr.ncr_squash_uid = cpu_to_le32(nodemap->nm_squash_uid);
-       nr->ncr.ncr_squash_gid = cpu_to_le32(nodemap->nm_squash_gid);
-       nr->ncr.ncr_squash_projid = cpu_to_le32(nodemap->nm_squash_projid);
+       strscpy(nr->ncr.ncr_name, nodemap->nm_name, sizeof(nr->ncr.ncr_name));
        nr->ncr.ncr_flags =
                (nodemap->nmf_trust_client_ids ?
                        NM_FL_TRUST_CLIENT_IDS : 0) |
@@ -111,6 +108,10 @@ static void nodemap_cluster_rec_init(union nodemap_rec *nr,
        nr->ncr.ncr_flags2 =
                (nodemap->nmf_readonly_mount ?
                        NM_FL2_READONLY_MOUNT : 0);
+       nr->ncr.ncr_padding1 = 0;
+       nr->ncr.ncr_squash_projid = cpu_to_le32(nodemap->nm_squash_projid);
+       nr->ncr.ncr_squash_uid = cpu_to_le32(nodemap->nm_squash_uid);
+       nr->ncr.ncr_squash_gid = cpu_to_le32(nodemap->nm_squash_gid);
 }
 
 static void nodemap_cluster_roles_rec_init(union nodemap_rec *nr,
@@ -118,8 +119,10 @@ static void nodemap_cluster_roles_rec_init(union nodemap_rec *nr,
 {
        struct nodemap_cluster_roles_rec *ncrr = &nr->ncrr;
 
-       memset(ncrr, 0, sizeof(struct nodemap_cluster_roles_rec));
        ncrr->ncrr_roles = cpu_to_le64(nodemap->nmf_rbac);
+       ncrr->ncrr_padding1 = 0;
+       ncrr->ncrr_padding2 = 0;
+       ncrr->ncrr_padding3 = 0;
 }
 
 static void nodemap_idmap_key_init(struct nodemap_key *nk, unsigned int nm_id,
@@ -144,6 +147,10 @@ static void nodemap_idmap_key_init(struct nodemap_key *nk, unsigned int nm_id,
 static void nodemap_idmap_rec_init(union nodemap_rec *nr, u32 id_fs)
 {
        nr->nir.nir_id_fs = cpu_to_le32(id_fs);
+       nr->nir.nir_padding1 = 0;
+       nr->nir.nir_padding2 = 0;
+       nr->nir.nir_padding3 = 0;
+       nr->nir.nir_padding4 = 0;
 }
 
 static void nodemap_range_key_init(struct nodemap_key *nk,
@@ -159,6 +166,10 @@ static int nodemap_range_rec_init(union nodemap_rec *nr,
 {
        if (range->rn_netmask) {
                nr->nrr2.nrr_nid_prefix = range->rn_start;
+               nr->nrr2.nrr_padding1 = 0;
+               nr->nrr2.nrr_padding2 = 0;
+               nr->nrr2.nrr_padding3 = 0;
+               nr->nrr2.nrr_padding4 = 0;
                nr->nrr2.nrr_netmask = range->rn_netmask;
 
                if (NID_BYTES(&nr->nrr2.nrr_nid_prefix) >
@@ -175,6 +186,8 @@ static int nodemap_range_rec_init(union nodemap_rec *nr,
                nid4[1] = lnet_nid_to_nid4(&range->rn_end);
                nr->nrr.nrr_start_nid = cpu_to_le64(nid4[0]);
                nr->nrr.nrr_end_nid = cpu_to_le64(nid4[1]);
+               nr->nrr.nrr_padding1 = 0;
+               nr->nrr.nrr_padding2 = 0;
        }
 
        return 0;
@@ -189,6 +202,12 @@ static void nodemap_global_key_init(struct nodemap_key *nk)
 static void nodemap_global_rec_init(union nodemap_rec *nr, bool active)
 {
        nr->ngr.ngr_is_active = active;
+       nr->ngr.ngr_padding1 = 0;
+       nr->ngr.ngr_padding2 = 0;
+       nr->ngr.ngr_padding3 = 0;
+       nr->ngr.ngr_padding4 = 0;
+       nr->ngr.ngr_padding5 = 0;
+       nr->ngr.ngr_padding6 = 0;
 }
 
 /* should be called with dt_write lock */
index c2f33ac..c8de990 100644 (file)
@@ -6335,18 +6335,18 @@ void lustre_assert_wire_constants(void)
                 (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_roles));
        LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_roles) == 8, "found %lld\n",
                 (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_roles));
-       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused1) == 8, "found %lld\n",
-                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused1));
-       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused1) == 8, "found %lld\n",
-                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused1));
-       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused2) == 16, "found %lld\n",
-                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused2));
-       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused2) == 8, "found %lld\n",
-                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused2));
-       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused3) == 24, "found %lld\n",
-                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused3));
-       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused3) == 8, "found %lld\n",
-                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused3));
+       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding1) == 8, "found %lld\n",
+                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding1));
+       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding1) == 8, "found %lld\n",
+                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding1));
+       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding2) == 16, "found %lld\n",
+                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding2));
+       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding2) == 8, "found %lld\n",
+                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding2));
+       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding3) == 24, "found %lld\n",
+                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding3));
+       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding3) == 8, "found %lld\n",
+                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding3));
 
        /* Checks for union nodemap_rec */
        LASSERTF((int)sizeof(union nodemap_rec) == 32, "found %lld\n",
index ef841cb..b7c8c6b 100755 (executable)
@@ -18,7 +18,7 @@ ALWAYS_EXCEPT="$SANITY_SEC_EXCEPT "
 
 [[ "$SLOW" == "no" ]] && EXCEPT_SLOW="26"
 
-NODEMAP_TESTS=$(seq 7 26)
+NODEMAP_TESTS={7..26}
 
 if ! check_versions; then
        echo "It is NOT necessary to test nodemap under interoperation mode"
index 536ce66..c243416 100644 (file)
@@ -2972,9 +2972,9 @@ static void check_nodemap_cluster_roles_rec(void)
        BLANK_LINE();
        CHECK_STRUCT(nodemap_cluster_roles_rec);
        CHECK_MEMBER(nodemap_cluster_roles_rec, ncrr_roles);
-       CHECK_MEMBER(nodemap_cluster_roles_rec, ncrr_unused1);
-       CHECK_MEMBER(nodemap_cluster_roles_rec, ncrr_unused2);
-       CHECK_MEMBER(nodemap_cluster_roles_rec, ncrr_unused3);
+       CHECK_MEMBER(nodemap_cluster_roles_rec, ncrr_padding1);
+       CHECK_MEMBER(nodemap_cluster_roles_rec, ncrr_padding2);
+       CHECK_MEMBER(nodemap_cluster_roles_rec, ncrr_padding3);
 }
 
 static void check_nodemap_rec(void)
index c6e67f2..19a6d25 100644 (file)
@@ -6360,18 +6360,18 @@ void lustre_assert_wire_constants(void)
                 (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_roles));
        LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_roles) == 8, "found %lld\n",
                 (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_roles));
-       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused1) == 8, "found %lld\n",
-                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused1));
-       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused1) == 8, "found %lld\n",
-                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused1));
-       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused2) == 16, "found %lld\n",
-                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused2));
-       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused2) == 8, "found %lld\n",
-                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused2));
-       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused3) == 24, "found %lld\n",
-                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_unused3));
-       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused3) == 8, "found %lld\n",
-                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_unused3));
+       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding1) == 8, "found %lld\n",
+                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding1));
+       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding1) == 8, "found %lld\n",
+                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding1));
+       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding2) == 16, "found %lld\n",
+                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding2));
+       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding2) == 8, "found %lld\n",
+                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding2));
+       LASSERTF((int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding3) == 24, "found %lld\n",
+                (long long)(int)offsetof(struct nodemap_cluster_roles_rec, ncrr_padding3));
+       LASSERTF((int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding3) == 8, "found %lld\n",
+                (long long)(int)sizeof(((struct nodemap_cluster_roles_rec *)0)->ncrr_padding3));
 
        /* Checks for union nodemap_rec */
        LASSERTF((int)sizeof(union nodemap_rec) == 32, "found %lld\n",