watchdog: ts72xx_wdt: cleanup return codes in ioctl
There seems to be some confusion here which functions return positive numbers and which return negative error codes. copy_to_user() returns the number of bytes remaining to be copied but we want to return -EFAULT. The rest is just clean up. get_user() actually returns zero on success and -EFAULT on error so we can preserve the error code. The timeout_to_regval() function returns -EINVAL on failure, but we can propogate that back instead of hardcoding -EINVAL ourselves. Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Wim Van Sebroeck <wim@iguana.be> --
This commit is contained in:
Родитель
cfff96e69f
Коммит
a20a99fbb8
|
@ -305,7 +305,8 @@ static long ts72xx_wdt_ioctl(struct file *file, unsigned int cmd,
|
|||
|
||||
switch (cmd) {
|
||||
case WDIOC_GETSUPPORT:
|
||||
error = copy_to_user(argp, &winfo, sizeof(winfo));
|
||||
if (copy_to_user(argp, &winfo, sizeof(winfo)))
|
||||
error = -EFAULT;
|
||||
break;
|
||||
|
||||
case WDIOC_GETSTATUS:
|
||||
|
@ -320,10 +321,9 @@ static long ts72xx_wdt_ioctl(struct file *file, unsigned int cmd,
|
|||
case WDIOC_SETOPTIONS: {
|
||||
int options;
|
||||
|
||||
if (get_user(options, p)) {
|
||||
error = -EFAULT;
|
||||
error = get_user(options, p);
|
||||
if (error)
|
||||
break;
|
||||
}
|
||||
|
||||
error = -EINVAL;
|
||||
|
||||
|
@ -341,30 +341,26 @@ static long ts72xx_wdt_ioctl(struct file *file, unsigned int cmd,
|
|||
|
||||
case WDIOC_SETTIMEOUT: {
|
||||
int new_timeout;
|
||||
int regval;
|
||||
|
||||
if (get_user(new_timeout, p)) {
|
||||
error = -EFAULT;
|
||||
} else {
|
||||
int regval;
|
||||
|
||||
regval = timeout_to_regval(new_timeout);
|
||||
if (regval < 0) {
|
||||
error = -EINVAL;
|
||||
} else {
|
||||
ts72xx_wdt_stop(wdt);
|
||||
wdt->regval = regval;
|
||||
ts72xx_wdt_start(wdt);
|
||||
}
|
||||
}
|
||||
error = get_user(new_timeout, p);
|
||||
if (error)
|
||||
break;
|
||||
|
||||
regval = timeout_to_regval(new_timeout);
|
||||
if (regval < 0) {
|
||||
error = regval;
|
||||
break;
|
||||
}
|
||||
ts72xx_wdt_stop(wdt);
|
||||
wdt->regval = regval;
|
||||
ts72xx_wdt_start(wdt);
|
||||
|
||||
/*FALLTHROUGH*/
|
||||
}
|
||||
|
||||
case WDIOC_GETTIMEOUT:
|
||||
if (put_user(regval_to_timeout(wdt->regval), p))
|
||||
error = -EFAULT;
|
||||
error = put_user(regval_to_timeout(wdt->regval), p);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
Загрузка…
Ссылка в новой задаче