From e707ec78a8c3fcf52180caf71ed1bcad92afc237 Mon Sep 17 00:00:00 2001 From: yangsheng Date: Fri, 23 Jan 2009 13:24:30 +0000 Subject: [PATCH] Branch HEAD b=17464 i=johann, bobijam Swab lov_mds_md when ioctl() call by liblustre. --- lustre/include/lustre/lustre_idl.h | 1 + lustre/include/lustre/lustre_user.h | 5 +++++ lustre/lov/lov_pack.c | 13 ++++++++++--- lustre/ptlrpc/pack_generic.c | 13 +++++++++++++ lustre/ptlrpc/ptlrpc_module.c | 1 + 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index 7d710ef..19f63d5 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -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); diff --git a/lustre/include/lustre/lustre_user.h b/lustre/include/lustre/lustre_user.h index d06b48d..da7ed9b 100644 --- a/lustre/include/lustre/lustre_user.h +++ b/lustre/include/lustre/lustre_user.h @@ -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 . */ diff --git a/lustre/lov/lov_pack.c b/lustre/lov/lov_pack.c index 12c2d28..0165f69 100644 --- a/lustre/lov/lov_pack.c +++ b/lustre/lov/lov_pack.c @@ -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); } diff --git a/lustre/ptlrpc/pack_generic.c b/lustre/ptlrpc/pack_generic.c index 300fd12..887781c 100644 --- a/lustre/ptlrpc/pack_generic.c +++ b/lustre/ptlrpc/pack_generic.c @@ -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; diff --git a/lustre/ptlrpc/ptlrpc_module.c b/lustre/ptlrpc/ptlrpc_module.c index e4f0a0e..c097f65 100644 --- a/lustre/ptlrpc/ptlrpc_module.c +++ b/lustre/ptlrpc/ptlrpc_module.c @@ -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); -- 1.8.3.1