Whamcloud - gitweb
LU-5512 lfsck: repair dangling name entry
[fs/lustre-release.git] / lustre / mdd / mdd_dir.c
index acb4775..b1bff5c 100644 (file)
@@ -1321,9 +1321,21 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj,
                GOTO(out_unlock, rc);
 
 
-       rc = __mdd_index_insert_only(env, mdd_tobj, mdo2fid(mdd_sobj),
-                                    mdd_object_type(mdd_sobj), name, handle,
-                                    mdd_object_capa(env, mdd_tobj));
+       if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DANGLING3)) {
+               struct lu_fid tfid = *mdo2fid(mdd_sobj);
+
+               tfid.f_oid++;
+               rc = __mdd_index_insert_only(env, mdd_tobj, &tfid,
+                                            mdd_object_type(mdd_sobj),
+                                            name, handle,
+                                            mdd_object_capa(env, mdd_tobj));
+       } else {
+               rc = __mdd_index_insert_only(env, mdd_tobj, mdo2fid(mdd_sobj),
+                                            mdd_object_type(mdd_sobj),
+                                            name, handle,
+                                            mdd_object_capa(env, mdd_tobj));
+       }
+
        if (rc != 0) {
                mdo_ref_del(env, mdd_sobj, handle);
                GOTO(out_unlock, rc);
@@ -1473,20 +1485,25 @@ int mdd_unlink_sanity_check(const struct lu_env *env, struct mdd_object *pobj,
 static int mdd_declare_unlink(const struct lu_env *env, struct mdd_device *mdd,
                              struct mdd_object *p, struct mdd_object *c,
                              const struct lu_name *name, struct md_attr *ma,
-                             struct thandle *handle, int no_name)
+                             struct thandle *handle, int no_name, int is_dir)
 {
-       struct lu_attr     *la = &mdd_env_info(env)->mti_la_for_fix;
-        int rc;
+       struct lu_attr  *la = &mdd_env_info(env)->mti_la_for_fix;
+       int              rc;
 
-       if (likely(no_name == 0)) {
-               rc = mdo_declare_index_delete(env, p, name->ln_name, handle);
-               if (rc)
-                       return rc;
-       }
+       if (!OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DANGLING2)) {
+               if (likely(no_name == 0)) {
+                       rc = mdo_declare_index_delete(env, p, name->ln_name,
+                                                     handle);
+                       if (rc != 0)
+                               return rc;
+               }
 
-        rc = mdo_declare_ref_del(env, p, handle);
-        if (rc)
-                return rc;
+               if (is_dir != 0) {
+                       rc = mdo_declare_ref_del(env, p, handle);
+                       if (rc != 0)
+                               return rc;
+               }
+       }
 
        LASSERT(ma->ma_attr.la_valid & LA_CTIME);
        la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime;
@@ -1606,7 +1623,7 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj,
                RETURN(PTR_ERR(handle));
 
        rc = mdd_declare_unlink(env, mdd, mdd_pobj, mdd_cobj,
-                               lname, ma, handle, no_name);
+                               lname, ma, handle, no_name, is_dir);
        if (rc)
                GOTO(stop, rc);
 
@@ -1617,7 +1634,7 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj,
        if (likely(mdd_cobj != NULL))
                mdd_write_lock(env, mdd_cobj, MOR_TGT_CHILD);
 
-       if (likely(no_name == 0)) {
+       if (likely(no_name == 0) && !OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DANGLING2)) {
                rc = __mdd_index_delete(env, mdd_pobj, name, is_dir, handle,
                                        mdd_object_capa(env, mdd_pobj));
                if (rc)