From a14a7e83d0c2c1d139c883f5ad976047384c4f5a Mon Sep 17 00:00:00 2001 From: huanghua Date: Tue, 21 Nov 2006 02:36:42 +0000 Subject: [PATCH] (1) do not return any entry to client for a dead directory; (2) add nlink overflow checking for mkdir. more checking will be added soon. --- lustre/mdd/mdd_device.c | 4 +--- lustre/mdd/mdd_dir.c | 6 +++++- lustre/mdd/mdd_object.c | 22 ++++++++++++++++++---- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lustre/mdd/mdd_device.c b/lustre/mdd/mdd_device.c index 7592070..deb8cea 100644 --- a/lustre/mdd/mdd_device.c +++ b/lustre/mdd/mdd_device.c @@ -51,12 +51,10 @@ static int mdd_device_init(const struct lu_env *env, struct lu_device *d, const char *name, struct lu_device *next) { struct mdd_device *mdd = lu2mdd_dev(d); - struct dt_device *dt; - int rc = 0; + int rc; ENTRY; mdd->mdd_child = lu2dt_dev(next); - dt = mdd->mdd_child; /* Prepare transactions callbacks. */ mdd->mdd_txn_cb.dtc_txn_start = mdd_txn_start_cb; diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index bff8fdc..5f8662d 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -1050,8 +1050,12 @@ static int mdd_create_sanity_check(const struct lu_env *env, } switch (ma->ma_attr.la_mode & S_IFMT) { + case S_IFDIR: { + struct mdd_device *mdd = mdo2mdd(pobj); + if (la->la_nlink >= mdd->mdd_dt_conf.ddp_max_nlink) + RETURN(-EMLINK); + } case S_IFREG: - case S_IFDIR: case S_IFLNK: case S_IFCHR: case S_IFBLK: diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index e47eb93..317497e 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -1424,13 +1424,11 @@ static int __mdd_readpage(const struct lu_env *env, struct mdd_object *obj, static int mdd_readpage(const struct lu_env *env, struct md_object *obj, const struct lu_rdpg *rdpg) { - struct dt_object *next; struct mdd_object *mdd_obj = md2mdd_obj(obj); int rc; ENTRY; LASSERT(lu_object_exists(mdd2lu_obj(mdd_obj))); - next = mdd_object_child(mdd_obj); mdd_read_lock(env, mdd_obj); rc = mdd_readpage_sanity_check(env, mdd_obj); @@ -1438,13 +1436,29 @@ static int mdd_readpage(const struct lu_env *env, struct md_object *obj, GOTO(out_unlock, rc); if (mdd_is_dead_obj(mdd_obj)) { + struct page *pg; + struct lu_dirpage *dp; + /* - * TODO: * According to POSIX, please do not return any entry to client: - * even dot and dotdot should not be returned. How to do this? + * even dot and dotdot should not be returned. */ CWARN("readdir from dead object: "DFID"\n", PFID(lu_object_fid(mdd2lu_obj(mdd_obj)))); + + if (rdpg->rp_count <= 0) + GOTO(out_unlock, rc = -EFAULT); + LASSERT(rdpg->rp_pages != NULL); + + pg = rdpg->rp_pages[0]; + dp = (struct lu_dirpage*)kmap(pg); + memset(dp, 0 , sizeof(struct lu_dirpage)); + dp->ldp_hash_start = rdpg->rp_hash; + dp->ldp_hash_end = DIR_END_OFF; + dp->ldp_flags |= LDF_EMPTY; + dp->ldp_flags = cpu_to_le16(dp->ldp_flags); + kunmap(pg); + GOTO(out_unlock, rc = 0); } rc = __mdd_readpage(env, mdd_obj, rdpg); -- 1.8.3.1