From 1fdacb5ed9af78e22d3d0eb73a8caa0e3c45d801 Mon Sep 17 00:00:00 2001 From: yangsheng Date: Fri, 23 Jan 2009 09:16:11 +0000 Subject: [PATCH] Branch b1_6 b=17464 i=johann, bobijam Swab lov_mds_md when ioctl be called directly in liblustre. --- lustre/include/lustre/lustre_idl.h | 1 + lustre/include/lustre/lustre_user.h | 5 +++++ lustre/lov/lov_pack.c | 12 +++++++++--- lustre/ptlrpc/pack_generic.c | 13 +++++++++++++ lustre/ptlrpc/ptlrpc_module.c | 1 + 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index 5c8da6d..be8d2b2 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -1568,6 +1568,7 @@ extern void lustre_swab_fiemap(struct ll_user_fiemap *fiemap); 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); /* 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 4de22db..d0b9452 100644 --- a/lustre/include/lustre/lustre_user.h +++ b/lustre/include/lustre/lustre_user.h @@ -150,6 +150,11 @@ 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 b0ab4a5..ffee6d6 100644 --- a/lustre/lov/lov_pack.c +++ b/lustre/lov/lov_pack.c @@ -457,14 +457,20 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm, LASSERT(sizeof(lum) == sizeof(*lmmk)); 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))) + 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, sizeof(lum))) + 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 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 4eb5861..1f5d1c5 100644 --- a/lustre/ptlrpc/pack_generic.c +++ b/lustre/ptlrpc/pack_generic.c @@ -2269,6 +2269,19 @@ void lustre_swab_lov_user_md(struct lov_user_md *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 0989c6c..bda7679 100644 --- a/lustre/ptlrpc/ptlrpc_module.c +++ b/lustre/ptlrpc/ptlrpc_module.c @@ -236,6 +236,7 @@ EXPORT_SYMBOL(lustre_swab_lov_desc); 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_ldlm_res_id); EXPORT_SYMBOL(lustre_swab_ldlm_policy_data); EXPORT_SYMBOL(lustre_swab_ldlm_intent); -- 1.8.3.1