.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,
LASSERT(atomic_read(&d->ld_ref) == 0);
md_device_fini(&m->cmm_md_dev);
- //cmm_fini(m);
OBD_FREE_PTR(m);
}
{
struct lprocfs_static_vars lvars;
+ printk(KERN_INFO "Lustre: Clustered Metadata Manager; info@clusterfs.com\n");
+
lprocfs_init_vars(cmm, &lvars);
return class_register_type(&cmm_obd_device_ops, lvars.module_vars,
LUSTRE_CMM0_NAME, &cmm_device_type);
MODULE_DESCRIPTION("Lustre Clustered Meta-data Manager Prototype ("LUSTRE_CMM0_NAME")");
MODULE_LICENSE("GPL");
-cfs_module(cmm, "0.0.1", cmm_mod_init, cmm_mod_exit);
+cfs_module(cmm, "0.0.3", cmm_mod_init, cmm_mod_exit);
};
-#define CMM_CHILD_OPS(d) (d->cmm_child->md_ops)
+static inline struct md_device_operations *cmm_child_ops(struct cmm_device *d)
+{
+ return (d->cmm_child->md_ops);
+}
static inline struct cmm_device *md2cmm_dev(struct md_device *m)
{
int cmm_statfs(struct md_device *m, struct kstatfs *sfs);
int cmm_mkdir(struct md_object *o, const char *name,
struct md_object *child);
+int cmm_attr_get(struct md_object *obj, void *buf, int size,
+ const char *name, struct context *ctxt);
#endif /* __KERNEL__ */
#endif /* _CMM_INTERNAL_H */
struct lu_object *cmm_object_alloc(struct lu_device *d)
{
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);
- return o;
+ RETURN(o);
} else
- return NULL;
+ RETURN(NULL);
}
int cmm_object_init(struct lu_object *o)
struct cmm_device *d = lu2cmm_dev(o->lo_dev);
struct lu_device *under;
struct lu_object *below;
+ ENTRY;
under = &d->cmm_child->md_lu_dev;
below = under->ld_ops->ldo_object_alloc(under);
if (below != NULL) {
lu_object_add(o, below);
- return 0;
+ RETURN(0);
} else
- return -ENOMEM;
+ RETURN(-ENOMEM);
}
void cmm_object_free(struct lu_object *o)
struct cmm_device *cmm_dev = md2cmm_dev(md);
int result = -EOPNOTSUPP;
- if (CMM_CHILD_OPS(cmm_dev) && CMM_CHILD_OPS(cmm_dev)->mdo_root_get) {
- result = CMM_CHILD_OPS(cmm_dev)->mdo_root_get(
+ if (cmm_child_ops(cmm_dev)->mdo_root_get) {
+ result = cmm_child_ops(cmm_dev)->mdo_root_get(
cmm_dev->cmm_child, fid);
}
int result = -EOPNOTSUPP;
ENTRY;
- if (CMM_CHILD_OPS(cmm_dev) && CMM_CHILD_OPS(cmm_dev)->mdo_statfs)
- result = CMM_CHILD_OPS(cmm_dev)->mdo_config(cmm_dev->cmm_child,
+ if (cmm_child_ops(cmm_dev)->mdo_config)
+ result = cmm_child_ops(cmm_dev)->mdo_config(cmm_dev->cmm_child,
name, buf, size, mode);
RETURN(result);
ENTRY;
- if (CMM_CHILD_OPS(cmm_dev) && CMM_CHILD_OPS(cmm_dev)->mdo_statfs) {
- result = CMM_CHILD_OPS(cmm_dev)->mdo_statfs(
+ if (cmm_child_ops(cmm_dev)->mdo_statfs) {
+ result = cmm_child_ops(cmm_dev)->mdo_statfs(
cmm_dev->cmm_child, sfs);
}
struct cmm_device *cmm_dev = cmm_obj2dev(cmm_parent);
int result = -EOPNOTSUPP;
- if (CMM_CHILD_OPS(cmm_dev) && CMM_CHILD_OPS(cmm_dev)->mdo_mkdir) {
- result = CMM_CHILD_OPS(cmm_dev)->mdo_mkdir(
+ 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;
}
+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;
+}