From: Fan Yong Date: Thu, 20 May 2010 05:54:12 +0000 (+0800) Subject: b=22637 MDS returns OBD_MD_FLSIZE to client only when no OSS object allocated X-Git-Tag: v1_10_0_43~38 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=242b61e4bd464cd517636c33f63ba707af69e945 b=22637 MDS returns OBD_MD_FLSIZE to client only when no OSS object allocated MDS returns OBD_MD_FLSIZE to client only when no OSS object allocated. i=robert.read i=andreas.dilger --- diff --git a/lustre/mdd/mdd_device.c b/lustre/mdd/mdd_device.c index b178527..388780e 100644 --- a/lustre/mdd/mdd_device.c +++ b/lustre/mdd/mdd_device.c @@ -745,7 +745,7 @@ static int obf_attr_get(const struct lu_env *env, struct md_object *obj, if (ma->ma_need & MA_LOV_DEF) { rc = mdd_get_default_md(mdd_obj, ma->ma_lmm, - &ma->ma_lmm_size); + &ma->ma_lmm_size); if (rc > 0) { ma->ma_valid |= MA_LOV; rc = 0; diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 895120e..980db26 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -616,8 +616,10 @@ int mdd_get_default_md(struct mdd_object *mdd_obj, struct lov_mds_md *lmm, ldesc = &mdd->mdd_obd_dev->u.mds.mds_lov_desc; LASSERT(ldesc != NULL); - if (!lmm) + if (!lmm) { + *size = 0; RETURN(0); + } lmm->lmm_magic = LOV_MAGIC_V1; lmm->lmm_object_gr = LOV_OBJECT_GROUP_DEFAULT; @@ -641,12 +643,9 @@ static int __mdd_lmm_get(const struct lu_env *env, rc = mdd_get_md(env, mdd_obj, ma->ma_lmm, &ma->ma_lmm_size, XATTR_NAME_LOV); - - if (rc == 0 && (ma->ma_need & MA_LOV_DEF)) { + if (rc == 0 && (ma->ma_need & MA_LOV_DEF)) rc = mdd_get_default_md(mdd_obj, ma->ma_lmm, - &ma->ma_lmm_size); - } - + &ma->ma_lmm_size); if (rc > 0) { ma->ma_valid |= MA_LOV; rc = 0; diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 1dc4fe7..0b6b12f 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -400,20 +400,9 @@ static void mdt_pack_size2body(struct mdt_thread_info *info, void mdt_pack_attr2body(struct mdt_thread_info *info, struct mdt_body *b, const struct lu_attr *attr, const struct lu_fid *fid) { - struct md_attr *ma = &info->mti_attr; - - /*XXX should pack the reply body according to lu_valid*/ - b->valid |= OBD_MD_FLCTIME | OBD_MD_FLUID | - OBD_MD_FLGID | OBD_MD_FLTYPE | - OBD_MD_FLMODE | OBD_MD_FLNLINK | OBD_MD_FLFLAGS | - OBD_MD_FLATIME | OBD_MD_FLMTIME ; - - if (!S_ISREG(attr->la_mode)) - b->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS | OBD_MD_FLRDEV; + struct md_attr *ma = &info->mti_attr; - /* if no object is allocated on osts, the size on mds is valid. b=22272 */ - if (ma->ma_lmm_size == 0) - b->valid |= OBD_MD_FLSIZE; + LASSERT(ma->ma_valid & MA_INODE); b->atime = attr->la_atime; b->mtime = attr->la_mtime; @@ -427,6 +416,23 @@ void mdt_pack_attr2body(struct mdt_thread_info *info, struct mdt_body *b, b->nlink = attr->la_nlink; b->rdev = attr->la_rdev; + /*XXX should pack the reply body according to lu_valid*/ + b->valid |= OBD_MD_FLCTIME | OBD_MD_FLUID | + OBD_MD_FLGID | OBD_MD_FLTYPE | + OBD_MD_FLMODE | OBD_MD_FLNLINK | OBD_MD_FLFLAGS | + OBD_MD_FLATIME | OBD_MD_FLMTIME ; + + if (!S_ISREG(attr->la_mode)) { + b->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS | OBD_MD_FLRDEV; + } else if (ma->ma_need & MA_LOV && ma->ma_lmm_size == 0) { + /* means no objects are allocated on osts. */ + LASSERT(!(ma->ma_valid & MA_LOV)); + /* just ignore blocks occupied by extend attributes on MDS */ + b->blocks = 0; + /* if no object is allocated on osts, the size on mds is valid. b=22272 */ + b->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS; + } + if (fid) { b->fid1 = *fid; b->valid |= OBD_MD_FLID; @@ -534,9 +540,6 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, repbody->eadatasize = ma->ma_lmv_size; repbody->valid |= (OBD_MD_FLDIREA|OBD_MD_MEA); } - if (!(ma->ma_valid & MA_LOV) && !(ma->ma_valid & MA_LMV)) { - repbody->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS; - } } else if (S_ISLNK(la->la_mode) && reqbody->valid & OBD_MD_LINKNAME) { buffer->lb_buf = ma->ma_lmm; diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index f91fa02..801925a 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -1661,13 +1661,13 @@ int mdt_done_writing(struct mdt_thread_info *info) info->mti_attr.ma_valid = 0; info->mti_attr.ma_lmm_size = info->mti_mdt->mdt_max_mdsize; - OBD_ALLOC(info->mti_attr.ma_lmm, info->mti_attr.ma_lmm_size); + OBD_ALLOC(info->mti_attr.ma_lmm, info->mti_mdt->mdt_max_mdsize); if (info->mti_attr.ma_lmm == NULL) RETURN(-ENOMEM); rc = mdt_mfd_close(info, mfd); - OBD_FREE(info->mti_attr.ma_lmm, info->mti_attr.ma_lmm_size); + OBD_FREE(info->mti_attr.ma_lmm, info->mti_mdt->mdt_max_mdsize); mdt_empty_transno(info); RETURN(rc); } diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 56222c2..3ffd2e6 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -557,13 +557,13 @@ static int mdt_reint_setattr(struct mdt_thread_info *info, /* Close the found mfd, update attributes. */ ma->ma_lmm_size = info->mti_mdt->mdt_max_mdsize; - OBD_ALLOC(ma->ma_lmm, ma->ma_lmm_size); + OBD_ALLOC(ma->ma_lmm, info->mti_mdt->mdt_max_mdsize); if (ma->ma_lmm == NULL) GOTO(out_put, rc = -ENOMEM); mdt_mfd_close(info, mfd); - OBD_FREE(ma->ma_lmm, ma->ma_lmm_size); + OBD_FREE(ma->ma_lmm, info->mti_mdt->mdt_max_mdsize); } else { rc = mdt_attr_set(info, mo, ma, rr->rr_flags); if (rc)