+
+ LASSERT(key);
+ 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;
+ dt_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;
+ dt_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_insert_rec *rec = &mdd_env_info(env)->mti_dt_rec;
+ struct dt_object *dor = mdd->mdd_orphans;
+ const struct lu_fid *lf = mdo2fid(obj);
+ struct dt_key *key = orph_key_fill(env, lf, op);
+
+ rec->rec_fid = lf;
+ rec->rec_type = mdd_object_type(obj);
+
+ return dt_insert(env, dor, (const struct dt_rec *)rec, key, th, 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 dt_delete(env, dor, key, th);
+}
+
+static inline int mdd_orphan_ref_add(const struct lu_env *env,
+ struct mdd_device *mdd,
+ struct thandle *th)
+{
+ struct dt_object *dor = mdd->mdd_orphans;
+ return dt_ref_add(env, dor, th);
+}
+
+static inline int mdd_orphan_ref_del(const struct lu_env *env,
+ struct mdd_device *mdd,
+ struct thandle *th)
+{
+ struct dt_object *dor = mdd->mdd_orphans;
+ return dt_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 dt_insert_rec *rec = &mdd_env_info(env)->mti_dt_rec;
+ struct mdd_device *mdd = mdo2mdd(&obj->mod_obj);
+ struct dt_key *key;
+ int rc;
+
+ key = orph_key_fill(env, mdo2fid(obj), ORPH_OP_UNLINK);
+
+ rec->rec_fid = mdo2fid(obj);
+ rec->rec_type = mode;
+ rc = dt_declare_insert(env, mdd->mdd_orphans,
+ (const struct dt_rec *)rec, key, th);
+ if (rc != 0)
+ 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,
+ lu_object_fid(&mdd->mdd_orphans->do_lu),
+ S_IFDIR, dotdot, th);
+
+ return rc;
+}
+
+static int orph_index_insert(const struct lu_env *env,
+ struct mdd_object *obj,
+ __u32 op, struct thandle *th)
+{
+ struct mdd_device *mdd = mdo2mdd(&obj->mod_obj);
+ struct dt_object *dor = mdd->mdd_orphans;
+ const struct lu_fid *lf_dor = lu_object_fid(&dor->do_lu);
+ struct dt_object *next = mdd_object_child(obj);
+ struct dt_insert_rec *rec = &mdd_env_info(env)->mti_dt_rec;
+ int rc;