Whamcloud - gitweb
(1) do not return any entry to client for a dead directory;
authorhuanghua <huanghua>
Tue, 21 Nov 2006 02:36:42 +0000 (02:36 +0000)
committerhuanghua <huanghua>
Tue, 21 Nov 2006 02:36:42 +0000 (02:36 +0000)
(2) add nlink overflow checking for mkdir. more checking will be added soon.

lustre/mdd/mdd_device.c
lustre/mdd/mdd_dir.c
lustre/mdd/mdd_object.c

index 7592070..deb8cea 100644 (file)
@@ -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;
index bff8fdc..5f8662d 100644 (file)
@@ -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:
index e47eb93..317497e 100644 (file)
@@ -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);