From 2a5e8e355498d432d9c4bb5cd34c513b9f3a1752 Mon Sep 17 00:00:00 2001 From: Andreas Dilger Date: Sat, 21 Sep 2024 14:42:57 -0600 Subject: [PATCH] LU-18247 nodemap: initialize unused fields on disk 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 Change-Id: I58f46396911e28f91e03a287c5b308dcaf3ebbe5 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56450 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Sebastien Buisson Reviewed-by: Timothy Day Reviewed-by: Maximilian Dilger Reviewed-by: Oleg Drokin --- lustre/include/uapi/linux/lustre/lustre_disk.h | 42 +++++++++++++------------- lustre/ptlrpc/nodemap_storage.c | 29 +++++++++++++++--- lustre/ptlrpc/wiretest.c | 24 +++++++-------- lustre/tests/sanity-sec.sh | 2 +- lustre/utils/wirecheck.c | 6 ++-- lustre/utils/wiretest.c | 24 +++++++-------- 6 files changed, 73 insertions(+), 54 deletions(-) diff --git a/lustre/include/uapi/linux/lustre/lustre_disk.h b/lustre/include/uapi/linux/lustre/lustre_disk.h index 7f0411b..e1124e5 100644 --- a/lustre/include/uapi/linux/lustre/lustre_disk.h +++ b/lustre/include/uapi/linux/lustre/lustre_disk.h @@ -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 { diff --git a/lustre/ptlrpc/nodemap_storage.c b/lustre/ptlrpc/nodemap_storage.c index 6cc3fa2..e74d028 100644 --- a/lustre/ptlrpc/nodemap_storage.c +++ b/lustre/ptlrpc/nodemap_storage.c @@ -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 */ diff --git a/lustre/ptlrpc/wiretest.c b/lustre/ptlrpc/wiretest.c index c2f33ac..c8de990 100644 --- a/lustre/ptlrpc/wiretest.c +++ b/lustre/ptlrpc/wiretest.c @@ -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", diff --git a/lustre/tests/sanity-sec.sh b/lustre/tests/sanity-sec.sh index ef841cb..b7c8c6b 100755 --- a/lustre/tests/sanity-sec.sh +++ b/lustre/tests/sanity-sec.sh @@ -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" diff --git a/lustre/utils/wirecheck.c b/lustre/utils/wirecheck.c index 536ce66..c243416 100644 --- a/lustre/utils/wirecheck.c +++ b/lustre/utils/wirecheck.c @@ -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) diff --git a/lustre/utils/wiretest.c b/lustre/utils/wiretest.c index c6e67f2..19a6d25 100644 --- a/lustre/utils/wiretest.c +++ b/lustre/utils/wiretest.c @@ -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", -- 1.8.3.1