From: NeilBrown Date: Wed, 5 Jun 2019 16:36:23 +0000 (-0400) Subject: LU-8066 obd: collect all resource releasing for obj_type. X-Git-Tag: 2.12.56~72 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=907a82654245c20c83c4291ab1617c9c64340c30;p=fs%2Flustre-release.git LU-8066 obd: collect all resource releasing for obj_type. Now that obj_type is managed as a kobject, move all the freeing and deregistering into class_sysfs_release(). Change-Id: I784287ea17e010206b5fa256c7a224d01085be92 Signed-off-by: NeilBrown Reviewed-on: https://review.whamcloud.com/34716 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Petros Koutoupis Reviewed-by: Shaun Tancheff Reviewed-by: Oleg Drokin --- diff --git a/lustre/lod/lod_dev.c b/lustre/lod/lod_dev.c index dc26c29..a1d07ad 100644 --- a/lustre/lod/lod_dev.c +++ b/lustre/lod/lod_dev.c @@ -2254,10 +2254,9 @@ static int __init lod_init(void) static void __exit lod_exit(void) { - if (!IS_ERR_OR_NULL(sym)) { - ldebugfs_remove(&sym->typ_debugfs_entry); + if (!IS_ERR_OR_NULL(sym)) kobject_put(&sym->typ_kobj); - } + class_unregister_type(LUSTRE_LOD_NAME); lu_kmem_fini(lod_caches); } diff --git a/lustre/mdd/mdd_lproc.c b/lustre/mdd/mdd_lproc.c index d17d3c9..27d3f31 100644 --- a/lustre/mdd/mdd_lproc.c +++ b/lustre/mdd/mdd_lproc.c @@ -564,6 +564,10 @@ static void mdd_sysfs_release(struct kobject *kobj) { struct mdd_device *mdd = container_of(kobj, struct mdd_device, mdd_kobj); + struct obd_device *obd = mdd2obd_dev(mdd); + + debugfs_remove_recursive(obd->obd_debugfs_entry); + obd->obd_debugfs_entry = NULL; complete(&mdd->mdd_kobj_unregister); } @@ -614,11 +618,6 @@ int mdd_procfs_init(struct mdd_device *mdd, const char *name) void mdd_procfs_fini(struct mdd_device *mdd) { - struct obd_device *obd = mdd2obd_dev(mdd); - kobject_put(&mdd->mdd_kobj); wait_for_completion(&mdd->mdd_kobj_unregister); - - if (!IS_ERR_OR_NULL(obd->obd_debugfs_entry)) - ldebugfs_remove(&obd->obd_debugfs_entry); } diff --git a/lustre/obdclass/dt_object.c b/lustre/obdclass/dt_object.c index 5cea5a6..3bec5f7 100644 --- a/lustre/obdclass/dt_object.c +++ b/lustre/obdclass/dt_object.c @@ -1235,6 +1235,9 @@ static void dt_sysfs_release(struct kobject *kobj) struct dt_device *dt = container_of(kobj, struct dt_device, dd_kobj); + debugfs_remove_recursive(dt->dd_debugfs_entry); + dt->dd_debugfs_entry = NULL; + complete(&dt->dd_kobj_unregister); } @@ -1243,9 +1246,6 @@ int dt_tunables_fini(struct dt_device *dt) if (!dt) return -EINVAL; - if (!IS_ERR_OR_NULL(dt->dd_debugfs_entry)) - ldebugfs_remove(&dt->dd_debugfs_entry); - if (dt->dd_def_attrs) sysfs_remove_files(&dt->dd_kobj, dt->dd_def_attrs); diff --git a/lustre/obdclass/genops.c b/lustre/obdclass/genops.c index 42d90a8..c5404d8 100644 --- a/lustre/obdclass/genops.c +++ b/lustre/obdclass/genops.c @@ -162,6 +162,32 @@ static void class_sysfs_release(struct kobject *kobj) { struct obd_type *type = container_of(kobj, struct obd_type, typ_kobj); +#ifdef HAVE_SERVER_SUPPORT + if (type->typ_sym_filter) + type->typ_debugfs_entry = NULL; +#endif + debugfs_remove_recursive(type->typ_debugfs_entry); + type->typ_debugfs_entry = NULL; + + if (type->typ_lu) + lu_device_type_fini(type->typ_lu); + + spin_lock(&obd_types_lock); + list_del(&type->typ_chain); + spin_unlock(&obd_types_lock); + + if (type->typ_name) { +#ifdef CONFIG_PROC_FS + if (type->typ_procroot) + remove_proc_subtree(type->typ_name, proc_lustre_root); +#endif + OBD_FREE(type->typ_name, strlen(type->typ_name) + 1); + } + if (type->typ_md_ops) + OBD_FREE_PTR(type->typ_md_ops); + if (type->typ_dt_ops) + OBD_FREE_PTR(type->typ_dt_ops); + OBD_FREE(type, sizeof(*type)); } @@ -188,6 +214,8 @@ struct obd_type *class_add_symlinks(const char *name, bool enable_proc) if (!type) return ERR_PTR(-ENOMEM); + INIT_LIST_HEAD(&type->typ_chain); + type->typ_kobj.kset = lustre_kset; rc = kobject_init_and_add(&type->typ_kobj, &class_ktype, &lustre_kset->kobj, "%s", name); @@ -225,9 +253,6 @@ int class_register_type(struct obd_ops *dt_ops, struct md_ops *md_ops, const char *name, struct lu_device_type *ldt) { struct obd_type *type; -#ifdef HAVE_SERVER_SUPPORT - struct kobject *kobj; -#endif /* HAVE_SERVER_SUPPORT */ int rc; ENTRY; @@ -235,23 +260,28 @@ int class_register_type(struct obd_ops *dt_ops, struct md_ops *md_ops, LASSERT(strnlen(name, CLASS_MAX_NAME) < CLASS_MAX_NAME); if (class_search_type(name)) { +#ifdef HAVE_SERVER_SUPPORT + if (strcmp(name, LUSTRE_LOV_NAME) == 0 || + strcmp(name, LUSTRE_OSC_NAME) == 0) { + struct kobject *kobj; + + 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 */ CDEBUG(D_IOCTL, "Type %s already registered\n", name); RETURN(-EEXIST); } -#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(-ENOMEM); + INIT_LIST_HEAD(&type->typ_chain); type->typ_kobj.kset = lustre_kset; kobject_init(&type->typ_kobj, &class_ktype); #ifdef HAVE_SERVER_SUPPORT @@ -318,23 +348,6 @@ setup_ldt: RETURN(0); failed: -#ifdef HAVE_SERVER_SUPPORT - if (type->typ_sym_filter) - type->typ_debugfs_entry = NULL; -#endif - if (!IS_ERR_OR_NULL(type->typ_debugfs_entry)) - ldebugfs_remove(&type->typ_debugfs_entry); - if (type->typ_name != NULL) { -#ifdef CONFIG_PROC_FS - if (type->typ_procroot != NULL) - remove_proc_subtree(type->typ_name, proc_lustre_root); -#endif - OBD_FREE(type->typ_name, strlen(name) + 1); - } - if (type->typ_md_ops != NULL) - OBD_FREE_PTR(type->typ_md_ops); - if (type->typ_dt_ops != NULL) - OBD_FREE_PTR(type->typ_dt_ops); kobject_put(&type->typ_kobj); RETURN(rc); @@ -360,32 +373,6 @@ int class_unregister_type(const char *name) RETURN(-EBUSY); } - /* 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 - * module removes the entry */ -#ifdef CONFIG_PROC_FS - if (type->typ_procroot != NULL) - remove_proc_subtree(type->typ_name, proc_lustre_root); -#endif -#ifdef HAVE_SERVER_SUPPORT - if (type->typ_sym_filter) - type->typ_debugfs_entry = NULL; -#endif - if (!IS_ERR_OR_NULL(type->typ_debugfs_entry)) - ldebugfs_remove(&type->typ_debugfs_entry); - - if (type->typ_lu) - lu_device_type_fini(type->typ_lu); - - spin_lock(&obd_types_lock); - list_del(&type->typ_chain); - spin_unlock(&obd_types_lock); - OBD_FREE(type->typ_name, strlen(name) + 1); - if (type->typ_dt_ops != NULL) - OBD_FREE_PTR(type->typ_dt_ops); - if (type->typ_md_ops != NULL) - OBD_FREE_PTR(type->typ_md_ops); kobject_put(&type->typ_kobj); RETURN(0); diff --git a/lustre/osp/osp_dev.c b/lustre/osp/osp_dev.c index aeb1113..1625c83 100644 --- a/lustre/osp/osp_dev.c +++ b/lustre/osp/osp_dev.c @@ -1933,10 +1933,9 @@ static int __init osp_init(void) */ static void __exit osp_exit(void) { - if (!IS_ERR_OR_NULL(sym)) { - ldebugfs_remove(&sym->typ_debugfs_entry); + if (!IS_ERR_OR_NULL(sym)) kobject_put(&sym->typ_kobj); - } + class_unregister_type(LUSTRE_LWP_NAME); class_unregister_type(LUSTRE_OSP_NAME); lu_kmem_fini(osp_caches);