[Cluster-devel] [GFS2][PATCH] use lib/parser for parsing mount options

Steven Whitehouse swhiteho at redhat.com
Mon Apr 23 16:07:51 UTC 2007


Hi,

Looks good. Now applied to the -nmw git tree. Thanks,

Steve.

On Mon, 2007-04-23 at 11:55 -0400, Josef Bacik wrote:
> Hello,
> 
> This patch converts the mount option parsing to use the kernels lib/parser stuff
> like all of the other filesystems.  I tested this and it works well.  Thank you,
> 
> Josef
> 
> Signed-off-by: Josef Bacik <jwhiter at redhat.com>
> 
> diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
> diff --git a/fs/gfs2/mount.c b/fs/gfs2/mount.c
> index 32caecd..4864659 100644
> --- a/fs/gfs2/mount.c
> +++ b/fs/gfs2/mount.c
> @@ -13,6 +13,7 @@
>  #include <linux/buffer_head.h>
>  #include <linux/gfs2_ondisk.h>
>  #include <linux/lm_interface.h>
> +#include <linux/parser.h>
>  
>  #include "gfs2.h"
>  #include "incore.h"
> @@ -20,6 +21,52 @@
>  #include "sys.h"
>  #include "util.h"
>  
> +enum {
> +	Opt_lockproto,
> +	Opt_locktable,
> +	Opt_hostdata,
> +	Opt_spectator,
> +	Opt_ignore_local_fs,
> +	Opt_localflocks,
> +	Opt_localcaching,
> +	Opt_debug,
> +	Opt_nodebug,
> +	Opt_upgrade,
> +	Opt_num_glockd,
> +	Opt_acl,
> +	Opt_noacl,
> +	Opt_quota_off,
> +	Opt_quota_account,
> +	Opt_quota_on,
> +	Opt_suiddir,
> +	Opt_nosuiddir,
> +	Opt_data_writeback,
> +	Opt_data_ordered,
> +};
> +
> +static match_table_t tokens = {
> +	{Opt_lockproto, "lockproto=%s"},
> +	{Opt_locktable, "locktable=%s"},
> +	{Opt_hostdata, "hostdata=%s"},
> +	{Opt_spectator, "spectator"},
> +	{Opt_ignore_local_fs, "ignore_local_fs"},
> +	{Opt_localflocks, "localflocks"},
> +	{Opt_localcaching, "localcaching"},
> +	{Opt_debug, "debug"},
> +	{Opt_nodebug, "nodebug"},
> +	{Opt_upgrade, "upgrade"},
> +	{Opt_num_glockd, "num_glockd=%d"},
> +	{Opt_acl, "acl"},
> +	{Opt_noacl, "noacl"},
> +	{Opt_quota_off, "quota=off"},
> +	{Opt_quota_account, "quota=account"},
> +	{Opt_quota_on, "quota=on"},
> +	{Opt_suiddir, "suiddir"},
> +	{Opt_nosuiddir, "nosuiddir"},
> +	{Opt_data_writeback, "data=writeback"},
> +	{Opt_data_ordered, "data=ordered"}
> +};
> +
>  /**
>   * gfs2_mount_args - Parse mount options
>   * @sdp:
> @@ -54,146 +101,150 @@ int gfs2_mount_args(struct gfs2_sbd *sdp
>  	   process them */
>  
>  	for (options = data; (o = strsep(&options, ",")); ) {
> +		int token, option;
> +		substring_t tmp[MAX_OPT_ARGS];
> +
>  		if (!*o)
>  			continue;
>  
> -		v = strchr(o, '=');
> -		if (v)
> -			*v++ = 0;
> -
> -		if (!strcmp(o, "lockproto")) {
> -			if (!v)
> -				goto need_value;
> -			if (remount && strcmp(v, args->ar_lockproto))
> +		token = match_token(o, tokens, tmp);
> +		switch (token) {
> +		case Opt_lockproto:
> +			v = match_strdup(&tmp[0]);
> +			if (!v) {
> +				fs_info(sdp, "no memory for lockproto\n");
> +				error = -ENOMEM;
> +				goto out_error;
> +			}
> +
> +			if (remount && strcmp(v, args->ar_lockproto)) {
> +				kfree(v);
>  				goto cant_remount;
> +			}
> +			
>  			strncpy(args->ar_lockproto, v, GFS2_LOCKNAME_LEN);
>  			args->ar_lockproto[GFS2_LOCKNAME_LEN - 1] = 0;
> -		}
> +			kfree(v);
> +			break;
> +		case Opt_locktable:
> +			v = match_strdup(&tmp[0]);
> +			if (!v) {
> +				fs_info(sdp, "no memory for locktable\n");
> +				error = -ENOMEM;
> +				goto out_error;
> +			}
>  
> -		else if (!strcmp(o, "locktable")) {
> -			if (!v)
> -				goto need_value;
> -			if (remount && strcmp(v, args->ar_locktable))
> +			if (remount && strcmp(v, args->ar_locktable)) {
> +				kfree(v);
>  				goto cant_remount;
> +			}
> +
>  			strncpy(args->ar_locktable, v, GFS2_LOCKNAME_LEN);
> -			args->ar_locktable[GFS2_LOCKNAME_LEN - 1] = 0;
> -		}
> +			args->ar_locktable[GFS2_LOCKNAME_LEN - 1]  = 0;
> +			kfree(v);
> +			break;
> +		case Opt_hostdata:
> +			v = match_strdup(&tmp[0]);
> +			if (!v) {
> +				fs_info(sdp, "no memory for hostdata\n");
> +				error = -ENOMEM;
> +				goto out_error;
> +			}
>  
> -		else if (!strcmp(o, "hostdata")) {
> -			if (!v)
> -				goto need_value;
> -			if (remount && strcmp(v, args->ar_hostdata))
> +			if (remount && strcmp(v, args->ar_hostdata)) {
> +				kfree(v);
>  				goto cant_remount;
> +			}
> +
>  			strncpy(args->ar_hostdata, v, GFS2_LOCKNAME_LEN);
>  			args->ar_hostdata[GFS2_LOCKNAME_LEN - 1] = 0;
> -		}
> -
> -		else if (!strcmp(o, "spectator")) {
> +			kfree(v);
> +			break;
> +		case Opt_spectator:
>  			if (remount && !args->ar_spectator)
>  				goto cant_remount;
>  			args->ar_spectator = 1;
>  			sdp->sd_vfs->s_flags |= MS_RDONLY;
> -		}
> -
> -		else if (!strcmp(o, "ignore_local_fs")) {
> +			break;
> +		case Opt_ignore_local_fs:
>  			if (remount && !args->ar_ignore_local_fs)
>  				goto cant_remount;
>  			args->ar_ignore_local_fs = 1;
> -		}
> -
> -		else if (!strcmp(o, "localflocks")) {
> +			break;
> +		case Opt_localflocks:
>  			if (remount && !args->ar_localflocks)
>  				goto cant_remount;
>  			args->ar_localflocks = 1;
> -		}
> -
> -		else if (!strcmp(o, "localcaching")) {
> +			break;
> +		case Opt_localcaching:
>  			if (remount && !args->ar_localcaching)
>  				goto cant_remount;
>  			args->ar_localcaching = 1;
> -		}
> -
> -		else if (!strcmp(o, "debug"))
> +			break;
> +		case Opt_debug:
>  			args->ar_debug = 1;
> -
> -		else if (!strcmp(o, "nodebug"))
> +			break;
> +		case Opt_nodebug:
>  			args->ar_debug = 0;
> -
> -		else if (!strcmp(o, "upgrade")) {
> +			break;
> +		case Opt_upgrade:
>  			if (remount && !args->ar_upgrade)
>  				goto cant_remount;
>  			args->ar_upgrade = 1;
> -		}
> +			break;
> +		case Opt_num_glockd:
> +			if ((error = match_int(&tmp[0], &option))) {
> +				fs_info(sdp, "problem getting num_glockd\n");
> +				goto out_error;
> +			}
>  
> -		else if (!strcmp(o, "num_glockd")) {
> -			unsigned int x;
> -			if (!v)
> -				goto need_value;
> -			sscanf(v, "%u", &x);
> -			if (remount && x != args->ar_num_glockd)
> +			if (remount && option != args->ar_num_glockd)
>  				goto cant_remount;
> -			if (!x || x > GFS2_GLOCKD_MAX) {
> +			if (!option || option > GFS2_GLOCKD_MAX) {
>  				fs_info(sdp, "0 < num_glockd <= %u  (not %u)\n",
> -				        GFS2_GLOCKD_MAX, x);
> +				        GFS2_GLOCKD_MAX, option);
>  				error = -EINVAL;
> -				break;
> +				goto out_error;
>  			}
> -			args->ar_num_glockd = x;
> -		}
> -
> -		else if (!strcmp(o, "acl")) {
> +			args->ar_num_glockd = option;
> +			break;
> +		case Opt_acl:
>  			args->ar_posix_acl = 1;
>  			sdp->sd_vfs->s_flags |= MS_POSIXACL;
> -		}
> -
> -		else if (!strcmp(o, "noacl")) {
> +			break;
> +		case Opt_noacl:
>  			args->ar_posix_acl = 0;
>  			sdp->sd_vfs->s_flags &= ~MS_POSIXACL;
> -		}
> -
> -		else if (!strcmp(o, "quota")) {
> -			if (!v)
> -				goto need_value;
> -			if (!strcmp(v, "off"))
> -				args->ar_quota = GFS2_QUOTA_OFF;
> -			else if (!strcmp(v, "account"))
> -				args->ar_quota = GFS2_QUOTA_ACCOUNT;
> -			else if (!strcmp(v, "on"))
> -				args->ar_quota = GFS2_QUOTA_ON;
> -			else {
> -				fs_info(sdp, "invalid value for quota\n");
> -				error = -EINVAL;
> -				break;
> -			}
> -		}
> -
> -		else if (!strcmp(o, "suiddir"))
> +			break;
> +		case Opt_quota_off:
> +			args->ar_quota = GFS2_QUOTA_OFF;
> +			break;
> +		case Opt_quota_account:
> +			args->ar_quota = GFS2_QUOTA_ACCOUNT;
> +			break;
> +		case Opt_quota_on:
> +			args->ar_quota = GFS2_QUOTA_ON;
> +			break;
> +		case Opt_suiddir:
>  			args->ar_suiddir = 1;
> -
> -		else if (!strcmp(o, "nosuiddir"))
> +			break;
> +		case Opt_nosuiddir:
>  			args->ar_suiddir = 0;
> -
> -		else if (!strcmp(o, "data")) {
> -			if (!v)
> -				goto need_value;
> -			if (!strcmp(v, "writeback"))
> -				args->ar_data = GFS2_DATA_WRITEBACK;
> -			else if (!strcmp(v, "ordered"))
> -				args->ar_data = GFS2_DATA_ORDERED;
> -			else {
> -				fs_info(sdp, "invalid value for data\n");
> -				error = -EINVAL;
> -				break;
> -			}
> -		}
> -
> -		else {
> +			break;
> +		case Opt_data_writeback:
> +			args->ar_data = GFS2_DATA_WRITEBACK;
> +			break;
> +		case Opt_data_ordered:
> +			args->ar_data = GFS2_DATA_ORDERED;
> +			break;
> +		default:
>  			fs_info(sdp, "unknown option: %s\n", o);
>  			error = -EINVAL;
> -			break;
> +			goto out_error;
>  		}
>  	}
>  
> +out_error:
>  	if (error)
>  		fs_info(sdp, "invalid mount option(s)\n");
>  
> @@ -202,10 +253,6 @@ int gfs2_mount_args(struct gfs2_sbd *sdp
>  
>  	return error;
>  
> -need_value:
> -	fs_info(sdp, "need value for option %s\n", o);
> -	return -EINVAL;
> -
>  cant_remount:
>  	fs_info(sdp, "can't remount with option %s\n", o);
>  	return -EINVAL;
> 




More information about the Cluster-devel mailing list