static struct md_device_operations cmm_md_ops = {
.mdo_root_get = cmm_root_get,
.mdo_config = cmm_config,
- .mdo_statfs = cmm_statfs,
- .mdo_mkdir = cmm_mkdir,
- .mdo_attr_get = cmm_attr_get,
-// .mdo_rename = cmm_rename,
-// .mdo_link = cmm_link,
-// .mdo_attr_get = cmm_attr_get,
-// .mdo_attr_set = cmm_attr_set,
-// .mdo_index_insert = cmm_index_insert,
-// .mdo_index_delete = cmm_index_delete,
-// .mdo_object_create = cmm_object_create,
+ .mdo_statfs = cmm_statfs
};
static int cmm_device_init(struct lu_device *d, const char *top)
#include "cmm_internal.h"
+static struct md_object_operations cmm_mo_ops;
+
struct cmm_object *cmm_object_find(struct cmm_device *d, struct lu_fid *f)
{
struct lu_object *o;
{
struct cmm_object *mo;
ENTRY;
-
+
OBD_ALLOC_PTR(mo);
if (mo != NULL) {
struct lu_object *o;
+
o = &mo->cmo_obj.mo_lu;
lu_object_init(o, NULL, d);
+ mo->cmo_obj.mo_ops = &cmm_mo_ops;
RETURN(o);
} else
RETURN(NULL);
{
struct cmm_object *cmm_obj = md2cmm_obj(obj);
struct cmm_device *cmm_dev = cmm_obj2dev(cmm_obj);
-
+
CMM_DO_CHILD(cmm_dev)->ldo_lock_obj(cmm2child_obj(cmm_obj), mode);
return;
}
{
struct cmm_object *cmm_obj = md2cmm_obj(obj);
struct cmm_device *cmm_dev = cmm_obj2dev(cmm_obj);
-
+
CMM_DO_CHILD(cmm_dev)->ldo_unlock_obj(cmm2child_obj(cmm_obj), mode);
return;
}
/* Metadata API */
int cmm_root_get(struct md_device *md, struct lu_fid *fid) {
struct cmm_device *cmm_dev = md2cmm_dev(md);
- int result = -EOPNOTSUPP;
-
- if (cmm_child_ops(cmm_dev)->mdo_root_get) {
- result = cmm_child_ops(cmm_dev)->mdo_root_get(
- cmm_dev->cmm_child, fid);
- }
-
- return result;
+
+ return cmm_child_ops(cmm_dev)->mdo_root_get(cmm_dev->cmm_child, fid);
}
int cmm_config(struct md_device *md, const char *name,
void *buf, int size, int mode)
{
struct cmm_device *cmm_dev = md2cmm_dev(md);
- int result = -EOPNOTSUPP;
+ int result;
ENTRY;
-
- if (cmm_child_ops(cmm_dev)->mdo_config)
- result = cmm_child_ops(cmm_dev)->mdo_config(cmm_dev->cmm_child,
- name, buf, size, mode);
-
+ result = cmm_child_ops(cmm_dev)->mdo_config(cmm_dev->cmm_child,
+ name, buf, size, mode);
RETURN(result);
}
int cmm_statfs(struct md_device *md, struct kstatfs *sfs) {
struct cmm_device *cmm_dev = md2cmm_dev(md);
- int result = -EOPNOTSUPP;
-
+ int result;
+
ENTRY;
-
- if (cmm_child_ops(cmm_dev)->mdo_statfs) {
- result = cmm_child_ops(cmm_dev)->mdo_statfs(
- cmm_dev->cmm_child, sfs);
- }
-
+ result = cmm_child_ops(cmm_dev)->mdo_statfs(cmm_dev->cmm_child, sfs);
RETURN (result);
}
-int cmm_mkdir(struct md_object *md_parent, const char *name,
- struct md_object *md_child)
+int cmm_mkdir(struct md_object *md_parent, const char *name,
+ struct md_object *md_child)
{
struct cmm_object *cmm_parent = md2cmm_obj(md_parent);
- struct cmm_device *cmm_dev = cmm_obj2dev(cmm_parent);
- int result = -EOPNOTSUPP;
-
- if (cmm_child_ops(cmm_dev)->mdo_mkdir) {
- result = cmm_child_ops(cmm_dev)->mdo_mkdir(
- cmm2child_obj(cmm_parent),
- name, md_child);
- }
-
- return result;
+
+ return md_parent->mo_ops->moo_mkdir(cmm2child_obj(cmm_parent),
+ name, md_child);
}
+static struct md_object_operations cmm_mo_ops = {
+ .moo_mkdir = cmm_mkdir,
+ .moo_mkdir = cmm_mkdir,
+ .moo_attr_get = cmm_attr_get,
+// .moo_rename = cmm_rename,
+// .moo_link = cmm_link,
+// .moo_attr_set = cmm_attr_set,
+// .moo_index_insert = cmm_index_insert,
+// .moo_index_delete = cmm_index_delete,
+// .moo_object_create = cmm_object_create,
+};
+
int cmm_attr_get(struct md_object *obj, void *buf, int size,
const char *name, struct context *ctxt)
{
- struct cmm_object *co = md2cmm_obj(obj);
- struct cmm_device *dev = cmm_obj2dev(co);
- struct md_object *next = cmm2child_obj(co);
- int result = -EOPNOTSUPP;
-
- LASSERT(cmm_child_ops(dev)>0x100);
- if (cmm_child_ops(dev)->mdo_attr_get) {
- result = cmm_child_ops(dev)->mdo_attr_get(next, buf, size,
- name, ctxt);
- }
-
- return result;
+ struct md_object *next = cmm2child_obj(md2cmm_obj(obj));
+
+ LASSERT((void *)obj->mo_ops > (void *)0x100);
+ return obj->mo_ops->moo_attr_get(next, buf, size, name, ctxt);
}
int flags;
};
-struct md_device_operations {
-
- /* method for getting/setting device wide back stored config data, like
- * last used meta-sequence, etc. */
- int (*mdo_config) (struct md_device *m, const char *name,
- void *buf, int size, int mode);
-
- /* meta-data device related handlers. */
- int (*mdo_root_get)(struct md_device *m, struct lu_fid *f);
- int (*mdo_statfs)(struct md_device *m, struct kstatfs *sfs);
+struct md_object_operations {
/* meta-data object operations related handlers */
- int (*mdo_mkdir)(struct md_object *obj, const char *name,
+ int (*moo_mkdir)(struct md_object *obj, const char *name,
struct md_object *child);
- int (*mdo_rename)(struct md_object *spobj, struct md_object *tpobj,
+ int (*moo_rename)(struct md_object *spobj, struct md_object *tpobj,
struct md_object *sobj, const char *sname,
struct md_object *tobj, const char *tname,
struct context *uctxt);
- int (*mdo_link)(struct md_object *tobj, struct md_object *sobj,
+ int (*moo_link)(struct md_object *tobj, struct md_object *sobj,
const char *name, struct context *uctxt);
- int (*mdo_attr_get)(struct md_object *obj, void *buf, int buf_len,
+ int (*moo_attr_get)(struct md_object *obj, void *buf, int buf_len,
const char *name, struct context *uctxt);
- int (*mdo_attr_set)(struct md_object *obj, void *buf, int buf_len,
+ int (*moo_attr_set)(struct md_object *obj, void *buf, int buf_len,
const char *name, struct context *uctxt);
/* FLD maintanence related handlers */
- int (*mdo_index_insert)(struct md_object *pobj, struct md_object *obj,
+ int (*moo_index_insert)(struct md_object *pobj, struct md_object *obj,
const char *name, struct context *uctxt);
- int (*mdo_index_delete)(struct md_object *pobj, struct md_object *obj,
+ int (*moo_index_delete)(struct md_object *pobj, struct md_object *obj,
const char *name, struct context *uctxt);
- int (*mdo_object_create)(struct md_object *pobj, struct md_object *child,
+ int (*moo_object_create)(struct md_object *pobj,
+ struct md_object *child,
struct context *uctxt);
};
+struct md_device_operations {
+ /* method for getting/setting device wide back stored config data, like
+ * last used meta-sequence, etc. */
+ int (*mdo_config) (struct md_device *m, const char *name,
+ void *buf, int size, int mode);
+
+ /* meta-data device related handlers. */
+ int (*mdo_root_get)(struct md_device *m, struct lu_fid *f);
+ int (*mdo_statfs)(struct md_device *m, struct kstatfs *sfs);
+};
+
struct md_device {
struct lu_device md_lu_dev;
struct md_device_operations *md_ops;
};
struct md_object {
- struct lu_object mo_lu;
+ struct lu_object mo_lu;
+ struct md_object_operations *mo_ops;
};
static inline int lu_device_is_md(struct lu_device *d)
static void mdd_lock(struct mdd_object *obj, enum dt_lock_mode mode);
static void mdd_unlock(struct mdd_object *obj, enum dt_lock_mode mode);
+static struct md_object_operations mdd_obj_ops;
+
static int lu_device_is_mdd(struct lu_device *d)
{
/*
o = &mdo->mod_obj.mo_lu;
lu_object_init(o, NULL, d);
+ mdo->mod_obj.mo_ops = &mdd_obj_ops;
return (&mdo->mod_obj.mo_lu);
} else
return(NULL);
RETURN(rc);
}
-struct md_device_operations mdd_ops = {
+static struct md_device_operations mdd_ops = {
.mdo_root_get = mdd_root_get,
.mdo_config = mdd_config,
- .mdo_statfs = mdd_statfs,
- .mdo_mkdir = mdd_mkdir,
- .mdo_rename = mdd_rename,
- .mdo_link = mdd_link,
- .mdo_attr_get = mdd_attr_get,
- .mdo_attr_set = mdd_attr_set,
- .mdo_index_insert = mdd_index_insert,
- .mdo_index_delete = mdd_index_delete,
- .mdo_object_create = mdd_object_create,
+ .mdo_statfs = mdd_statfs
+};
+
+static struct md_object_operations mdd_obj_ops = {
+ .moo_mkdir = mdd_mkdir,
+ .moo_rename = mdd_rename,
+ .moo_link = mdd_link,
+ .moo_attr_get = mdd_attr_get,
+ .moo_attr_set = mdd_attr_set,
+ .moo_index_insert = mdd_index_insert,
+ .moo_index_delete = mdd_index_delete,
+ .moo_object_create = mdd_object_create,
};
static struct obd_ops mdd_obd_device_ops = {
child = mdt_object_find(d, cfid);
if (!IS_ERR(child)) {
- result = mdt_child_ops(d)->mdo_mkdir(mdt_object_child(o), name,
- mdt_object_child(child));
+ result = o->mot_obj.mo_ops->moo_mkdir(mdt_object_child(o), name,
+ mdt_object_child(child));
mdt_object_put(child);
} else
result = PTR_ERR(child);
if (IS_ERR(o))
return PTR_ERR(o);
- result = mdt_child_ops(d)->mdo_attr_get(mdt_object_child(o), name,
- mdt_object_child(child));
- mdt_object_put(child);
+ result = o->mot_obj.mo_ops->moo_attr_get(mdt_object_child(o), name,
+ mdt_object_child(child));
+ mdt_object_put(child);
} else
result = PTR_ERR(child);
mdt_object_unlock(d->mdt_namespace, o, lh);