Whamcloud - gitweb
Branch b1_8
authoryangsheng <yangsheng>
Fri, 23 Jan 2009 10:24:38 +0000 (10:24 +0000)
committeryangsheng <yangsheng>
Fri, 23 Jan 2009 10:24:38 +0000 (10:24 +0000)
b=17464
i=johann, bobijam

Swab the lov_mds_md when ioctl() be called directly in liblustre.

lustre/include/lustre/lustre_idl.h
lustre/include/lustre/lustre_user.h
lustre/lov/lov_pack.c
lustre/ptlrpc/pack_generic.c
lustre/ptlrpc/ptlrpc_module.c

index fcf32c2..ef61a12 100644 (file)
@@ -2111,6 +2111,7 @@ extern void lustre_swab_lov_user_md_v3(struct lov_user_md_v3 *lum);
 extern void lustre_swab_lov_user_md_objects(struct lov_user_ost_data *lod,
                                             int stripe_count);
 extern void lustre_swab_lov_user_md_join(struct lov_user_md_join *lumj);
+extern void lustre_swab_lov_mds_md(struct lov_mds_md *lmm);
 
 /* llog_swab.c */
 extern void lustre_swab_llogd_body (struct llogd_body *d);
index 4dfafcd..afbcd33 100644 (file)
@@ -169,6 +169,11 @@ struct lov_user_md_v3 {           /* LOV EA user data (host-endian) */
         struct lov_user_ost_data_v1 lmm_objects[0]; /* per-stripe data */
 } __attribute__((packed));
 
+#define copy_lov_mds2user(user_md, mds_md) do { \
+        memcpy(user_md, mds_md, sizeof(*(user_md))); \
+        (user_md)->lmm_stripe_offset = 0; \
+        (user_md)->lmm_stripe_count = (mds_md)->lmm_stripe_count; } while(0)
+
 /* Compile with -D_LARGEFILE64_SOURCE or -D_GNU_SOURCE (or #define) to
  * use this.  It is unsafe to #define those values in this header as it
  * is possible the application has already #included <sys/stat.h>. */
index 942ff37..0f77259 100644 (file)
@@ -608,14 +608,20 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm,
         LASSERT(sizeof(lum) == sizeof(struct lov_mds_md_v3));
         LASSERT(sizeof(lum.lmm_objects[0]) == sizeof(lmmk->lmm_objects[0]));
 
+        if ((cpu_to_le32(LOV_MAGIC) != LOV_MAGIC) &&
+            (lmmk->lmm_magic == cpu_to_le32(LOV_MAGIC)))
+                lustre_swab_lov_mds_md(lmmk);
         /* User wasn't expecting this many OST entries */
         if (lum.lmm_stripe_count == 0) {
-                if (copy_to_user(lump, lmmk, lum_size))
+                copy_lov_mds2user(&lum, lmmk);
+                if (copy_to_user(lump, &lum, lum_size))
                         rc = -EFAULT;
         } else if (lum.lmm_stripe_count < lmmk->lmm_stripe_count) {
                 rc = -EOVERFLOW;
-        } else if (copy_to_user(lump, lmmk, lmm_size)) {
-                rc = -EFAULT;
+        } else {
+                copy_lov_mds2user(&lum, lmmk);
+                if (copy_to_user(lump, &lum, lmm_size))
+                        rc = -EFAULT;
         }
 
         obd_free_diskmd(exp, &lmmk);
index e331b21..10a4dd1 100644 (file)
@@ -2302,6 +2302,19 @@ void lustre_swab_lov_user_md_v3(struct lov_user_md_v3 *lum)
         EXIT;
 }
 
+void lustre_swab_mds_md(struct lov_mds_md *lmm)
+{
+        ENTRY;
+        CDEBUG(D_IOCTL, "swabbing lov_mds_md\n");
+        __swab32s(&lmm->lmm_magic);
+        __swab32s(&lmm->lmm_pattern);
+        __swab64s(&lmm->lmm_object_id);
+        __swab64s(&lmm->lmm_object_gr);
+        __swab32s(&lmm->lmm_stripe_size);
+        __swab32s(&lmm->lmm_stripe_count);
+        EXIT;
+}
+
 void lustre_swab_lov_user_md_join(struct lov_user_md_join *lumj)
 {
         ENTRY;
index b798b1a..3291172 100644 (file)
@@ -236,6 +236,7 @@ EXPORT_SYMBOL(lustre_swab_lov_user_md_v1);
 EXPORT_SYMBOL(lustre_swab_lov_user_md_v3);
 EXPORT_SYMBOL(lustre_swab_lov_user_md_objects);
 EXPORT_SYMBOL(lustre_swab_lov_user_md_join);
+EXPORT_SYMBOL(lustre_swab_lov_mds_md);
 EXPORT_SYMBOL(lustre_swab_ldlm_res_id);
 EXPORT_SYMBOL(lustre_swab_ldlm_policy_data);
 EXPORT_SYMBOL(lustre_swab_ldlm_intent);