diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index f314110747c71120985ce52a45f3876004b60c74..193ce82dc4473b6f264a651f95cbb19089abcd45 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -722,6 +722,9 @@ extern void lustre_swab_obdo (struct obdo *o); #define LOV_PATTERN_FIRST 0x100 /* first stripe is not in round-robin */ #define LOV_PATTERN_CMOBD 0x200 +#define LOV_OBJECT_GROUP_DEFAULT ~0ULL +#define LOV_OBJECT_GROUP_CLEAR 0ULL + #define lov_ost_data lov_ost_data_v1 struct lov_ost_data_v1 { /* per-stripe data structure (little-endian)*/ __u64 l_object_id; /* OST object ID */ diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h index 7fa59b25a12613c62049b53067da8272ab43d42c..42fbe90b9e58f7d1756e36a40ede0ff07e6a4a15 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -101,7 +101,8 @@ enum ma_valid { MA_COOKIE = (1 << 2), MA_FLAGS = (1 << 3), MA_LMV = (1 << 4), - MA_ACL_DEF = (1 << 5) + MA_ACL_DEF = (1 << 5), + MA_LOV_DEF = (1 << 6) }; typedef enum { diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index be1235849f296b8a596d71b27ea9ea068983dcb1..c10d4bc6f7baf01215ac4e3c717bc000fab6d46a 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -285,6 +285,29 @@ int mdd_iattr_get(const struct lu_env *env, struct mdd_object *mdd_obj, RETURN(rc); } +static int mdd_get_default_md(struct mdd_object *mdd_obj, + struct lov_mds_md *lmm, int *size) +{ + struct lov_desc *ldesc; + struct mdd_device *mdd = mdo2mdd(&mdd_obj->mod_obj); + ENTRY; + + ldesc = &mdd->mdd_obd_dev->u.mds.mds_lov_desc; + LASSERT(ldesc != NULL); + + if (!lmm) + RETURN(0); + + lmm->lmm_magic = LOV_MAGIC_V1; + lmm->lmm_object_gr = LOV_OBJECT_GROUP_DEFAULT; + lmm->lmm_pattern = ldesc->ld_pattern; + lmm->lmm_stripe_size = ldesc->ld_default_stripe_size; + lmm->lmm_stripe_count = ldesc->ld_default_stripe_count; + *size = sizeof(struct lov_mds_md); + + RETURN(sizeof(struct lov_mds_md)); +} + /* get lov EA only */ static int __mdd_lmm_get(const struct lu_env *env, struct mdd_object *mdd_obj, struct md_attr *ma) @@ -297,6 +320,12 @@ static int __mdd_lmm_get(const struct lu_env *env, rc = mdd_get_md(env, mdd_obj, ma->ma_lmm, &ma->ma_lmm_size, MDS_LOV_MD_NAME); + + if (rc == 0 && (ma->ma_need & MA_LOV_DEF)) { + rc = mdd_get_default_md(mdd_obj, ma->ma_lmm, + &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 f4d0262df41e9a643be65717a4095199af82238b..206b5bde87fd199a8625e860d5918f5d923264e9 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -449,6 +449,12 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, ma->ma_need = MA_LOV | MA_INODE; } + if (S_ISDIR(lu_object_attr(&next->mo_lu)) && + reqbody->valid & OBD_MD_FLDIREA && + lustre_msg_get_opc(req->rq_reqmsg) == MDS_GETATTR) { + /* get default stripe info for this dir. */ + ma->ma_need |= MA_LOV_DEF; + } rc = mo_attr_get(env, next, ma); if (unlikely(rc)) { CERROR("getattr error for "DFID": %d\n", diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 764e4133b7cd2f566ee659403686eb8d03a008ab..bae08630e029923020e293fc170ef6db3f75277a 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -2811,7 +2811,7 @@ test_65e() { mkdir -p $DIR/d65 $SETSTRIPE $DIR/d65 || error "setstripe" - $GETSTRIPE -v $DIR/d65 | grep "has no stripe info" || error "no stripe info failed" + $GETSTRIPE -v $DIR/d65 | grep "Default" || error "no stripe info failed" touch $DIR/d65/f6 $LVERIFY $DIR/d65 $DIR/d65/f6 || error "lverify failed" } @@ -2827,7 +2827,7 @@ test_65g() { mkdir -p $DIR/d65 $SETSTRIPE $DIR/d65 -s $(($STRIPESIZE * 2)) -i 0 -c 1 || error "setstripe" $SETSTRIPE -d $DIR/d65 || error "setstripe" - $GETSTRIPE -v $DIR/d65 | grep "has no stripe info" || \ + $GETSTRIPE -v $DIR/d65 | grep "Default" || \ error "delete default stripe failed" } run_test 65g "directory setstripe -d ===========================" diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index 8efe2db20dc1caa714ff6a53b4363251ba17b54d..185be04120a5e1babb925a19dd64dec090265d06 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -518,8 +518,12 @@ void lov_dump_user_lmm_v1(struct lov_user_md_v1 *lum, char *path, int is_dir, /* if it's a directory */ if (is_dir) { if (obdstripe == 1) { + if (lum->lmm_object_gr == LOV_OBJECT_GROUP_DEFAULT) { + llapi_printf(LLAPI_MSG_NORMAL, "(Default) "); + lum->lmm_object_gr = LOV_OBJECT_GROUP_CLEAR; + } llapi_printf(LLAPI_MSG_NORMAL, - "default stripe_count: %d stripe_size: %u " + "stripe_count: %d stripe_size: %u " "stripe_offset: %d\n", lum->lmm_stripe_count == (__u16)-1 ? -1 : lum->lmm_stripe_count,