From: yangsheng Date: Tue, 10 Mar 2009 13:44:27 +0000 (+0000) Subject: Branch b1_6 X-Git-Tag: GIT_EPOCH_B1_6~2^5~138 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=7977301865d56ddcf578c879ae672d255669149f;p=fs%2Flustre-release.git Branch b1_6 b=17701 i=adilger, nathan Fixed issue cause by previous patch. --- diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index cd45d30..cd1d91f 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -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); diff --git a/lustre/include/lustre/lustre_user.h b/lustre/include/lustre/lustre_user.h index d0b9452..4de22db 100644 --- a/lustre/include/lustre/lustre_user.h +++ b/lustre/include/lustre/lustre_user.h @@ -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 . */ diff --git a/lustre/lov/lov_pack.c b/lustre/lov/lov_pack.c index ffee6d6..35429e9 100644 --- a/lustre/lov/lov_pack.c +++ b/lustre/lov/lov_pack.c @@ -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); diff --git a/lustre/ptlrpc/pack_generic.c b/lustre/ptlrpc/pack_generic.c index 801ad77..f3b9748 100644 --- a/lustre/ptlrpc/pack_generic.c +++ b/lustre/ptlrpc/pack_generic.c @@ -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; diff --git a/lustre/ptlrpc/ptlrpc_module.c b/lustre/ptlrpc/ptlrpc_module.c index bf17b4b..4abe83e 100644 --- a/lustre/ptlrpc/ptlrpc_module.c +++ b/lustre/ptlrpc/ptlrpc_module.c @@ -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);