RETURN(rc);
}
-static int mdd_add_orphan(struct mdd_device *mdd, struct mdd_object *obj,
- struct thandle *handle)
-{
- int rc = 0;
- ENTRY;
-
- RETURN(rc);
-}
-
-static int open_orphan(struct mdd_object *obj)
-{
- return 0;
-}
-
-static int mdd_add_unlink_log(struct mdd_device *mdd, struct mdd_object *obj,
- struct thandle *handle)
-{
- return 0;
-}
-
enum mdd_txn_op {
MDD_TXN_OBJECT_DESTROY_OP,
MDD_TXN_OBJECT_CREATE_OP,
GOTO(out, rc);
if (lu_attr->la_nlink == 0) {
-
mdd_txn_param_build(ctxt, &MDD_TXN_OBJECT_CREATE);
handle = mdd_trans_start(ctxt, mdd);
if (IS_ERR(handle))
GOTO(out, rc = PTR_ERR(handle));
-
- if (open_orphan(mdd_obj))
- rc = mdd_add_orphan(mdd, mdd_obj, handle);
- else {
- rc = __mdd_object_destroy(ctxt, mdd_obj, handle);
- if (rc == 0)
- rc = mdd_add_unlink_log(mdd, mdd_obj, handle);
- }
+ rc = __mdd_object_destroy(ctxt, mdd_obj, handle);
mdd_trans_stop(ctxt, mdd, handle);
}
out:
}
static int __mdd_index_delete(const struct lu_context *ctxt,
- struct mdd_device *mdd, struct mdd_object *pobj,
- const char *name, struct thandle *handle)
+ struct mdd_object *pobj, const char *name,
+ struct thandle *handle)
{
int rc;
struct dt_object *next = mdd_object_child(pobj);
mdd_lock2(ctxt, mdd_pobj, mdd_cobj);
- rc = __mdd_index_delete(ctxt, mdd, mdd_pobj, name, handle);
+ rc = __mdd_index_delete(ctxt, mdd_pobj, name, handle);
if (rc)
GOTO(cleanup, rc);
mdd_rename_lock(mdd, mdd_spobj, mdd_tpobj, mdd_tobj);
- rc = __mdd_index_delete(ctxt, mdd, mdd_spobj, sname, handle);
+ rc = __mdd_index_delete(ctxt, mdd_spobj, sname, handle);
if (rc)
GOTO(cleanup, rc);
if (tobj) {
- rc = __mdd_index_delete(ctxt, mdd, mdd_tpobj, tname, handle);
+ rc = __mdd_index_delete(ctxt, mdd_tpobj, tname, handle);
if (rc)
GOTO(cleanup, rc);
}
RETURN(rc);
}
+static int mdd_name_remove(const struct lu_context *ctxt,
+ struct md_object *pobj,
+ const char *name)
+{
+ struct mdd_device *mdd = mdo2mdd(pobj);
+ struct mdd_object *mdo = md2mdd_obj(pobj);
+ struct thandle *handle;
+ int rc = 0;
+ ENTRY;
+
+ mdd_txn_param_build(ctxt, &MDD_TXN_INDEX_DELETE);
+ handle = mdd_trans_start(ctxt, mdd);
+ if (IS_ERR(handle))
+ RETURN(PTR_ERR(handle));
+
+ mdd_lock(ctxt, mdo, DT_WRITE_LOCK);
+
+ rc = __mdd_index_delete(ctxt, mdo, name, handle);
+
+ mdd_unlock(ctxt, mdo, DT_WRITE_LOCK);
+
+ mdd_trans_stop(ctxt, mdd, handle);
+ RETURN(rc);
+}
+
+static int mdd_rename_tgt(const struct lu_context *ctxt, struct md_object *pobj,
+ struct md_object *tobj, const struct lu_fid *lf,
+ const char *name)
+{
+ struct mdd_device *mdd = mdo2mdd(pobj);
+ struct mdd_object *mdd_tpobj = md2mdd_obj(pobj);
+ struct mdd_object *mdd_tobj = NULL;
+ struct thandle *handle;
+ int rc;
+ ENTRY;
+
+ mdd_txn_param_build(ctxt, &MDD_TXN_RENAME);
+ handle = mdd_trans_start(ctxt, mdd);
+ if (IS_ERR(handle))
+ RETURN(PTR_ERR(handle));
+
+ if (tobj)
+ mdd_tobj = md2mdd_obj(tobj);
+
+ mdd_lock2(ctxt, mdd_tpobj, mdd_tobj);
+
+ if (tobj) {
+ rc = __mdd_index_delete(ctxt, mdd_tpobj, name, handle);
+ if (rc)
+ GOTO(cleanup, rc);
+ }
+
+ rc = __mdd_index_insert(ctxt, mdd_tpobj, lf, name, handle);
+ if (rc)
+ GOTO(cleanup, rc);
+
+ if (tobj && lu_object_exists(ctxt, &tobj->mo_lu)) {
+ rc = __mdd_object_destroy(ctxt, mdd_tobj, handle);
+ if (rc)
+ GOTO(cleanup, rc);
+ }
+cleanup:
+ /*FIXME: should we do error handling here?*/
+ mdd_unlock2(ctxt, mdd_tpobj, mdd_tobj);
+ mdd_trans_stop(ctxt, mdd, handle);
+ RETURN(rc);
+}
+
static int mdd_root_get(const struct lu_context *ctx,
struct md_device *m, struct lu_fid *f)
{
RETURN(rc);
}
+static int mdd_open(const struct lu_context *ctxt, struct md_object *obj)
+{
+ return 0;
+}
+
+static int mdd_close(const struct lu_context *ctxt, struct md_object *obj)
+{
+ return 0;
+}
+
struct md_device_operations mdd_ops = {
.mdo_root_get = mdd_root_get,
.mdo_statfs = mdd_statfs,
.mdo_create = mdd_create,
.mdo_rename = mdd_rename,
.mdo_link = mdd_link,
+ .mdo_unlink = mdd_unlink,
.mdo_name_insert = mdd_mkname,
- .mdo_unlink = mdd_unlink
+ .mdo_name_remove = mdd_name_remove,
+ .mdo_rename_tgt = mdd_rename_tgt,
};
.moo_object_create = mdd_object_create,
.moo_ref_add = mdd_ref_add,
.moo_ref_del = mdd_ref_del,
+ .moo_open = mdd_open,
+ .moo_close = mdd_close
};
static struct obd_ops mdd_obd_device_ops = {
static void mdd_device_free(const struct lu_context *ctx, struct lu_device *lu)
{
struct mdd_device *m = lu2mdd_dev(lu);
- struct dt_device *dt_lov = &m->mdd_lov_dev;
LASSERT(atomic_read(&lu->ld_ref) == 0);
md_device_fini(&m->mdd_md_dev);
-
- if (dt_lov->dd_lu_dev.ld_type != NULL)
- class_put_type(dt_lov->dd_lu_dev.ld_type->ldt_obd_type);
-
OBD_FREE_PTR(m);
}