Add parent directory to contain directories representing entries in lockd's host cache. Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> --- fs/lockd/host.c | 46 +++++++++++++++++++++++++++++++++++++++++++ fs/lockd/svc.c | 7 +++++++ include/linux/lockd/lockd.h | 2 ++ 3 files changed, 55 insertions(+), 0 deletions(-) diff --git a/fs/lockd/host.c b/fs/lockd/host.c index 4600c20..3fbb0a5 100644 --- a/fs/lockd/host.c +++ b/fs/lockd/host.c @@ -45,6 +45,10 @@ struct nlm_lookup_host_info { const int noresvport; /* use non-priv port */ }; +static struct kobject *nlm_hosts_kobj; +static struct kobject *nlm_hosts_client_kobj; +static struct kobject *nlm_hosts_server_kobj; + /* * Hash function must work well on big- and little-endian platforms */ @@ -567,3 +571,45 @@ nlm_gc_hosts(void) next_gc = jiffies + NLM_HOST_COLLECT; } + +/** + * nlm_host_init - Called when lockd module is loaded + * + */ +int nlm_host_init(void) +{ + nlm_hosts_kobj = kobject_create_and_add("hosts", nlm_kobj); + if (nlm_hosts_kobj == NULL) + return -ENOMEM; + + nlm_hosts_server_kobj = kobject_create_and_add("server", nlm_hosts_kobj); + if (nlm_hosts_server_kobj == NULL) { + kobject_put(nlm_hosts_kobj); + return -ENOMEM; + } + + nlm_hosts_client_kobj = kobject_create_and_add("client", nlm_hosts_kobj); + if (nlm_hosts_client_kobj == NULL) { + kobject_put(nlm_hosts_server_kobj); + kobject_put(nlm_hosts_kobj); + return -ENOMEM; + } + + return 0; +} + +/** + * nlm_host_shutdown - Called when lockd module is about to be unloaded + * + */ +void nlm_host_shutdown(void) +{ + if (nrhosts != 0) { + printk(KERN_WARNING "NLM hosts remain at shutdown"); + return; + } + + kobject_put(nlm_hosts_client_kobj); + kobject_put(nlm_hosts_server_kobj); + kobject_put(nlm_hosts_kobj); +} diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index 94e0d4b..acfb6d7 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c @@ -521,9 +521,15 @@ static int __init init_nlm(void) if (!nlm_kobj) return -ENOMEM; + if (nlm_host_init()) { + kobject_put(nlm_kobj); + return -ENOMEM; + } + #ifdef CONFIG_SYSCTL nlm_sysctl_table = register_sysctl_table(nlm_sysctl_root); if (!nlm_sysctl_table) { + nlm_host_shutdown(); kobject_put(nlm_kobj); return -ENOMEM; } @@ -539,6 +545,7 @@ static void __exit exit_nlm(void) #ifdef CONFIG_SYSCTL unregister_sysctl_table(nlm_sysctl_table); #endif + nlm_host_shutdown(); kobject_put(nlm_kobj); } diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index 56c749e..2d89cdb 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h @@ -217,6 +217,8 @@ void nlmclnt_next_cookie(struct nlm_cookie *); /* * Host cache */ +int nlm_host_init(void); +void nlm_host_shutdown(void); struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap, const size_t salen, const unsigned short protocol, -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html