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);
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 <sys/stat.h>. */
LASSERT(sizeof(lum) == sizeof(struct lov_mds_md_v3));
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, 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);
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;
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);