rc = copy_from_user(&lumv3, lump, sizeof(struct lov_user_md_v1));
if (rc)
RETURN(-EFAULT);
- if (lumv1->lmm_magic == LOV_USER_MAGIC_V3) {
+ if ((lumv1->lmm_magic == LOV_USER_MAGIC_V3) ||
+ (lumv1->lmm_magic == LOV_USER_MAGIC_V3_SWABBED)) {
rc = copy_from_user(&lumv3, lump, sizeof(lumv3));
if (rc)
RETURN(-EFAULT);
if (copy_to_user(lump, lmmk, lmm_size))
rc = -EFAULT;
+ /* Restore the LE endian to ensure obd_free_diskmd works well */
+ if (cpu_to_le32(LOV_MAGIC) != LOV_MAGIC) {
+ lmmk->lmm_stripe_count = lum.lmm_stripe_count;
+ lustre_swab_lov_mds_md(lmmk);
+ }
+
obd_free_diskmd(exp, &lmmk);
RETURN(rc);
int lustre_swab_lov_user_md_objects(struct lov_user_md *lum)
{
- int i, stripe_count = lum->lmm_stripe_count;
+ int i;
+ __u16 stripe_count = lum->lmm_stripe_count;
struct lov_user_ost_data *lod;
ENTRY;
switch (lum->lmm_magic) {
case LOV_USER_MAGIC_V1_SWABBED:
- __swab32s(&stripe_count);
+ __swab16s(&stripe_count);
case LOV_USER_MAGIC_V1:
lod = lum->lmm_objects;
break;
case LOV_USER_MAGIC_V3_SWABBED:
- __swab32s(&stripe_count);
+ __swab16s(&stripe_count);
case LOV_USER_MAGIC_V3:
lod = ((struct lov_user_md_v3 *)lum)->lmm_objects;
break;