Whamcloud - gitweb
Branch HEAD
authoryangsheng <yangsheng>
Fri, 13 Mar 2009 15:05:48 +0000 (15:05 +0000)
committeryangsheng <yangsheng>
Fri, 13 Mar 2009 15:05:48 +0000 (15:05 +0000)
b=17701

Run set_fs() before return in lov_getstripe.

lustre/lov/lov_pack.c

index 17b9d47..a17d580 100644 (file)
@@ -617,70 +617,69 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm,
          * lmm_stripe_count, (the header part is common to v1 and v3) */
         lum_size = sizeof(struct lov_user_md_v1);
         if (copy_from_user(&lum, lump, lum_size))
-                rc = -EFAULT;
+                GOTO(out_set, rc = -EFAULT);
         else if ((lum.lmm_magic != LOV_USER_MAGIC) &&
                  (lum.lmm_magic != LOV_USER_MAGIC_V3))
-                rc = -EINVAL;
-        else {
-                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;
-                        rc = copy_to_user(lump, &lum, lum_size);
-                        RETURN(-EOVERFLOW);
-                }
-                rc = lov_packmd(exp, &lmmk, lsm);
-                if (rc < 0)
-                        RETURN(rc);
-                lmm_size = rc;
-                rc = 0;
-
-                /* FIXME: Bug 1185 - copy fields properly when structs change */
-                /* struct lov_user_md_v3 and struct lov_mds_md_v3 must be the same */
-                CLASSERT(sizeof(lum) == sizeof(struct lov_mds_md_v3));
-                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_V1)) ||
-                    (lmmk->lmm_magic == cpu_to_le32(LOV_MAGIC_V3)))) {
-                        lustre_swab_lov_mds_md(lmmk);
-                        lustre_swab_lov_user_md_objects(
+                GOTO(out_set, rc = -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;
+                rc = copy_to_user(lump, &lum, lum_size);
+                GOTO(out_set, rc = -EOVERFLOW);
+        }
+        rc = lov_packmd(exp, &lmmk, lsm);
+        if (rc < 0)
+                GOTO(out_set, rc);
+        lmm_size = rc;
+        rc = 0;
+
+        /* FIXME: Bug 1185 - copy fields properly when structs change */
+        /* struct lov_user_md_v3 and struct lov_mds_md_v3 must be the same */
+        CLASSERT(sizeof(lum) == sizeof(struct lov_mds_md_v3));
+        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_V1)) ||
+            (lmmk->lmm_magic == cpu_to_le32(LOV_MAGIC_V3)))) {
+                lustre_swab_lov_mds_md(lmmk);
+                lustre_swab_lov_user_md_objects(
                                 (struct lov_user_ost_data*)lmmk->lmm_objects,
                                 lmmk->lmm_stripe_count);
+        }
+        if (lum.lmm_magic == LOV_USER_MAGIC) {
+                /* User request for v1, we need skip lmm_pool_name */
+                if (lmmk->lmm_magic == LOV_MAGIC_V3) {
+                        memmove((char*)(&lmmk->lmm_stripe_count) +
+                                sizeof(lmmk->lmm_stripe_count),
+                                ((struct lov_mds_md_v3*)lmmk)->lmm_objects,
+                                lmmk->lmm_stripe_count *
+                                sizeof(struct lov_ost_data_v1));
+                        lmm_size -= LOV_MAXPOOLNAME;
                 }
-                if (lum.lmm_magic == LOV_USER_MAGIC) {
-                        /* User request for v1, we need skip lmm_pool_name */
-                        if (lmmk->lmm_magic == LOV_MAGIC_V3) {
-                                memmove((char*)(&lmmk->lmm_stripe_count) +
-                                        sizeof(lmmk->lmm_stripe_count),
-                                        lmmk->lmm_objects,
-                                        lmmk->lmm_stripe_count *
-                                        sizeof(struct lov_ost_data_v1));
-                                lmm_size -= LOV_MAXPOOLNAME;
-                        }
-                } else {
-                        /* if v3 we just have to update the lum_size */
-                        lum_size = sizeof(struct lov_user_md_v3);
-                }
-
-                /* User wasn't expecting this many OST entries */
-                if (lum.lmm_stripe_count == 0)
-                        lmm_size = lum_size;
-                else if (lum.lmm_stripe_count < lmmk->lmm_stripe_count)
-                        RETURN(-EOVERFLOW);
-                /* 
-                 * Have a difference 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);
+        } else {
+                /* if v3 we just have to update the lum_size */
+                lum_size = sizeof(struct lov_user_md_v3);
         }
+
+        /* User wasn't expecting this many OST entries */
+        if (lum.lmm_stripe_count == 0)
+                lmm_size = lum_size;
+        else if (lum.lmm_stripe_count < lmmk->lmm_stripe_count)
+                GOTO(out_set, rc = -EOVERFLOW);
+        /* 
+         * Have a difference 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);
+out_set:
         set_fs(seg);
         RETURN(rc);
 }