#ifndef EXPORT_SYMTAB
# define EXPORT_SYMTAB
#endif
-#define DEBUG_SUBSYSTEM S_MDD
+#define DEBUG_SUBSYSTEM S_MDS
#include <linux/module.h>
#include "mdd_internal.h"
-static int
-mdd_init(struct lu_device *lu)
-{
- return 0;
-}
-
-static int
-mdd_fini(struct lu_device *lu)
-{
- return 0;
-}
-
static struct lu_device_operations mdd_lu_ops;
static int lu_device_is_mdd(struct lu_device *d)
return container_of(o, struct mdd_object, mod_obj.mo_lu);
}
-static struct mdd_device *mdd_dev(struct lu_device *d)
+static struct mdd_device* mdd_dev(struct lu_device *d)
{
LASSERT(lu_device_is_mdd(d));
return container_of(d, struct mdd_device, mdd_md_dev.md_lu_dev);
}
-static struct mdd_device* mdo2mdd(struct mdd_object *mdo)
+static struct mdd_device* mdo2mdd(struct md_object *mdo)
{
- return mdd_dev(mdo->mo_lu->lu_device);
+ return mdd_dev(mdo->mo_lu.lo_dev);
+}
+
+static struct mdd_object* mdo2mddo(struct md_object *mdo)
+{
+ return container_of(mdo, struct mdd_object, mod_obj);
+}
+
+static inline struct osd_device_operations *mdd_child_ops(struct mdd_device *d)
+{
+ return d->mdd_child->osd_ops;
}
struct lu_object *mdd_object_alloc(struct lu_device *d)
OBD_ALLOC_PTR(mdo);
if (mdo != NULL) {
- lu_object_init(o, NULL, d);
- return (&mdo->mod_obj);
+ struct lu_object *o;
+
+ o = &mdo->mod_obj.mo_lu;
+ lu_object_init(o, NULL, d);
+ return (&mdo->mod_obj.mo_lu);
} else
return(NULL);
}
int mdd_object_init(struct lu_object *o)
{
struct mdd_device *d = mdd_dev(o->lo_dev);
- struct lu_object_header *loh;
- struct lu_object *below, *upper;
+ struct lu_object *below;
struct lu_device *under;
ENTRY;
- under = &d->mdd_child->md_lu_dev;
+ under = &d->mdd_child->osd_lu_dev;
below = under->ld_ops->ldo_object_alloc(under);
if (below == NULL)
RETURN(-ENOMEM);
-
- if (o->lo_header)
+
+ if (o->lo_header)
lu_object_add_top(o->lo_header, o);
-
+
lu_object_add(o, below);
RETURN(0);
}
void mdd_object_release(struct lu_object *o)
{
- struct mdt_device *d = mdt_dev(o->lo_dev);
+ struct mdd_device *d = mdd_dev(o->lo_dev);
+}
- lu_object_release(o);
+int mdd_object_print(struct seq_file *f, const struct lu_object *o)
+{
+ return seq_printf(f, LUSTRE_MDD_NAME"-object@%p", o);
}
static struct lu_device_operations mdd_lu_ops = {
- .ldo_init = mdd_init,
- .ldo_fini = mdd_fini,
.ldo_object_alloc = mdd_object_alloc,
.ldo_object_init = mdd_object_init,
.ldo_object_free = mdd_object_free,
.ldo_object_release = mdd_object_release,
.ldo_object_print = mdd_object_print
-}
+};
struct lu_object* mdd_object_child(struct mdd_object *o)
{
return lu_object_next(&o->mod_obj.mo_lu);
}
-static void
-mdd_lock(struct mdd_device *mdd, struct mdd_obj *obj, __u32 mode)
+static void
+mdd_lock(struct mdd_device *mdd, struct mdd_object *obj, __u32 mode)
{
- mdd->mdd_child->osd_ops->osd_lock_obj(osd, mdd_object_child(obj), mode);
+ mdd_child_ops(mdd)->osd_object_lock(mdd_object_child(obj), mode);
}
static void
-mdd_unlock(struct mdd_device *mdd, struct mdd_obj *obj, __u32 mode)
+mdd_unlock(struct mdd_device *mdd, struct mdd_object *obj, __u32 mode)
{
- mdd->mdd_child->osd_ops->osd_unlock_obj(osd, mdd_object_child(obj),
- mode);
+ mdd_child_ops(mdd)->osd_object_unlock(mdd_object_child(obj), mode);
}
static void* mdd_trans_start(struct mdd_device *mdd, struct mdd_object *obj)
{
- return mdd->mdd_child->osd_ops->osd_trans_start(obj);
+ return mdd_child_ops(mdd)->osd_trans_start(mdd_object_child(obj));
}
static void mdd_trans_stop(struct mdd_device *mdd, void *handle)
{
- mdd->mdd_child->osd_ops->osd_trans_stop(handle);
+ mdd_child_ops(mdd)->osd_trans_stop(handle);
}
static int
__mdd_object_create(struct mdd_device *mdd, struct mdd_object *pobj,
- struct context *uc_context, void *handle)
+ struct mdd_object *child, struct context *uctxt,
+ void *handle)
{
struct mdd_object *mdd_obj;
struct lu_object *lu;
int rc;
ENTRY;
- rc = mdd->mdd_child->osd_ops->osd_create_obj(mdd->mdd_child, mdd_obj_child(pobj),
- &lu, uctxt, handle);
+ rc = mdd_child_ops(mdd)->osd_object_create(mdd_object_child(pobj),
+ mdd_object_child(child),
+ uctxt, handle);
/*XXX increase the refcount of the object or not?*/
-exit:
RETURN(rc);
}
static int
-mdd_object_create(struct mdd_obj *pobj, struct context *uc_context)
+mdd_object_create(struct mdd_object *pobj, struct mdd_object *child,
+ struct context *uctxt)
{
- struct mdd_device *mdd = mdo2mdd(pobj);
+ struct mdd_device *mdd = mdo2mdd(pobj);
void *handle = NULL;
int rc;
ENTRY;
if (!handle)
RETURN(-ENOMEM);
- rc = __mdd_object_create(mdd, obj, uc_context, handle);
+ rc = __mdd_object_create(mdd, pobj, child, uctxt, handle);
mdd_trans_stop(handle);
RETURN(rc);
}
-static int mdd_add_orphan(struct obd_device *obd, struct mdd_object *mdd_obj,
+static int mdd_add_orphan(struct obd_device *obd, struct mdd_object *obj,
void *handle)
{
int rc = 0;
}
static int
-_mdd_object_destroy(struct mdd_device *mdd, struct mdd_obj *obj,
+_mdd_object_destroy(struct mdd_device *mdd, struct mdd_object *obj,
void *handle)
{
int rc = 0;
- rc = mdd->mdd_child->osd_ops->osd_object_destroy(mdd->mdd_child,
- mdd_object_child(obj), handle);
-
- RETURN(rc);
-}
+ rc = mdd_child_ops(mdd)->osd_object_destroy(mdd_object_child(obj),
+ handle);
+ RETURN(rc);
+}
-static int
-mdd_object_destroy(struct mdd_object *pobj, struct mdd_object *obj)
+static int
+mdd_object_destroy(struct md_object *pobj, struct mdd_object *obj)
{
struct mdd_device *mdd = mdo2mdd(pobj);
void *handle;
}
static void
-mdd_object_get(struct mdd_device *mdd, struct mdd_obj *obj)
+mdd_object_get(struct mdd_device *mdd, struct mdd_object *obj)
{
- mdd->mdd_child->osd_ops->osd_object_get(mdd->mdd_child,
- mdd_object_child(obj));
+ mdd_child_ops(mdd)->osd_object_get(mdd_object_child(obj));
}
static int
-mdd_attr_get(struct mdd_device *mdd, struct mdd_obj *obj, void *buf,
+mdd_attr_get(struct mdd_device *mdd, struct mdd_object *obj, void *buf,
int buf_len, const char *name, struct context *uc_context)
{
int rc;
ENTRY;
mdd_object_get(mdd, obj);
- rc = mdd->mdd_child->osd_ops->osd_attr_get(mdd->mdd_child,
- mdd_object_child(obj),
- buf, buf_len, name,
- uc_context);
+ rc = mdd_child_ops(mdd)->osd_attr_get(mdd_object_child(obj),
+ buf, buf_len, name,
+ uc_context);
mdd_object_put(mdd, obj);
RETURN(rc);
}
static int
-__mdd_attr_set(struct mdd_device *mdd, struct mdd_obj *obj, void *buf,
+__mdd_attr_set(struct mdd_device *mdd, struct mdd_object *obj, void *buf,
int buf_len, const char *name, struct context *uc_context,
void *handle)
{
- return mdd->mdd_child->osd_ops->osd_attr_set(mdd->mdd_child,
- mdd_object_child(obj),
- buf, buf_len,
- name, uc_context,
- handle);
+ return mdd_child_ops(ops)->osd_attr_set(mdd_object_child(obj),
+ buf, buf_len,
+ name, uc_context,
+ handle);
}
static int
-mdd_attr_set(struct mdd_device *mdd, struct mdd_obj *obj, void *buf,
+mdd_attr_set(struct mdd_device *mdd, struct mdd_object *obj, void *buf,
int buf_len, const char *name, struct context *uc_context)
{
int rc;
RETURN(rc);
}
-
static int
-mdd_object_put(struct mdd_device *mdd, struct mdd_obj *obj)
+mdd_object_dec_check(struct mdd_device *mdd, struct mdd_object *obj)
+{
+ return mdd_child_ops(mdd)->osd_object_dec_check(mdd_object_child(obj));
+}
+
+static int
+mdd_object_put(struct mdd_device *mdd, struct mdd_object *obj)
{
- int nlink, rc = 0;
+ int nlink, rc = 0;
- mdd->mdd_child->osd_ops->osd_object_put(mdd->mdd_child,
- mdd_object_child(obj));
-
- if ((mdd_object_count(obj)) == 0) {
+ if ((mdd_object_dec_check(mdd, obj)) == 0) {
rc = mdd_attr_get(mdd, obj, &nlink, sizeof(nlink),
"NLINK", uc_context);
if (!rc)
}
if (nlink == 0)
rc = mdd_object_destroy(mdd, obj);
-
+
RETURN(rc);
}
return &(obj->mod_obj.mo_lu->lo_header->loh_fid);
}
-static int
-__mdd_index_insert(struct mdd_device *mdd, struct mdd_obj *obj,
- const char *name, struct mdd_obj *obj,
+static int
+__mdd_index_insert(struct mdd_device *mdd, struct mdd_object *pobj,
+ struct mdd_object *obj, const char *name,
struct uc_context *uc_context, void *handle)
{
- mdd_object_get(mdd, mdd_pobj);
- mdd_lock(mdd, mdd_pobj, WRITE_LOCK);
- mdd_lock(mdd, mdd_obj, WRITE_LOCK);
+ mdd_object_get(mdd, pobj);
+ mdd_lock(mdd, pobj, WRITE_LOCK);
+ mdd_lock(mdd, obj, WRITE_LOCK);
- mdd->mdd_child->osd_ops->osd_insert_index(mdd->mdd_child,
- mdd_object_child(obj),
- name, mdd_object_getfid(obj),
- uctxt, handle);
- mdd_unlock(mdd, mdd_pobj, WRITE_LOCK);
- mdd_unlock(mdd, mdd_obj, WRITE_LOCK);
- mdd_put_obj(mdd, mdd_pobj);
+ mdd_child_ops(mdd)->osd_index_insert(mdd_object_child(pobj),
+ mdd_object_getfid(obj), name,
+ uctxt, handle);
+ mdd_unlock(mdd, pobj, WRITE_LOCK);
+ mdd_unlock(mdd, obj, WRITE_LOCK);
+ mdd_put_obj(mdd, pobj);
}
static int
-mdd_index_insert(struct mdd_device *mdd, struct mdd_obj *pobj,
- const char *name, struct mdd_obj *obj,
+mdd_index_insert(struct mdd_device *mdd, struct mdd_object *pobj,
+ struct mdd_object *obj, const char *name,
struct uc_context *uc_context)
{
void *handle = NULL;
if (!handle)
RETURN(-ENOMEM);
- __mdd_index_insert(mdd, pobj, name, obj, uc_context, handle);
+ __mdd_index_insert(mdd, pobj, obj, name, uc_context, handle);
mdd_trans_stop(mdd, handle);
}
static int
__mdd_index_delete(struct mdd_device *mdd, struct mdd_obj *pobj,
- const char *name, struct mdd_obj *obj,
+ struct mdd_obj *obj, const char *name,
struct uc_context *uc_context, void *handle)
{
- mdd_object_get(mdd, mdd_pobj);
- mdd_lock(mdd, mdd_pobj, WRITE_LOCK);
- mdd_lock(mdd, mdd_obj, WRITE_LOCK);
+ mdd_object_get(mdd, pobj);
+ mdd_lock(mdd, pobj, WRITE_LOCK);
+ mdd_lock(mdd, obj, WRITE_LOCK);
- mdd->mdd_child->osd_ops->osd_insert_delete(mdd->mdd_child,
- mdd_object_child(obj),
- name, mdd_object_getfid(obj),
- uctxt, handle);
- mdd_unlock(mdd, mdd_pobj, WRITE_LOCK);
- mdd_unlock(mdd, mdd_obj, WRITE_LOCK);
- mdd_put_obj(mdd, mdd_pobj);
+ mdd_child_ops(mdd)->osd_insert_delete(mdd_object_child(pobj),
+ mdd_object_getfid(obj), name,
+ uctxt, handle);
+ mdd_unlock(mdd, pobj, WRITE_LOCK);
+ mdd_unlock(mdd, obj, WRITE_LOCK);
+ mdd_put_obj(mdd, pobj);
}
static int
mdd_index_delete(struct mdd_device *obd, struct lustre_obj *pobj,
- const char *name, struct lustre_obj *obj,
+ struct lustre_obj *obj, const char *name,
struct uc_context *uc_context)
{
void *handle = NULL;
if (!handle)
RETURN(-ENOMEM);
- __mdd_index_delete(mdd, pobj, name, obj, uc_context, handle);
+ __mdd_index_delete(mdd, pobj, obj, name, uc_context, handle);
mdd_trans_stop(handle);
}
mdd_lock(mdd, tgt_obj, WRITE_LOCK);
mdd_lock(mdd, src_obj, WRITE_LOCK);
- rc = __mdd_index_insert(mdd, tgt_obj, name, src_obj
+ rc = __mdd_index_insert(mdd, tgt_obj, name, src_obj,
uctxt, handle);
if (rc)
GOTO(trans_exit, rc);
uc_context, handle);
exit:
- mdd_unlock(tgt_obj->mdd_obj, WRITE_LOCK);
- mdd_unlock(src_obj->mdd_obj, WRITE_LOCK);
+ mdd_unlock(mdd, tgt_obj, WRITE_LOCK);
+ mdd_unlock(mdd, src_obj, WRITE_LOCK);
mdd_trans_stop(mdd, handle);
RETURN(rc);
}
static int
-int mdd_rename(struct mdd_device *mdd, struct mdd_object *src_pobj,
- struct lustre_obj *tgt_pobj, struct lustre_obj *sobj,
- const char *sname, struct lustre_obj, *tobj,
- const char *tname, struct context *uctxt)
+mdd_rename(struct mdd_device *mdd, struct mdd_object *src_pobj,
+ struct lustre_obj *tgt_pobj, struct lustre_obj *sobj,
+ const char *sname, struct lustre_obj, *tobj,
+ const char *tname, struct context *uctxt)
{
-
+ void *handle = NULL;
+
handle = mdd_trans_start(mdd, src_pobj);
if (!handle)
- GOTO(cleanup, rc);
+ RETURN(-ENOMEM);
mdd_rename_lock(mdd, src_pobj, tgt_pobj, sobj, tobj);
RETURN(rc);
}
-static int mdd_fs_setup(struct mdd_device *mdd)
+static int
+mdd_mkdir(struct md_object *pobj, const char *name, struct md_object *child)
{
- return 0;
-}
-static int mdd_setup(struct mdd_device *mdd, obd_count len, void *buf)
-{
- struct lprocfs_static_vars lvars;
- struct lustre_cfg* lcfg = buf;
- struct mds_obd *mds = &obd->u.mds;
- struct lustre_mount_info *lmi;
- struct vfsmount *mnt;
- struct obd_uuid uuid;
- __u8 *uuid_ptr;
- char *options, *str, *label;
- char ns_name[48];
- unsigned long page;
+ struct mdd_device *mdd = mdo2mdd(obj);
+ struct context *context;
+ void *handle;
int rc = 0;
ENTRY;
+ handle = mdd_trans_start(mdd, obj);
+ if (!handle)
+ RETURN(-ENOMEM);
- sema_init(&mdd->mdd_orphan_recovery_sem, 1);
- sema_init(&mdd->mdd_epoch_sem, 1);
- spin_lock_init(&mds->mds_transno_lock);
- mds->mds_max_mdsize = sizeof(struct lov_mds_md);
- mds->mds_max_cookiesize = sizeof(struct llog_cookie);
- mds->mds_atime_diff = MAX_ATIME_DIFF;
+ mdd_lock(mdd, mdo2mddo(obj), WRITE_LOCK);
- rc = mdd_fs_setup(mdd);
- if (rc) {
- CERROR("%s: MDS filesystem method init failed: rc = %d\n",
- obd->obd_name, rc);
- GOTO(err_ns, rc);
- }
+ rc = __mdd_object_create(mdd, mdo2mddo(obj), child, NULL, handle);
+ if (rc)
+ GOTO(cleanup, rc);
- rc = lquota_setup(quota_interface, obd, lcfg);
+ rc = __mdd_index_insert(mdd, mdo2mddo(obj), pobj, child, name,
+ NULL, handle);
if (rc)
- GOTO(err_fs, rc);
+ GOTO(cleanup, rc);
+cleanup:
+ mdd_trans_stop(mdd, obj);
+ mdd_unlock(mdd, md2mdo(obj), WRITE_LOCK);
+ RETURN(rc);
+}
+
+static int mdo_root_get(struct md_device *m, struct ll_fid *f)
+{
+ return 0;
+}
+
+struct md_device_operations mdd_ops{
+ .mdo_root_get = mdd_root_get;
+ .mdo_mkdir = mdd_mkdir;
+ .mdo_rename = mdd_rename;
+ .mdo_link = mdd_link;
+};
+
+static int mdd_fs_setup(struct mdd_device *mdd)
+{
+ return 0;
+}
+static int mdd_fs_cleanup(struct mdd_device *mdd)
+{
+ return 0;
+}
+
+static int mdd_setup(struct mdd_device *mdd, struct lustre_cfg* lcfg)
+{
+ int rc = 0;
+ ENTRY;
+
+ /*XXX should mdd care about this*/
+ mdd->mdd_max_mdsize = sizeof(struct lov_mds_md);
+ mdd->mdd_max_cookiesize = sizeof(struct llog_cookie);
+ mdd->mdd_atime_diff = MAX_ATIME_DIFF;
+
+ rc = mdd_fs_setup(mdd);
+ if (rc)
+ GOTO(err, rc);
+
RETURN(rc);
-err_qctxt:
- lquota_cleanup(quota_interface, obd);
-err_fs:
- /* No extra cleanup needed for llog_init_commit_thread() */
+err:
mdd_fs_cleanup(mdd);
RETURN(rc);
}
-static struct obd_ops mdt_ops = {
- .o_owner = THIS_MODULE,
- .o_connect = mdd_connect,
- .o_reconnect = mdd_reconnect,
- .o_init_export = mdd_init_export,
- .o_destroy_export = mdd_destroy_export,
- .o_disconnect = mdd_disconnect,
- .o_setup = mdd_setup,
- .o_precleanup = mdd_precleanup,
- .o_cleanup = mdd_cleanup,
- .o_postrecov = mdd_postrecov,
- .o_statfs = mdd_obd_statfs,
- .o_iocontrol = mdd_iocontrol,
- .o_create = mdd_obd_create,
- .o_destroy = mdd_obd_destroy,
- .o_llog_init = mdd_llog_init,
- .o_llog_finish = mdd_llog_finish,
- .o_notify = mdd_notify,
- .o_health_check = mdd_health_check,
-};
-
static int __init mdd_mod_init(void)
{
return 0;
}
MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");
-MODULE_DESCRIPTION("Lustre Meta-data Target Prototype ("LUSTRE_MDD_NAME")");
+MODULE_DESCRIPTION("Lustre Meta-data Device Prototype ("LUSTRE_MDD_NAME")");
MODULE_LICENSE("GPL");
cfs_module(mdd, "0.0.2", mdd_mod_init, mdd_mod_exit);