.o_pool_del = lod_pool_del,
};
-static struct obd_type sym;
+static struct obd_type *sym;
static int __init lod_init(void)
{
struct dentry *symlink;
struct obd_type *type;
- struct kobject *kobj;
struct qstr dname;
int rc;
return rc;
}
+ sym = class_setup_tunables(LUSTRE_LOV_NAME);
+ if (IS_ERR(sym)) {
+ rc = PTR_ERR(sym);
+ /* does real "lov" already exist ? */
+ if (rc == -EEXIST)
+ GOTO(try_proc, rc = 0);
+ GOTO(no_lov, rc);
+ }
+
/* create "lov" entry for compatibility purposes */
dname.name = "lov";
dname.len = strlen(dname.name);
rc = symlink ? PTR_ERR(symlink) : -ENOMEM;
GOTO(no_lov, rc);
}
- sym.typ_debugfs_entry = symlink;
+ sym->typ_debugfs_entry = symlink;
} else {
dput(symlink);
}
- kobj = kset_find_obj(lustre_kset, dname.name);
- if (kobj) {
- kobject_put(kobj);
- goto try_proc;
- }
-
- kobj = class_setup_tunables(dname.name);
- if (IS_ERR(kobj)) {
- rc = PTR_ERR(kobj);
- if (sym.typ_debugfs_entry)
- ldebugfs_remove(&sym.typ_debugfs_entry);
- GOTO(no_lov, rc);
- }
- sym.typ_kobj = kobj;
-
try_proc:
type = class_search_type(LUSTRE_LOV_NAME);
if (type && type->typ_procroot)
static void __exit lod_exit(void)
{
- ldebugfs_remove(&sym.typ_debugfs_entry);
- kobject_put(sym.typ_kobj);
+ if (!IS_ERR_OR_NULL(sym)) {
+ ldebugfs_remove(&sym->typ_debugfs_entry);
+ kobject_put(&sym->typ_kobj);
+ }
class_unregister_type(LUSTRE_LOD_NAME);
lu_kmem_fini(lod_caches);
}
static void class_sysfs_release(struct kobject *kobj)
{
- OBD_FREE(kobj, sizeof(*kobj));
+ struct obd_type *type = container_of(kobj, struct obd_type, typ_kobj);
+
+ OBD_FREE(type, sizeof(*type));
}
static struct kobj_type class_ktype = {
.release = class_sysfs_release,
};
-struct kobject *class_setup_tunables(const char *name)
+#ifdef HAVE_SERVER_SUPPORT
+struct obd_type *class_setup_tunables(const char *name)
{
+ struct obd_type *type;
struct kobject *kobj;
int rc;
-#ifdef HAVE_SERVER_SUPPORT
kobj = kset_find_obj(lustre_kset, name);
- if (kobj)
- return kobj;
-#endif
- OBD_ALLOC(kobj, sizeof(*kobj));
- if (!kobj)
+ if (kobj) {
+ kobject_put(kobj);
+ return ERR_PTR(-EEXIST);
+ }
+
+ OBD_ALLOC(type, sizeof(*type));
+ if (!type)
return ERR_PTR(-ENOMEM);
- kobj->kset = lustre_kset;
- kobject_init(kobj, &class_ktype);
- rc = kobject_add(kobj, &lustre_kset->kobj, "%s", name);
+ type->typ_kobj.kset = lustre_kset;
+ kobject_init(&type->typ_kobj, &class_ktype);
+ rc = kobject_add(&type->typ_kobj, &lustre_kset->kobj, "%s", name);
if (rc) {
- kobject_put(kobj);
+ kobject_put(&type->typ_kobj);
return ERR_PTR(rc);
}
- return kobj;
+ return type;
}
EXPORT_SYMBOL(class_setup_tunables);
+#endif /* HAVE_SERVER_SUPPORT */
#define CLASS_MAX_NAME 1024
{
struct obd_type *type;
#ifdef HAVE_SERVER_SUPPORT
- struct qstr dname;
+ struct kobject *kobj;
#endif /* HAVE_SERVER_SUPPORT */
- int rc = 0;
+ int rc;
ENTRY;
/* sanity check */
RETURN(-EEXIST);
}
- rc = -ENOMEM;
+#ifdef HAVE_SERVER_SUPPORT
+ kobj = kset_find_obj(lustre_kset, name);
+ if (kobj) {
+ type = container_of(kobj, struct obd_type, typ_kobj);
+
+ goto dir_exist;
+ }
+#endif /* HAVE_SERVER_SUPPORT */
+
OBD_ALLOC(type, sizeof(*type));
if (type == NULL)
- RETURN(rc);
+ RETURN(-ENOMEM);
+
+ type->typ_kobj.kset = lustre_kset;
+ rc = kobject_init_and_add(&type->typ_kobj, &class_ktype,
+ &lustre_kset->kobj, "%s", name);
+ if (rc)
+ GOTO(failed, rc);
+ type->typ_debugfs_entry = ldebugfs_register(name, debugfs_lustre_root,
+ vars, type);
+ if (IS_ERR_OR_NULL(type->typ_debugfs_entry)) {
+ rc = type->typ_debugfs_entry ? PTR_ERR(type->typ_debugfs_entry)
+ : -ENOMEM;
+ type->typ_debugfs_entry = NULL;
+ GOTO(failed, rc);
+ }
+#ifdef HAVE_SERVER_SUPPORT
+dir_exist:
+#endif /* HAVE_SERVER_SUPPORT */
OBD_ALLOC_PTR(type->typ_dt_ops);
OBD_ALLOC_PTR(type->typ_md_ops);
OBD_ALLOC(type->typ_name, strlen(name) + 1);
spin_lock_init(&type->obd_type_lock);
#ifdef CONFIG_PROC_FS
- if (enable_proc) {
+ if (enable_proc && !type->typ_procroot) {
type->typ_procroot = lprocfs_register(type->typ_name,
proc_lustre_root,
NULL, type);
}
}
#endif
-#ifdef HAVE_SERVER_SUPPORT
- dname.name = name;
- dname.len = strlen(dname.name);
- dname.hash = ll_full_name_hash(debugfs_lustre_root, dname.name,
- dname.len);
- type->typ_debugfs_entry = d_lookup(debugfs_lustre_root, &dname);
- if (type->typ_debugfs_entry) {
- dput(type->typ_debugfs_entry);
- type->typ_sym_filter = true;
- goto dir_exist;
- }
-#endif /* HAVE_SERVER_SUPPORT */
-
- type->typ_debugfs_entry = ldebugfs_register(type->typ_name,
- debugfs_lustre_root,
- vars, type);
- if (IS_ERR_OR_NULL(type->typ_debugfs_entry)) {
- rc = type->typ_debugfs_entry ? PTR_ERR(type->typ_debugfs_entry)
- : -ENOMEM;
- type->typ_debugfs_entry = NULL;
- GOTO(failed, rc);
- }
-#ifdef HAVE_SERVER_SUPPORT
-dir_exist:
-#endif
- type->typ_kobj = class_setup_tunables(type->typ_name);
- if (IS_ERR(type->typ_kobj))
- GOTO(failed, rc = PTR_ERR(type->typ_kobj));
-
if (ldt) {
type->typ_lu = ldt;
rc = lu_device_type_init(ldt);
- if (rc) {
- kobject_put(type->typ_kobj);
+ if (rc)
GOTO(failed, rc);
- }
}
spin_lock(&obd_types_lock);
OBD_FREE_PTR(type->typ_md_ops);
if (type->typ_dt_ops != NULL)
OBD_FREE_PTR(type->typ_dt_ops);
- OBD_FREE(type, sizeof(*type));
- RETURN(rc);
+ kobject_put(&type->typ_kobj);
+
+ RETURN(rc);
}
EXPORT_SYMBOL(class_register_type);
RETURN(-EBUSY);
}
- kobject_put(type->typ_kobj);
-
/* we do not use type->typ_procroot as for compatibility purposes
* other modules can share names (i.e. lod can use lov entry). so
* we can't reference pointer as it can get invalided when another
OBD_FREE_PTR(type->typ_dt_ops);
if (type->typ_md_ops != NULL)
OBD_FREE_PTR(type->typ_md_ops);
- OBD_FREE(type, sizeof(*type));
- RETURN(0);
+ kobject_put(&type->typ_kobj);
+
+ RETURN(0);
} /* class_unregister_type */
EXPORT_SYMBOL(class_unregister_type);
.o_fid_alloc = osp_fid_alloc,
};
-static struct obd_type sym;
+static struct obd_type *sym;
/**
* Initialize OSP module.
{
struct dentry *symlink;
struct obd_type *type;
- struct kobject *kobj;
struct qstr dname;
int rc;
return rc;
}
+ sym = class_setup_tunables(LUSTRE_OSC_NAME);
+ if (IS_ERR(sym)) {
+ rc = PTR_ERR(sym);
+ /* does real "osc" already exist ? */
+ if (rc == -EEXIST)
+ GOTO(try_proc, rc = 0);
+ GOTO(no_osc, rc);
+ }
+
/* create "osc" entry for compatibility purposes */
dname.name = "osc";
dname.len = strlen(dname.name);
rc = symlink ? PTR_ERR(symlink) : -ENOMEM;
GOTO(no_osc, rc);
}
- sym.typ_debugfs_entry = symlink;
+ sym->typ_debugfs_entry = symlink;
} else {
dput(symlink);
}
- kobj = kset_find_obj(lustre_kset, dname.name);
- if (kobj) {
- kobject_put(kobj);
- goto try_proc;
- }
-
- kobj = class_setup_tunables(dname.name);
- if (IS_ERR(kobj)) {
- rc = PTR_ERR(kobj);
- if (sym.typ_debugfs_entry)
- ldebugfs_remove(&sym.typ_debugfs_entry);
- GOTO(no_osc, rc);
- }
- sym.typ_kobj = kobj;
-
try_proc:
type = class_search_type(LUSTRE_OSC_NAME);
if (type != NULL && type->typ_procroot != NULL)
*/
static void __exit osp_exit(void)
{
- ldebugfs_remove(&sym.typ_debugfs_entry);
- kobject_put(sym.typ_kobj);
+ if (!IS_ERR_OR_NULL(sym)) {
+ ldebugfs_remove(&sym->typ_debugfs_entry);
+ kobject_put(&sym->typ_kobj);
+ }
class_unregister_type(LUSTRE_LWP_NAME);
class_unregister_type(LUSTRE_OSP_NAME);
lu_kmem_fini(osp_caches);