-static int mdd_declare_lfsck_namespace_unlink(const struct lu_env *env,
- struct mdd_device *mdd,
- struct dt_object *p,
- struct dt_object *c,
- const char *name,
- struct thandle *handle)
-{
- int rc;
-
- rc = dt_declare_delete(env, p, (const struct dt_key *)name, handle);
- if (rc != 0)
- return rc;
-
- rc = dt_declare_ref_del(env, c, handle);
- if (rc != 0)
- return rc;
-
- rc = dt_declare_destroy(env, c, handle);
- return rc;
-}
-
-static int mdd_lfsck_namespace_unlink(const struct lu_env *env,
- struct mdd_device *mdd,
- struct lfsck_component *com)
-{
- struct mdd_thread_info *info = mdd_env_info(env);
- struct lu_fid *fid = &info->mti_fid;
- struct dt_object *child = com->lc_obj;
- struct dt_object *parent;
- struct thandle *handle;
- bool locked = false;
- int rc;
- ENTRY;
-
- parent = dt_store_resolve(env, mdd->mdd_bottom, "", fid);
- if (IS_ERR(parent))
- RETURN(rc = PTR_ERR(parent));
-
- if (!dt_try_as_dir(env, parent))
- GOTO(out, rc = -ENOTDIR);
-
- handle = dt_trans_create(env, mdd->mdd_bottom);
- if (IS_ERR(handle))
- GOTO(out, rc = PTR_ERR(handle));
-
- rc = mdd_declare_lfsck_namespace_unlink(env, mdd, parent, child,
- lfsck_namespace_name, handle);
- if (rc != 0)
- GOTO(stop, rc);
-
- rc = dt_trans_start_local(env, mdd->mdd_bottom, handle);
- if (rc != 0)
- GOTO(stop, rc);
-
- dt_write_lock(env, child, MOR_TGT_CHILD);
- locked = true;
- rc = dt_delete(env, parent, (struct dt_key *)lfsck_namespace_name,
- handle, BYPASS_CAPA);
- if (rc != 0)
- GOTO(stop, rc);
-
- rc = child->do_ops->do_ref_del(env, child, handle);
- if (rc != 0) {
- lu_local_obj_fid(fid, LFSCK_NAMESPACE_OID);
- rc = dt_insert(env, parent,
- (const struct dt_rec*)fid,
- (const struct dt_key *)lfsck_namespace_name,
- handle, BYPASS_CAPA, 1);
-
- GOTO(stop, rc);
- }
-
-
- rc = dt_destroy(env, child, handle);
-
- GOTO(stop, rc);
-
-stop:
- if (locked)
- dt_write_unlock(env, child);
-
- if (rc == 0) {
- lu_object_put(env, &child->do_lu);
- com->lc_obj = NULL;
- }
-
- dt_trans_stop(env, mdd->mdd_bottom, handle);
-
-out:
- lu_object_put(env, &parent->do_lu);
- return rc;
-}
-