[pnfs] [PATCH 2/3] pnfs-gfs2: add interface to specify DSes on the MDS

Benny Halevy bhalevy at panasas.com
Thu May 29 05:07:30 EDT 2008


On May. 29, 2008, 2:52 +0300, "David M. Richter" <richterd at citi.umich.edu> wrote:
> Add a temporary /proc interface (/proc/sys/fs/gfs2/pnfs_ds_list) into which
> the (comma-separated) IP addresses of DSes can be echoed.  At some point
> this will be removed or reworked.
> 
> Signed-off-by: David M. Richter <richterd at citi.umich.edu>
> Signed-off-by: Frank Filz <ffilzlnx at us.ibm.com>
> ---
>  fs/gfs2/gfs2.h |    6 ++++
>  fs/gfs2/main.c |   70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 76 insertions(+), 0 deletions(-)
> 
> diff --git a/fs/gfs2/gfs2.h b/fs/gfs2/gfs2.h
> index 3bb11c0..8669d7e 100644
> --- a/fs/gfs2/gfs2.h
> +++ b/fs/gfs2/gfs2.h
> @@ -27,5 +27,11 @@ enum {
>  
>  #define GFS2_FAST_NAME_SIZE 8
>  
> +#if defined(CONFIG_PNFSD)
> +/* XXX: revisit; surely there's a better place for this? */
> +#define XXX_PNFS_DS_LISTSZ 256
> +extern char pnfs_ds_list[XXX_PNFS_DS_LISTSZ];
> +#endif /* CONFIG_PNFSD */
> +
>  #endif /* __GFS2_DOT_H__ */
>  
> diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c
> index 9c7765c..8d6889b 100644
> --- a/fs/gfs2/main.c
> +++ b/fs/gfs2/main.c
> @@ -24,6 +24,71 @@
>  #include "util.h"
>  #include "glock.h"
>  
> +/*
> + * XXX: the /proc interface for specifying pNFS DSes and possibly other
> + *  stuff in the future.  this should be pruned, replaced, or moved.
> + */
> +#if defined(CONFIG_PNFSD)
> +#include <linux/fs.h>
> +#include <linux/sysctl.h>
> +
> +char pnfs_ds_list[XXX_PNFS_DS_LISTSZ];
> +
> +static struct ctl_table_header *gfs2_sysctl_table;
> +
> +static ctl_table gfs2_sysctls[] = {
> +	{
> +		.ctl_name	= CTL_UNNUMBERED,
> +		.procname	= "pnfs_ds_list",
> +		.data		= &pnfs_ds_list,
> +		.maxlen		= XXX_PNFS_DS_LISTSZ,
> +		.mode		= 0644,
> +		.proc_handler	= &proc_dostring,
> +		.strategy	= &sysctl_string,
> +	},
> +	{	.ctl_name	= 0 }
> +};
> +
> +static ctl_table gfs2_sysctl_dir[] = {
> +	{
> +		.ctl_name	= CTL_UNNUMBERED,
> +		.procname	= "gfs2",
> +		.mode		= 0555,
> +		.child		= gfs2_sysctls,
> +	},
> +	{	.ctl_name	= 0 }
> +};
> +
> +static ctl_table gfs2_sysctl_root[] = {
> +	{
> +		.ctl_name	= CTL_FS,
> +		.procname	= "fs",
> +		.mode		= 0555,
> +		.child		= gfs2_sysctl_dir,
> +	},
> +	{	.ctl_name	= 0 }
> +};
> +
> +static int gfs2_register_sysctl(void)
> +{
> +	*pnfs_ds_list = '\0';

You don't need this, actually, since pnfs_ds_list
is statically allocated so it's guaranteed to be initialized
with zeroes.

Or can you unregister and re-register the sysctl table
while unloading the module?

> +	gfs2_sysctl_table = register_sysctl_table(gfs2_sysctl_root);
> +	if (gfs2_sysctl_table == NULL)
> +		return -ENOMEM;
> +	return 0;
> +}
> +
> +static void gfs2_unregister_sysctl(void)
> +{
> +	unregister_sysctl_table(gfs2_sysctl_table);
> +	gfs2_sysctl_table = NULL;
> +}
> +
> +#else /* !CONFIG_PNFSD */
> +static int gfs2_register_sysctl()	0
> +static void gfs2_unregister_sysctl()	do {} while (0)
> +#endif /* CONFIG_PNFSD */
> +
>  static void gfs2_init_inode_once(struct kmem_cache *cachep, void *foo)
>  {
>  	struct gfs2_inode *ip = foo;
> @@ -97,6 +162,10 @@ static int __init init_gfs2_fs(void)
>  	if (error)
>  		goto fail_unregister;
>  
> +	error = gfs2_register_sysctl();
> +	if (error)
> +		goto fail_unregister;
> +
>  	gfs2_register_debugfs();
>  
>  	printk("GFS2 (built %s %s) installed\n", __DATE__, __TIME__);
> @@ -130,6 +199,7 @@ static void __exit exit_gfs2_fs(void)
>  {
>  	gfs2_glock_exit();
>  	gfs2_unregister_debugfs();
> +	gfs2_unregister_sysctl();
>  	unregister_filesystem(&gfs2_fs_type);
>  	unregister_filesystem(&gfs2meta_fs_type);
>  



More information about the pNFS mailing list