Whamcloud - gitweb
Branch b1_6
authoryangsheng <yangsheng>
Tue, 10 Mar 2009 13:44:27 +0000 (13:44 +0000)
committeryangsheng <yangsheng>
Tue, 10 Mar 2009 13:44:27 +0000 (13:44 +0000)
b=17701

i=adilger, nathan

Fixed issue cause by previous patch.

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 cd45d30..cd1d91f 100644 (file)
@@ -1572,6 +1572,7 @@ extern void lustre_swab_lov_user_md(struct lov_user_md *lum);
 extern void lustre_swab_lov_user_md_objects(struct lov_user_md *lum);
 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);
+extern void lustre_swab_lov_mds_md_objects(struct lov_mds_md *lum);
 
 /* llog_swab.c */
 extern void lustre_swab_llogd_body (struct llogd_body *d);
index d0b9452..4de22db 100644 (file)
@@ -150,11 +150,6 @@ struct lov_user_md_v1 {           /* 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 ffee6d6..35429e9 100644 (file)
@@ -422,7 +422,6 @@ int lov_setea(struct obd_export *exp, struct lov_stripe_md **lsmp,
         RETURN(0);
 }
 
-
 /* Retrieve object striping information.
  *
  * @lump is a pointer to an in-core struct with lmm_ost_count indicating
@@ -447,6 +446,14 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm,
         if (lum.lmm_magic != LOV_USER_MAGIC)
                 RETURN(-EINVAL);
 
+        if (lum.lmm_stripe_count && 
+            (lum.lmm_stripe_count < lsm->lsm_stripe_count)) {
+                /* Return right size of stripe to user */
+                lum.lmm_stripe_count = lsm->lsm_stripe_count;
+                copy_to_user(lump, &lum, sizeof(lum));
+                RETURN(-EOVERFLOW);
+        }
+
         rc = lov_packmd(exp, &lmmk, lsm);
         if (rc < 0)
                 RETURN(rc);
@@ -458,20 +465,24 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm,
         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)))
+            (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) {
-                copy_lov_mds2user(&lum, lmmk);
-                if (copy_to_user(lump, &lum, sizeof(lum)))
-                        rc = -EFAULT;
-        } else if (lum.lmm_stripe_count < lmmk->lmm_stripe_count) {
-                rc = -EOVERFLOW;
-        } else {
-                copy_lov_mds2user(&lum, lmmk);
-                if (copy_to_user(lump, &lum, lmm_size))
-                        rc = -EFAULT;
+                lustre_swab_lov_mds_md_objects(lmmk);
         }
+        /* User wasn't expecting this many OST entries */
+        if (lum.lmm_stripe_count == 0)
+                lmm_size = sizeof(lum);
+        else if (lum.lmm_stripe_count < lmmk->lmm_stripe_count)
+                RETURN(-EOVERFLOW);
+        /* 
+         * Have a different between lov_mds_md & lov_user_md.
+         * So we have to re-order the data before copy to user.
+         */
+        lum.lmm_stripe_count = lmmk->lmm_stripe_count;
+        ((struct lov_user_md*)lmmk)->lmm_stripe_offset = 0;
+        ((struct lov_user_md*)lmmk)->lmm_stripe_count = lum.lmm_stripe_count;
+        if (copy_to_user(lump, lmmk, lmm_size))
+                rc = -EFAULT;
 
         obd_free_diskmd(exp, &lmmk);
 
index 801ad77..f3b9748 100644 (file)
@@ -2283,6 +2283,21 @@ void lustre_swab_lov_mds_md(struct lov_mds_md *lmm)
         EXIT;
 }
 
+void lustre_swab_lov_mds_md_objects(struct lov_mds_md *lmm)
+{
+        struct lov_user_ost_data *lod;
+        int i;
+        ENTRY;
+        for (i = 0; i < lmm->lmm_stripe_count; i++) {
+                lod = &lmm->lmm_objects[i];
+                __swab64s(&lod->l_object_id);
+                __swab64s(&lod->l_object_gr);
+                __swab32s(&lod->l_ost_gen);
+                __swab32s(&lod->l_ost_idx);
+        }
+        EXIT;
+}
+
 void lustre_swab_lov_user_md_join(struct lov_user_md_join *lumj)
 {
         ENTRY;
index bf17b4b..4abe83e 100644 (file)
@@ -237,6 +237,7 @@ EXPORT_SYMBOL(lustre_swab_lov_user_md);
 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_lov_mds_md_objects);
 EXPORT_SYMBOL(lustre_swab_ldlm_res_id);
 EXPORT_SYMBOL(lustre_swab_ldlm_policy_data);
 EXPORT_SYMBOL(lustre_swab_ldlm_intent);