From 18fd8850a4c8177ecf4870ff38c208d329a21ed0 Mon Sep 17 00:00:00 2001 From: Oleg Drokin Date: Thu, 21 May 2015 15:31:55 -0400 Subject: [PATCH] staging/lustre/ldlm: Preparation to move /proc/fs/lustre/ldlm to sysfs Add necessary infrastructure, register /sys/fs/lustre/ldlm, /sys/fs/lustre/ldlm/namespaces and /sys/fs/lustre/ldlm/services Signed-off-by: Oleg Drokin Signed-off-by: Greg Kroah-Hartman --- drivers/staging/lustre/lustre/include/lustre_dlm.h | 6 +++ drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c | 43 ++++++++++++++++++- drivers/staging/lustre/lustre/ldlm/ldlm_resource.c | 48 +++++++++++++++++++++- 3 files changed, 95 insertions(+), 2 deletions(-) diff --git a/drivers/staging/lustre/lustre/include/lustre_dlm.h b/drivers/staging/lustre/lustre/include/lustre_dlm.h index bac9902..a52ff0c 100644 --- a/drivers/staging/lustre/lustre/include/lustre_dlm.h +++ b/drivers/staging/lustre/lustre/include/lustre_dlm.h @@ -60,6 +60,9 @@ struct obd_ops; struct obd_device; +extern struct kset *ldlm_ns_kset; +extern struct kset *ldlm_svc_kset; + #define OBD_LDLM_DEVICENAME "ldlm" #define LDLM_DEFAULT_LRU_SIZE (100 * num_online_cpus()) @@ -501,6 +504,9 @@ struct ldlm_namespace { * recalculation of LDLM pool statistics should be skipped. */ unsigned ns_stopping:1; + + struct kobject ns_kobj; /* sysfs object */ + struct completion ns_kobj_unregister; }; /** diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c index 6d731d3..46f1790 100644 --- a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c @@ -58,6 +58,10 @@ MODULE_PARM_DESC(ldlm_cpts, "CPU partitions ldlm threads should run on"); static struct mutex ldlm_ref_mutex; static int ldlm_refcount; +struct kobject *ldlm_kobj; +struct kset *ldlm_ns_kset; +struct kset *ldlm_svc_kset; + struct ldlm_cb_async_args { struct ldlm_cb_set_arg *ca_set_arg; struct ldlm_lock *ca_lock; @@ -1002,6 +1006,15 @@ void ldlm_destroy_export(struct obd_export *exp) } EXPORT_SYMBOL(ldlm_destroy_export); +/* These are for root of /sys/fs/lustre/ldlm */ +struct attribute *ldlm_attrs[] = { + NULL, +}; + +static struct attribute_group ldlm_attr_group = { + .attrs = ldlm_attrs, +}; + static int ldlm_setup(void) { static struct ptlrpc_service_conf conf; @@ -1016,6 +1029,28 @@ static int ldlm_setup(void) if (ldlm_state == NULL) return -ENOMEM; + ldlm_kobj = kobject_create_and_add("ldlm", lustre_kobj); + if (!ldlm_kobj) { + rc = -ENOMEM; + goto out; + } + + rc = sysfs_create_group(ldlm_kobj, &ldlm_attr_group); + if (rc) + goto out; + + ldlm_ns_kset = kset_create_and_add("namespaces", NULL, ldlm_kobj); + if (!ldlm_ns_kset) { + rc = -ENOMEM; + goto out; + } + + ldlm_svc_kset = kset_create_and_add("services", NULL, ldlm_kobj); + if (!ldlm_svc_kset) { + rc = -ENOMEM; + goto out; + } + rc = ldlm_proc_setup(); if (rc != 0) goto out; @@ -1088,7 +1123,6 @@ static int ldlm_setup(void) goto out; } - rc = ldlm_pools_init(); if (rc) { CERROR("Failed to initialize LDLM pools: %d\n", rc); @@ -1135,6 +1169,13 @@ static int ldlm_cleanup(void) if (ldlm_state->ldlm_cb_service != NULL) ptlrpc_unregister_service(ldlm_state->ldlm_cb_service); + if (ldlm_ns_kset) + kset_unregister(ldlm_ns_kset); + if (ldlm_svc_kset) + kset_unregister(ldlm_svc_kset); + if (ldlm_kobj) + kobject_put(ldlm_kobj); + ldlm_proc_cleanup(); diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c b/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c index 7149eda..70d95673 100644 --- a/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c @@ -307,6 +307,24 @@ static ssize_t lprocfs_elc_seq_write(struct file *file, } LPROC_SEQ_FOPS(lprocfs_elc); +/* These are for namespaces in /sys/fs/lustre/ldlm/namespaces/ */ +static struct attribute *ldlm_ns_attrs[] = { + NULL, +}; + +static void ldlm_ns_release(struct kobject *kobj) +{ + struct ldlm_namespace *ns = container_of(kobj, struct ldlm_namespace, + ns_kobj); + complete(&ns->ns_kobj_unregister); +} + +static struct kobj_type ldlm_ns_ktype = { + .default_attrs = ldlm_ns_attrs, + .sysfs_ops = &lustre_sysfs_ops, + .release = ldlm_ns_release, +}; + void ldlm_namespace_proc_unregister(struct ldlm_namespace *ns) { if (ns->ns_proc_dir_entry == NULL) @@ -319,6 +337,12 @@ void ldlm_namespace_proc_unregister(struct ldlm_namespace *ns) lprocfs_free_stats(&ns->ns_stats); } +void ldlm_namespace_sysfs_unregister(struct ldlm_namespace *ns) +{ + kobject_put(&ns->ns_kobj); + wait_for_completion(&ns->ns_kobj_unregister); +} + #define LDLM_NS_ADD_VAR(name, var, ops) \ do { \ snprintf(lock_name, MAX_STRING_SIZE, name); \ @@ -327,6 +351,19 @@ void ldlm_namespace_proc_unregister(struct ldlm_namespace *ns) lprocfs_add_vars(ns_pde, lock_vars, NULL); \ } while (0) + +int ldlm_namespace_sysfs_register(struct ldlm_namespace *ns) +{ + int err; + + ns->ns_kobj.kset = ldlm_ns_kset; + init_completion(&ns->ns_kobj_unregister); + err = kobject_init_and_add(&ns->ns_kobj, &ldlm_ns_ktype, NULL, + "%s", ldlm_ns_name(ns)); + + return err; +} + int ldlm_namespace_proc_register(struct ldlm_namespace *ns) { struct lprocfs_vars lock_vars[2]; @@ -636,10 +673,17 @@ struct ldlm_namespace *ldlm_namespace_new(struct obd_device *obd, char *name, ns->ns_orig_connect_flags = 0; ns->ns_connect_flags = 0; ns->ns_stopping = 0; + + rc = ldlm_namespace_sysfs_register(ns); + if (rc != 0) { + CERROR("Can't initialize ns sysfs, rc %d\n", rc); + goto out_hash; + } + rc = ldlm_namespace_proc_register(ns); if (rc != 0) { CERROR("Can't initialize ns proc, rc %d\n", rc); - goto out_hash; + goto out_sysfs; } idx = ldlm_namespace_nr_read(client); @@ -653,6 +697,8 @@ struct ldlm_namespace *ldlm_namespace_new(struct obd_device *obd, char *name, return ns; out_proc: ldlm_namespace_proc_unregister(ns); +out_sysfs: + ldlm_namespace_sysfs_unregister(ns); ldlm_namespace_cleanup(ns, 0); out_hash: cfs_hash_putref(ns->ns_rs_hash); -- 2.7.4