Re: [PATCH] Sunrpc: Supports hexadecimal number for sysctl files of sunrpc debug

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Sep 10, 2015 at 08:41:34PM +0800, Kinglong Mee wrote:
> The sunrpc debug sysctl files only accept decimal number right now.
> But all the XXXDBUG_XXX macros are defined as hexadecimal.
> It is not easy to set or check an separate flag.
> 
> This patch let those files support accepting hexadecimal number,
> (decimal number is also supported). Also, display it as hexadecimal.

That potentially breaks backwards-compatibility if an program that reads
this file isn't prepared to accept a hexadecimal value.

That said, rpcdebug seems OK (it uses strtoul(.,.,0), which I think
should parse that fine?), and it may well be the only program that
actually parses this, so....  I suppose it's OK with me if it's OK with
Trond.

--b.

> 
> Signed-off-by: Kinglong Mee <kinglongmee@xxxxxxxxx>
> ---
>  net/sunrpc/sysctl.c | 26 +++++++++++++++-----------
>  1 file changed, 15 insertions(+), 11 deletions(-)
> 
> diff --git a/net/sunrpc/sysctl.c b/net/sunrpc/sysctl.c
> index 887f018..8e85e6f 100644
> --- a/net/sunrpc/sysctl.c
> +++ b/net/sunrpc/sysctl.c
> @@ -76,7 +76,7 @@ static int
>  proc_dodebug(struct ctl_table *table, int write,
>  				void __user *buffer, size_t *lenp, loff_t *ppos)
>  {
> -	char		tmpbuf[20], c, *s;
> +	char		tmpbuf[20], c, *s = NULL;
>  	char __user *p;
>  	unsigned int	value;
>  	size_t		left, len;
> @@ -103,23 +103,27 @@ proc_dodebug(struct ctl_table *table, int write,
>  			return -EFAULT;
>  		tmpbuf[left] = '\0';
>  
> -		for (s = tmpbuf, value = 0; '0' <= *s && *s <= '9'; s++, left--)
> -			value = 10 * value + (*s - '0');
> -		if (*s && !isspace(*s))
> -			return -EINVAL;
> -		while (left && isspace(*s))
> -			left--, s++;
> +		if (tmpbuf[0] == '0' && tmpbuf[1] == 'x')
> +			value = simple_strtol(tmpbuf, &s, 16);
> +		else
> +			value = simple_strtol(tmpbuf, &s, 0);
> +		if (s) {
> +			if (!isspace(*s))
> +				return -EINVAL;
> +			left -= (s - tmpbuf);
> +			while (left && isspace(*s))
> +				left--, s++;
> +		} else
> +			left = 0;
>  		*(unsigned int *) table->data = value;
>  		/* Display the RPC tasks on writing to rpc_debug */
>  		if (strcmp(table->procname, "rpc_debug") == 0)
>  			rpc_show_tasks(&init_net);
>  	} else {
> -		if (!access_ok(VERIFY_WRITE, buffer, left))
> -			return -EFAULT;
> -		len = sprintf(tmpbuf, "%d", *(unsigned int *) table->data);
> +		len = sprintf(tmpbuf, "0x%04x", *(unsigned int *) table->data);
>  		if (len > left)
>  			len = left;
> -		if (__copy_to_user(buffer, tmpbuf, len))
> +		if (copy_to_user(buffer, tmpbuf, len))
>  			return -EFAULT;
>  		if ((left -= len) > 0) {
>  			if (put_user('\n', (char __user *)buffer + len))
> -- 
> 2.5.0
--
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



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux