From e56829645671de4d7fc628e075cdade840e89f80 Mon Sep 17 00:00:00 2001 From: Andreas Dilger Date: Fri, 9 Aug 2024 16:24:00 -0600 Subject: [PATCH] LU-18108 idl: deprecate rr_mirror_id usage The rr_mirror_id_old field used the last reserved field in struct mdt_rec_reint but is unused for any other reint type. There are lots of unused fields in this struct that could be used instead, so rr_umask was chosen for rs_mirror_id_new since it is unlikely that a file resync will ever need it. The other rs_padding fields could potentially be needed at some point (timestamps or size/blocks) so they were not used. This field is only used by "lfs mirror resync" operations, so its usage is limited during normal operations, and only in a few small functions, so the impact of this change is minimal. It still needs interoperability, but the number of sites using FLR mirroring is still not very widespread even today, so will help shorten the time that interop needs to be maintained, but I didn't add a LUSTRE_VERSION_CODE check for this yet. After the rr_mirror_id_old field is no longer being used, it could revert to a single __u32 and be used for something else. Test-Parameters: testlist=sanity-flr serverversion=2.15 Test-Parameters: testlist=sanity-flr clientversion=2.15 Fixes: 14171e787d ("LU-10258 lfs: lfs mirror write command") Signed-off-by: Andreas Dilger Change-Id: I5b760d3bb359ff28ca5c2b299880f00e953ebbe5 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/55988 Reviewed-by: Oleg Drokin Reviewed-by: Lai Siyao Reviewed-by: Feng Lei Tested-by: jenkins Tested-by: Maloo --- lustre/include/lustre_export.h | 41 +++++++++++++-------------- lustre/include/uapi/linux/lustre/lustre_idl.h | 19 ++++++++++--- lustre/llite/llite_lib.c | 3 +- lustre/mdc/mdc_reint.c | 5 +++- lustre/mdt/mdt_lib.c | 11 +++++-- lustre/obdclass/lprocfs_status.c | 2 ++ lustre/ptlrpc/pack_generic.c | 2 +- lustre/ptlrpc/wiretest.c | 26 +++++++++-------- lustre/utils/wirecheck.c | 7 +++-- lustre/utils/wiretest.c | 26 +++++++++-------- 10 files changed, 84 insertions(+), 58 deletions(-) diff --git a/lustre/include/lustre_export.h b/lustre/include/lustre_export.h index 2bd89e8..48a162d 100644 --- a/lustre/include/lustre_export.h +++ b/lustre/include/lustre_export.h @@ -352,56 +352,58 @@ static inline int exp_max_brw_size(struct obd_export *exp) return ONE_MB_BRW_SIZE; } -static inline int exp_connect_multibulk(struct obd_export *exp) +static inline bool exp_connect_multibulk(struct obd_export *exp) { return exp_max_brw_size(exp) > ONE_MB_BRW_SIZE; } -static inline int exp_connect_cancelset(struct obd_export *exp) +static inline bool exp_connect_cancelset(struct obd_export *exp) { LASSERT(exp != NULL); - return !!(exp_connect_flags(exp) & OBD_CONNECT_CANCELSET); + return exp_connect_flags(exp) & OBD_CONNECT_CANCELSET; } -static inline int exp_connect_lru_resize(struct obd_export *exp) +static inline bool exp_connect_lru_resize(struct obd_export *exp) { LASSERT(exp != NULL); - return !!(exp_connect_flags(exp) & OBD_CONNECT_LRU_RESIZE); + return exp_connect_flags(exp) & OBD_CONNECT_LRU_RESIZE; } -static inline int exp_connect_vbr(struct obd_export *exp) +static inline bool exp_connect_vbr(struct obd_export *exp) { LASSERT(exp != NULL); LASSERT(exp->exp_connection); - return !!(exp_connect_flags(exp) & OBD_CONNECT_VBR); + return exp_connect_flags(exp) & OBD_CONNECT_VBR; } -static inline int exp_connect_umask(struct obd_export *exp) +static inline bool exp_connect_umask(struct obd_export *exp) { - return !!(exp_connect_flags(exp) & OBD_CONNECT_UMASK); + return exp_connect_flags(exp) & OBD_CONNECT_UMASK; } -static inline int imp_connect_lru_resize(struct obd_import *imp) +static inline bool imp_connect_lru_resize(struct obd_import *imp) { struct obd_connect_data *ocd; LASSERT(imp != NULL); ocd = &imp->imp_connect_data; - return !!(ocd->ocd_connect_flags & OBD_CONNECT_LRU_RESIZE); + return ocd->ocd_connect_flags & OBD_CONNECT_LRU_RESIZE; } -static inline int exp_connect_layout(struct obd_export *exp) +static inline bool exp_connect_layout(struct obd_export *exp) { - return !!(exp_connect_flags(exp) & OBD_CONNECT_LAYOUTLOCK); + return exp_connect_flags(exp) & OBD_CONNECT_LAYOUTLOCK; } static inline bool exp_connect_lvb_type(struct obd_export *exp) { LASSERT(exp != NULL); - if (exp_connect_flags(exp) & OBD_CONNECT_LVB_TYPE) - return true; - else - return false; + return exp_connect_flags(exp) & OBD_CONNECT_LVB_TYPE; +} + +static inline bool exp_connect_mirror_id_fix(struct obd_export *exp) +{ + return exp_connect_flags2(exp) & OBD_CONNECT2_MIRROR_ID_FIX; } static inline bool imp_connect_lvb_type(struct obd_import *imp) @@ -410,10 +412,7 @@ static inline bool imp_connect_lvb_type(struct obd_import *imp) LASSERT(imp != NULL); ocd = &imp->imp_connect_data; - if (ocd->ocd_connect_flags & OBD_CONNECT_LVB_TYPE) - return true; - else - return false; + return ocd->ocd_connect_flags & OBD_CONNECT_LVB_TYPE; } static inline bool imp_connect_disp_stripe(struct obd_import *imp) diff --git a/lustre/include/uapi/linux/lustre/lustre_idl.h b/lustre/include/uapi/linux/lustre/lustre_idl.h index d4ca65c..34811b96 100644 --- a/lustre/include/uapi/linux/lustre/lustre_idl.h +++ b/lustre/include/uapi/linux/lustre/lustre_idl.h @@ -866,6 +866,7 @@ struct ptlrpc_body_v2 { */ #define OBD_CONNECT2_UNALIGNED_DIO 0x400000000ULL /* unaligned DIO */ #define OBD_CONNECT2_CONN_POLICY 0x800000000ULL /* server-side connection policy */ +#define OBD_CONNECT2_MIRROR_ID_FIX 0x2000000000ULL /* rr_mirror_id move */ /* XXX README XXX README XXX README XXX README XXX README XXX README XXX * Please DO NOT add OBD_CONNECT flags before first ensuring that this value * is not in use by some other branch/patch. Email adilger@whamcloud.com @@ -936,7 +937,8 @@ struct ptlrpc_body_v2 { OBD_CONNECT2_ENCRYPT_FID2PATH | \ OBD_CONNECT2_DMV_IMP_INHERIT |\ OBD_CONNECT2_UNALIGNED_DIO | \ - OBD_CONNECT2_PCCRO) + OBD_CONNECT2_PCCRO | \ + OBD_CONNECT2_MIRROR_ID_FIX) #define OST_CONNECT_SUPPORTED (OBD_CONNECT_SRVLOCK | OBD_CONNECT_GRANT | \ OBD_CONNECT_REQPORTAL | OBD_CONNECT_VERSION | \ @@ -2236,8 +2238,16 @@ struct mdt_rec_resync { __u32 rs_padding5; /* rr_mode */ __u32 rs_padding6; /* rr_flags */ __u32 rs_padding7; /* rr_flags_h */ - __u32 rs_padding8; /* rr_umask */ - __u16 rs_mirror_id; + /* The rr_mirror_id_old field used the last reserved field + * in mdt_rec_reint but is not used for any other reint type. + * There are lots of unused fields in this strict that could be + * used instead, so rr_umask was chosen for rs_mirror_id_new + * since it is unlikely that a file resync operation will ever + * need it. The other unused fields could potentially be needed + * eventually (timestamps or size/blocks) so they were not used. + */ + __u32 rs_mirror_id_new; /* rr_umask */ + __u16 rs_mirror_id_old; /* deprecated 2.16.0 */ __u16 rs_padding9; /* rr_padding_4 */ }; @@ -2272,9 +2282,10 @@ struct mdt_rec_reint { __u32 rr_flags; __u32 rr_flags_h; __u32 rr_umask; - __u16 rr_mirror_id; + __u16 rr_mirror_id_old; /* deprecated 2.16.0 */ __u16 rr_padding_4; /* also fix lustre_swab_mdt_rec_reint */ }; +#define rr_mirror_id_new rr_umask #define LMV_DESC_QOS_MAXAGE_DEFAULT 60 /* Seconds */ diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 403354b..a7828ef 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -381,7 +381,8 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt) OBD_CONNECT2_BATCH_RPC | OBD_CONNECT2_DMV_IMP_INHERIT | OBD_CONNECT2_UNALIGNED_DIO | - OBD_CONNECT2_PCCRO; + OBD_CONNECT2_PCCRO | + OBD_CONNECT2_MIRROR_ID_FIX; #ifdef HAVE_LRU_RESIZE_SUPPORT if (test_bit(LL_SBI_LRU_RESIZE, sbi->ll_flags)) diff --git a/lustre/mdc/mdc_reint.c b/lustre/mdc/mdc_reint.c index e857579..d9aa4dc 100644 --- a/lustre/mdc/mdc_reint.c +++ b/lustre/mdc/mdc_reint.c @@ -567,7 +567,10 @@ int mdc_file_resync(struct obd_export *exp, struct md_op_data *op_data) rec->rs_cap = ll_capability_u32(op_data->op_cap); rec->rs_fid = op_data->op_fid1; rec->rs_bias = op_data->op_bias; - rec->rs_mirror_id = op_data->op_mirror_id; + if (exp_connect_mirror_id_fix(exp)) + rec->rs_mirror_id_new = op_data->op_mirror_id; + else + rec->rs_mirror_id_old = op_data->op_mirror_id; lock = ldlm_handle2lock(&op_data->op_lease_handle); if (lock != NULL) { diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index b8f8412..816a4f3 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -1290,7 +1290,8 @@ static int mdt_close_handle_unpack(struct mdt_thread_info *info) RETURN(0); } -static inline int mdt_dlmreq_unpack(struct mdt_thread_info *info) { +static inline int mdt_dlmreq_unpack(struct mdt_thread_info *info) +{ struct req_capsule *pill = info->mti_pill; if (!info->mti_intent_lock && @@ -1898,6 +1899,7 @@ static int mdt_setxattr_unpack(struct mdt_thread_info *info) static int mdt_resync_unpack(struct mdt_thread_info *info) { + struct obd_export *exp = mdt_info_req(info)->rq_export; struct req_capsule *pill = info->mti_pill; struct mdt_reint_record *rr = &info->mti_rr; struct lu_ucred *uc = mdt_ucred(info); @@ -1915,8 +1917,11 @@ static int mdt_resync_unpack(struct mdt_thread_info *info) uc->uc_cap = CAP_EMPTY_SET; ll_set_capability_u32(&uc->uc_cap, rec->rs_cap); - rr->rr_fid1 = &rec->rs_fid; - rr->rr_mirror_id = rec->rs_mirror_id; + rr->rr_fid1 = &rec->rs_fid; + if (exp_connect_mirror_id_fix(exp)) + rr->rr_mirror_id = (__u16)rec->rs_mirror_id_new; + else + rr->rr_mirror_id = rec->rs_mirror_id_old; /* cookie doesn't need to be swapped but it has been swapped * in lustre_swab_mdt_rec_reint() as rr_mtime, so here it needs diff --git a/lustre/obdclass/lprocfs_status.c b/lustre/obdclass/lprocfs_status.c index 009feb2..7f5f80d 100644 --- a/lustre/obdclass/lprocfs_status.c +++ b/lustre/obdclass/lprocfs_status.c @@ -654,6 +654,8 @@ static const char *const obd_connect_names[] = { "compressed_file", /* 0x200000000 */ "unaligned_dio", /* 0x400000000 */ "conn_policy", /* 0x800000000 */ + "sparse_read", /* 0x1000000000 */ + "mirror_id_fix", /* 0x2000000000 */ NULL }; diff --git a/lustre/ptlrpc/pack_generic.c b/lustre/ptlrpc/pack_generic.c index 40eda56..fd47f5d 100644 --- a/lustre/ptlrpc/pack_generic.c +++ b/lustre/ptlrpc/pack_generic.c @@ -2244,7 +2244,7 @@ void lustre_swab_mdt_rec_reint (struct mdt_rec_reint *rr) __swab32s(&rr->rr_flags); __swab32s(&rr->rr_flags_h); __swab32s(&rr->rr_umask); - __swab16s(&rr->rr_mirror_id); + __swab16s(&rr->rr_mirror_id_old); BUILD_BUG_ON(offsetof(typeof(*rr), rr_padding_4) == 0); }; diff --git a/lustre/ptlrpc/wiretest.c b/lustre/ptlrpc/wiretest.c index 7106bb4..c2f33ac 100644 --- a/lustre/ptlrpc/wiretest.c +++ b/lustre/ptlrpc/wiretest.c @@ -1467,6 +1467,8 @@ void lustre_assert_wire_constants(void) OBD_CONNECT2_UNALIGNED_DIO); LASSERTF(OBD_CONNECT2_CONN_POLICY == 0x800000000ULL, "found 0x%.16llxULL\n", OBD_CONNECT2_CONN_POLICY); + LASSERTF(OBD_CONNECT2_MIRROR_ID_FIX == 0x2000000000ULL, "found 0x%.16llxULL\n", + OBD_CONNECT2_MIRROR_ID_FIX); LASSERTF(OBD_CKSUM_CRC32 == 0x00000001UL, "found 0x%.8xUL\n", (unsigned)OBD_CKSUM_CRC32); @@ -3505,14 +3507,14 @@ void lustre_assert_wire_constants(void) (long long)(int)offsetof(struct mdt_rec_resync, rs_padding7)); LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_padding7) == 4, "found %lld\n", (long long)(int)sizeof(((struct mdt_rec_resync *)0)->rs_padding7)); - LASSERTF((int)offsetof(struct mdt_rec_resync, rs_padding8) == 128, "found %lld\n", - (long long)(int)offsetof(struct mdt_rec_resync, rs_padding8)); - LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_padding8) == 4, "found %lld\n", - (long long)(int)sizeof(((struct mdt_rec_resync *)0)->rs_padding8)); - LASSERTF((int)offsetof(struct mdt_rec_resync, rs_mirror_id) == 132, "found %lld\n", - (long long)(int)offsetof(struct mdt_rec_resync, rs_mirror_id)); - LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id) == 2, "found %lld\n", - (long long)(int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id)); + LASSERTF((int)offsetof(struct mdt_rec_resync, rs_mirror_id_new) == 128, "found %lld\n", + (long long)(int)offsetof(struct mdt_rec_resync, rs_mirror_id_new)); + LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id_new) == 4, "found %lld\n", + (long long)(int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id_new)); + LASSERTF((int)offsetof(struct mdt_rec_resync, rs_mirror_id_old) == 132, "found %lld\n", + (long long)(int)offsetof(struct mdt_rec_resync, rs_mirror_id_old)); + LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id_old) == 2, "found %lld\n", + (long long)(int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id_old)); LASSERTF((int)offsetof(struct mdt_rec_resync, rs_padding9) == 134, "found %lld\n", (long long)(int)offsetof(struct mdt_rec_resync, rs_padding9)); LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_padding9) == 2, "found %lld\n", @@ -3609,10 +3611,10 @@ void lustre_assert_wire_constants(void) (long long)(int)offsetof(struct mdt_rec_reint, rr_umask)); LASSERTF((int)sizeof(((struct mdt_rec_reint *)0)->rr_umask) == 4, "found %lld\n", (long long)(int)sizeof(((struct mdt_rec_reint *)0)->rr_umask)); - LASSERTF((int)offsetof(struct mdt_rec_reint, rr_mirror_id) == 132, "found %lld\n", - (long long)(int)offsetof(struct mdt_rec_reint, rr_mirror_id)); - LASSERTF((int)sizeof(((struct mdt_rec_reint *)0)->rr_mirror_id) == 2, "found %lld\n", - (long long)(int)sizeof(((struct mdt_rec_reint *)0)->rr_mirror_id)); + LASSERTF((int)offsetof(struct mdt_rec_reint, rr_mirror_id_old) == 132, "found %lld\n", + (long long)(int)offsetof(struct mdt_rec_reint, rr_mirror_id_old)); + LASSERTF((int)sizeof(((struct mdt_rec_reint *)0)->rr_mirror_id_old) == 2, "found %lld\n", + (long long)(int)sizeof(((struct mdt_rec_reint *)0)->rr_mirror_id_old)); LASSERTF((int)offsetof(struct mdt_rec_reint, rr_padding_4) == 134, "found %lld\n", (long long)(int)offsetof(struct mdt_rec_reint, rr_padding_4)); LASSERTF((int)sizeof(((struct mdt_rec_reint *)0)->rr_padding_4) == 2, "found %lld\n", diff --git a/lustre/utils/wirecheck.c b/lustre/utils/wirecheck.c index e35d771..536ce66 100644 --- a/lustre/utils/wirecheck.c +++ b/lustre/utils/wirecheck.c @@ -703,6 +703,7 @@ check_obd_connect_data(void) CHECK_DEFINE_64X(OBD_CONNECT2_COMPRESS); CHECK_DEFINE_64X(OBD_CONNECT2_UNALIGNED_DIO); CHECK_DEFINE_64X(OBD_CONNECT2_CONN_POLICY); + CHECK_DEFINE_64X(OBD_CONNECT2_MIRROR_ID_FIX); BLANK_LINE(); CHECK_VALUE_X(OBD_CKSUM_CRC32); @@ -1564,8 +1565,8 @@ check_mdt_rec_resync(void) CHECK_MEMBER(mdt_rec_resync, rs_padding5); CHECK_MEMBER(mdt_rec_resync, rs_padding6); CHECK_MEMBER(mdt_rec_resync, rs_padding7); - CHECK_MEMBER(mdt_rec_resync, rs_padding8); - CHECK_MEMBER(mdt_rec_resync, rs_mirror_id); + CHECK_MEMBER(mdt_rec_resync, rs_mirror_id_new); + CHECK_MEMBER(mdt_rec_resync, rs_mirror_id_old); CHECK_MEMBER(mdt_rec_resync, rs_padding9); } @@ -1596,7 +1597,7 @@ check_mdt_rec_reint(void) CHECK_MEMBER(mdt_rec_reint, rr_flags); CHECK_MEMBER(mdt_rec_reint, rr_flags_h); CHECK_MEMBER(mdt_rec_reint, rr_umask); - CHECK_MEMBER(mdt_rec_reint, rr_mirror_id); + CHECK_MEMBER(mdt_rec_reint, rr_mirror_id_old); CHECK_MEMBER(mdt_rec_reint, rr_padding_4); } diff --git a/lustre/utils/wiretest.c b/lustre/utils/wiretest.c index e167360..c6e67f2 100644 --- a/lustre/utils/wiretest.c +++ b/lustre/utils/wiretest.c @@ -1492,6 +1492,8 @@ void lustre_assert_wire_constants(void) OBD_CONNECT2_UNALIGNED_DIO); LASSERTF(OBD_CONNECT2_CONN_POLICY == 0x800000000ULL, "found 0x%.16llxULL\n", OBD_CONNECT2_CONN_POLICY); + LASSERTF(OBD_CONNECT2_MIRROR_ID_FIX == 0x2000000000ULL, "found 0x%.16llxULL\n", + OBD_CONNECT2_MIRROR_ID_FIX); LASSERTF(OBD_CKSUM_CRC32 == 0x00000001UL, "found 0x%.8xUL\n", (unsigned)OBD_CKSUM_CRC32); @@ -3530,14 +3532,14 @@ void lustre_assert_wire_constants(void) (long long)(int)offsetof(struct mdt_rec_resync, rs_padding7)); LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_padding7) == 4, "found %lld\n", (long long)(int)sizeof(((struct mdt_rec_resync *)0)->rs_padding7)); - LASSERTF((int)offsetof(struct mdt_rec_resync, rs_padding8) == 128, "found %lld\n", - (long long)(int)offsetof(struct mdt_rec_resync, rs_padding8)); - LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_padding8) == 4, "found %lld\n", - (long long)(int)sizeof(((struct mdt_rec_resync *)0)->rs_padding8)); - LASSERTF((int)offsetof(struct mdt_rec_resync, rs_mirror_id) == 132, "found %lld\n", - (long long)(int)offsetof(struct mdt_rec_resync, rs_mirror_id)); - LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id) == 2, "found %lld\n", - (long long)(int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id)); + LASSERTF((int)offsetof(struct mdt_rec_resync, rs_mirror_id_new) == 128, "found %lld\n", + (long long)(int)offsetof(struct mdt_rec_resync, rs_mirror_id_new)); + LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id_new) == 4, "found %lld\n", + (long long)(int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id_new)); + LASSERTF((int)offsetof(struct mdt_rec_resync, rs_mirror_id_old) == 132, "found %lld\n", + (long long)(int)offsetof(struct mdt_rec_resync, rs_mirror_id_old)); + LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id_old) == 2, "found %lld\n", + (long long)(int)sizeof(((struct mdt_rec_resync *)0)->rs_mirror_id_old)); LASSERTF((int)offsetof(struct mdt_rec_resync, rs_padding9) == 134, "found %lld\n", (long long)(int)offsetof(struct mdt_rec_resync, rs_padding9)); LASSERTF((int)sizeof(((struct mdt_rec_resync *)0)->rs_padding9) == 2, "found %lld\n", @@ -3634,10 +3636,10 @@ void lustre_assert_wire_constants(void) (long long)(int)offsetof(struct mdt_rec_reint, rr_umask)); LASSERTF((int)sizeof(((struct mdt_rec_reint *)0)->rr_umask) == 4, "found %lld\n", (long long)(int)sizeof(((struct mdt_rec_reint *)0)->rr_umask)); - LASSERTF((int)offsetof(struct mdt_rec_reint, rr_mirror_id) == 132, "found %lld\n", - (long long)(int)offsetof(struct mdt_rec_reint, rr_mirror_id)); - LASSERTF((int)sizeof(((struct mdt_rec_reint *)0)->rr_mirror_id) == 2, "found %lld\n", - (long long)(int)sizeof(((struct mdt_rec_reint *)0)->rr_mirror_id)); + LASSERTF((int)offsetof(struct mdt_rec_reint, rr_mirror_id_old) == 132, "found %lld\n", + (long long)(int)offsetof(struct mdt_rec_reint, rr_mirror_id_old)); + LASSERTF((int)sizeof(((struct mdt_rec_reint *)0)->rr_mirror_id_old) == 2, "found %lld\n", + (long long)(int)sizeof(((struct mdt_rec_reint *)0)->rr_mirror_id_old)); LASSERTF((int)offsetof(struct mdt_rec_reint, rr_padding_4) == 134, "found %lld\n", (long long)(int)offsetof(struct mdt_rec_reint, rr_padding_4)); LASSERTF((int)sizeof(((struct mdt_rec_reint *)0)->rr_padding_4) == 2, "found %lld\n", -- 1.8.3.1