From 041f945411bed68211bfcbc5e7dc2c36af630e4b Mon Sep 17 00:00:00 2001 From: yangsheng Date: Fri, 13 Mar 2009 15:05:48 +0000 Subject: [PATCH] Branch HEAD b=17701 Run set_fs() before return in lov_getstripe. --- lustre/lov/lov_pack.c | 115 +++++++++++++++++++++++++------------------------- 1 file changed, 57 insertions(+), 58 deletions(-) diff --git a/lustre/lov/lov_pack.c b/lustre/lov/lov_pack.c index 17b9d47..a17d580 100644 --- a/lustre/lov/lov_pack.c +++ b/lustre/lov/lov_pack.c @@ -617,70 +617,69 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm, * lmm_stripe_count, (the header part is common to v1 and v3) */ lum_size = sizeof(struct lov_user_md_v1); if (copy_from_user(&lum, lump, lum_size)) - rc = -EFAULT; + GOTO(out_set, rc = -EFAULT); else if ((lum.lmm_magic != LOV_USER_MAGIC) && (lum.lmm_magic != LOV_USER_MAGIC_V3)) - rc = -EINVAL; - else { - 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; - rc = copy_to_user(lump, &lum, lum_size); - RETURN(-EOVERFLOW); - } - rc = lov_packmd(exp, &lmmk, lsm); - if (rc < 0) - RETURN(rc); - lmm_size = rc; - rc = 0; - - /* FIXME: Bug 1185 - copy fields properly when structs change */ - /* struct lov_user_md_v3 and struct lov_mds_md_v3 must be the same */ - CLASSERT(sizeof(lum) == sizeof(struct lov_mds_md_v3)); - 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_V1)) || - (lmmk->lmm_magic == cpu_to_le32(LOV_MAGIC_V3)))) { - lustre_swab_lov_mds_md(lmmk); - lustre_swab_lov_user_md_objects( + GOTO(out_set, rc = -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; + rc = copy_to_user(lump, &lum, lum_size); + GOTO(out_set, rc = -EOVERFLOW); + } + rc = lov_packmd(exp, &lmmk, lsm); + if (rc < 0) + GOTO(out_set, rc); + lmm_size = rc; + rc = 0; + + /* FIXME: Bug 1185 - copy fields properly when structs change */ + /* struct lov_user_md_v3 and struct lov_mds_md_v3 must be the same */ + CLASSERT(sizeof(lum) == sizeof(struct lov_mds_md_v3)); + 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_V1)) || + (lmmk->lmm_magic == cpu_to_le32(LOV_MAGIC_V3)))) { + lustre_swab_lov_mds_md(lmmk); + lustre_swab_lov_user_md_objects( (struct lov_user_ost_data*)lmmk->lmm_objects, lmmk->lmm_stripe_count); + } + if (lum.lmm_magic == LOV_USER_MAGIC) { + /* User request for v1, we need skip lmm_pool_name */ + if (lmmk->lmm_magic == LOV_MAGIC_V3) { + memmove((char*)(&lmmk->lmm_stripe_count) + + sizeof(lmmk->lmm_stripe_count), + ((struct lov_mds_md_v3*)lmmk)->lmm_objects, + lmmk->lmm_stripe_count * + sizeof(struct lov_ost_data_v1)); + lmm_size -= LOV_MAXPOOLNAME; } - if (lum.lmm_magic == LOV_USER_MAGIC) { - /* User request for v1, we need skip lmm_pool_name */ - if (lmmk->lmm_magic == LOV_MAGIC_V3) { - memmove((char*)(&lmmk->lmm_stripe_count) + - sizeof(lmmk->lmm_stripe_count), - lmmk->lmm_objects, - lmmk->lmm_stripe_count * - sizeof(struct lov_ost_data_v1)); - lmm_size -= LOV_MAXPOOLNAME; - } - } else { - /* if v3 we just have to update the lum_size */ - lum_size = sizeof(struct lov_user_md_v3); - } - - /* User wasn't expecting this many OST entries */ - if (lum.lmm_stripe_count == 0) - lmm_size = lum_size; - else if (lum.lmm_stripe_count < lmmk->lmm_stripe_count) - RETURN(-EOVERFLOW); - /* - * Have a difference 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); + } else { + /* if v3 we just have to update the lum_size */ + lum_size = sizeof(struct lov_user_md_v3); } + + /* User wasn't expecting this many OST entries */ + if (lum.lmm_stripe_count == 0) + lmm_size = lum_size; + else if (lum.lmm_stripe_count < lmmk->lmm_stripe_count) + GOTO(out_set, rc = -EOVERFLOW); + /* + * Have a difference 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); +out_set: set_fs(seg); RETURN(rc); } -- 1.8.3.1