Whamcloud - gitweb
LU-1318 ldlm: allow different LVB structures to be used
authorJohann Lombardi <johann@whamcloud.com>
Fri, 24 Feb 2012 15:42:23 +0000 (16:42 +0100)
committerOleg Drokin <green@whamcloud.com>
Thu, 17 May 2012 04:40:38 +0000 (00:40 -0400)
The DLM code always assumes that the request buffer storing the LVB is
of type ost_lvb.
This patch allows new LVB types to be defined and used. Although there
is still one single LVB structure defined (i.e. ost_lvb), the new
quota architecture will define its own LVB soon.

Signed-off-by: Johann Lombardi <johann@whamcloud.com>
Change-Id: I497d774eb4b66029ff2755739bbe75190f6aeee8
Reviewed-on: http://review.whamcloud.com/2649
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Niu Yawei <niu@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/lustre/lustre_idl.h
lustre/ptlrpc/layout.c
lustre/ptlrpc/pack_generic.c
lustre/ptlrpc/ptlrpc_module.c
lustre/utils/req-layout.c

index 79d9303..fa09ec4 100644 (file)
@@ -1529,8 +1529,6 @@ struct ost_lvb {
         __u64     lvb_blocks;
 };
 
-extern void lustre_swab_ost_lvb(struct ost_lvb *);
-
 /*
  *   MDS REQ RECORDS
  */
@@ -2336,6 +2334,15 @@ typedef union {
 
 extern void lustre_swab_ldlm_policy_data (ldlm_wire_policy_data_t *d);
 
+/* Similarly to ldlm_wire_policy_data_t, there is one common swabber for all
+ * LVB types. As a result, any new LVB structure must match the fields of the
+ * ost_lvb structure. */
+union ldlm_wire_lvb {
+        struct ost_lvb l_ost;
+};
+
+extern void lustre_swab_lvb(union ldlm_wire_lvb *);
+
 struct ldlm_intent {
         __u64 opc;
 };
index 3362a24..84b4042 100644 (file)
@@ -878,7 +878,7 @@ struct req_msg_field RMF_LDLM_INTENT =
 EXPORT_SYMBOL(RMF_LDLM_INTENT);
 
 struct req_msg_field RMF_DLM_LVB =
-        DEFINE_MSGF("dlm_lvb", 0, sizeof(struct ost_lvb), lustre_swab_ost_lvb,
+        DEFINE_MSGF("dlm_lvb", 0, sizeof(union ldlm_wire_lvb), lustre_swab_lvb,
         NULL);
 EXPORT_SYMBOL(RMF_DLM_LVB);
 
index bbe5c8b..14ee58c 100644 (file)
@@ -1686,13 +1686,18 @@ void lustre_swab_generic_32s(__u32 *val)
         __swab32s(val);
 }
 
-void lustre_swab_ost_lvb(struct ost_lvb *lvb)
+void lustre_swab_lvb(union ldlm_wire_lvb *lvb)
 {
-        __swab64s(&lvb->lvb_size);
-        __swab64s(&lvb->lvb_mtime);
-        __swab64s(&lvb->lvb_atime);
-        __swab64s(&lvb->lvb_ctime);
-        __swab64s(&lvb->lvb_blocks);
+        /* The ldlm_wire_lvb union represents all the possible LVB types.
+         * Unfortunately, there is no way to know what member of the union we
+         * are dealing with at this point. Therefore, all LVB structures must
+         * have fields of the same types, although used for different purposes
+         */
+        __swab64s(&lvb->l_ost.lvb_size);
+        __swab64s(&lvb->l_ost.lvb_mtime);
+        __swab64s(&lvb->l_ost.lvb_atime);
+        __swab64s(&lvb->l_ost.lvb_ctime);
+        __swab64s(&lvb->l_ost.lvb_blocks);
 }
 
 void lustre_swab_mdt_body (struct mdt_body *b)
index 89f4946..d410107 100644 (file)
@@ -250,7 +250,7 @@ EXPORT_SYMBOL(lustre_swab_obd_ioobj);
 EXPORT_SYMBOL(lustre_swab_niobuf_remote);
 EXPORT_SYMBOL(lustre_swab_ost_body);
 EXPORT_SYMBOL(lustre_swab_ost_last_id);
-EXPORT_SYMBOL(lustre_swab_ost_lvb);
+EXPORT_SYMBOL(lustre_swab_lvb);
 EXPORT_SYMBOL(lustre_swab_mdt_body);
 EXPORT_SYMBOL(lustre_swab_mdt_ioepoch);
 EXPORT_SYMBOL(lustre_swab_obd_quotactl);
index 31c4448..d21cc41 100644 (file)
@@ -75,7 +75,7 @@
 #define lustre_swab_ost_last_id NULL
 #define lustre_swab_fiemap NULL
 #define lustre_swab_qdata NULL
-#define lustre_swab_ost_lvb NULL
+#define lustre_swab_lvb NULL
 #define lustre_swab_mgs_config_body NULL
 #define lustre_swab_mgs_config_res NULL
 #define dump_rniobuf NULL