Whamcloud - gitweb
LU-2915 lfsck: LFSCK 1.5 technical debts (3)
[fs/lustre-release.git] / lustre / mdd / mdd_dir.c
index a587939..9f3c333 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2012, Intel Corporation.
+ * Copyright (c) 2011, 2013, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -876,6 +876,9 @@ static int __mdd_links_add(const struct lu_env *env,
                linkea_add_buf(ldata, lname, tfid);
        }
 
+       if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_LINKEA_MORE2))
+               linkea_add_buf(ldata, lname, pfid);
+
        return linkea_add_buf(ldata, lname, pfid);
 }
 
@@ -919,9 +922,12 @@ static int mdd_linkea_prepare(const struct lu_env *env,
 
        LASSERT(oldpfid != NULL || newpfid != NULL);
 
-       if (mdd_obj->mod_flags & DEAD_OBJ)
+       if (mdd_obj->mod_flags & DEAD_OBJ) {
+               /* Prevent linkea to be updated which is NOT necessary. */
+               ldata->ld_reclen = 0;
                /* No more links, don't bother */
                RETURN(0);
+       }
 
        if (oldpfid != NULL) {
                rc = __mdd_links_del(env, mdd_obj, ldata, oldlname, oldpfid);
@@ -973,7 +979,7 @@ int mdd_links_rename(const struct lu_env *env,
                        GOTO(out, rc);
        }
 
-       if (ldata->ld_lee != NULL)
+       if (ldata->ld_reclen != 0)
                rc = mdd_links_write(env, mdd_obj, ldata, handle);
        EXIT;
 out:
@@ -981,7 +987,7 @@ out:
                rc = rc2;
        if (rc) {
                int error = 1;
-               if (rc == -EOVERFLOW || rc == -ENOENT)
+               if (rc == -EOVERFLOW || rc == -ENOENT || rc == -ENOSPC)
                        error = 0;
                if (oldpfid == NULL)
                        CDEBUG(error ? D_ERROR : D_OTHER,
@@ -1108,7 +1114,7 @@ int mdd_declare_links_add(const struct lu_env *env, struct mdd_object *mdd_obj,
                ea_len = ldata->ld_leh->leh_len;
                linkea = ldata->ld_buf->lb_buf;
        } else {
-               ea_len = 4096;
+               ea_len = DEFAULT_LINKEA_SIZE;
                linkea = NULL;
        }
 
@@ -1287,8 +1293,9 @@ int mdd_finish_unlink(const struct lu_env *env,
 
         LASSERT(mdd_write_locked(env, obj) != 0);
 
-       if (rc == 0 && (ma->ma_attr.la_nlink == 0 || is_dir)) {
+       if (ma->ma_attr.la_nlink == 0 || is_dir) {
                 obj->mod_flags |= DEAD_OBJ;
+
                 /* add new orphan and the object
                  * will be deleted during mdd_close() */
                 if (obj->mod_count) {
@@ -1716,9 +1723,7 @@ static int mdd_declare_object_initialize(const struct lu_env *env,
                                              dotdot, handle);
         }
 
-       if (rc == 0 && (fid_is_norm(mdo2fid(child)) ||
-                       fid_is_dot_lustre(mdo2fid(child)) ||
-                       fid_is_root(mdo2fid(child))))
+       if (rc == 0)
                mdd_declare_links_add(env, child, handle, ldata);
 
        RETURN(rc);
@@ -1758,9 +1763,7 @@ static int mdd_object_initialize(const struct lu_env *env,
                         mdo_ref_del(env, child, handle);
         }
 
-       if (rc == 0 && (fid_is_norm(mdo2fid(child)) ||
-                       fid_is_dot_lustre(mdo2fid(child)) ||
-                       fid_is_root(mdo2fid(child))))
+       if (rc == 0)
                mdd_links_add(env, child, pfid, lname, handle, ldata, 1);
 
        RETURN(rc);