+ rc = snprintf(key, NAME_MAX + 1, ORPHAN_FILE_NAME_FORMAT_18,
+ (unsigned long long)fid_seq(lf), fid_oid(lf));
+ if (rc > 0)
+ return (struct dt_key*) key;
+ else
+ return ERR_PTR(rc);
+}
+
+static inline void mdd_orphan_write_lock(const struct lu_env *env,
+ struct mdd_device *mdd)
+{
+
+ struct dt_object *dor = mdd->mdd_orphans;
+ dor->do_ops->do_write_lock(env, dor, MOR_TGT_ORPHAN);
+}
+
+static inline void mdd_orphan_write_unlock(const struct lu_env *env,
+ struct mdd_device *mdd)
+{
+
+ struct dt_object *dor = mdd->mdd_orphans;
+ dor->do_ops->do_write_unlock(env, dor);
+}
+
+static inline int mdd_orphan_insert_obj(const struct lu_env *env,
+ struct mdd_device *mdd,
+ struct mdd_object *obj,
+ __u32 op,
+ struct thandle *th)
+{
+ struct dt_object *dor = mdd->mdd_orphans;
+ const struct lu_fid *lf = mdo2fid(obj);
+ struct dt_key *key = orph_key_fill(env, lf, op);
+ ENTRY;
+
+ return dor->do_index_ops->dio_insert(env, dor,
+ (struct dt_rec *)lf,
+ key, th,
+ BYPASS_CAPA, 1);
+}
+
+static inline int mdd_orphan_delete_obj(const struct lu_env *env,
+ struct mdd_device *mdd ,
+ struct dt_key *key,
+ struct thandle *th)
+{
+ struct dt_object *dor = mdd->mdd_orphans;
+
+ return dor->do_index_ops->dio_delete(env, dor,
+ key, th,
+ BYPASS_CAPA);
+}
+
+static inline void mdd_orphan_ref_add(const struct lu_env *env,
+ struct mdd_device *mdd,
+ struct thandle *th)
+{
+ struct dt_object *dor = mdd->mdd_orphans;
+ dor->do_ops->do_ref_add(env, dor, th);
+}
+
+static inline void mdd_orphan_ref_del(const struct lu_env *env,
+ struct mdd_device *mdd,
+ struct thandle *th)
+{
+ struct dt_object *dor = mdd->mdd_orphans;
+ dor->do_ops->do_ref_del(env, dor, th);
+}
+
+
+int orph_declare_index_insert(const struct lu_env *env,
+ struct mdd_object *obj,
+ umode_t mode, struct thandle *th)
+{
+ struct mdd_device *mdd = mdo2mdd(&obj->mod_obj);
+ struct dt_key *key;
+ int rc;
+
+ key = orph_key_fill(env, mdo2fid(obj), ORPH_OP_UNLINK);
+
+ rc = dt_declare_insert(env, mdd->mdd_orphans, NULL, key, th);
+ if (rc)
+ return rc;
+
+ rc = mdo_declare_ref_add(env, obj, th);
+ if (rc)
+ return rc;
+
+ if (!S_ISDIR(mode))
+ return 0;
+
+ rc = mdo_declare_ref_add(env, obj, th);
+ if (rc)
+ return rc;
+
+ rc = dt_declare_ref_add(env, mdd->mdd_orphans, th);
+ if (rc)
+ return rc;
+
+ rc = mdo_declare_index_delete(env, obj, dotdot, th);
+ if (rc)
+ return rc;
+
+ rc = mdo_declare_index_insert(env, obj, NULL, dotdot, th);
+
+ return rc;