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

Swab lov_mds_md when ioctl() call by 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 7d710ef..19f63d5 100644 (file)
@@ -2466,6 +2466,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 d06b48d..da7ed9b 100644 (file)
@@ -174,6 +174,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 12c2d28..0165f69 100644 (file)
@@ -640,14 +640,21 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm,
                 CLASSERT(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 300fd12..887781c 100644 (file)
@@ -2026,6 +2026,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 e4f0a0e..c097f65 100644 (file)
@@ -264,6 +264,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);