Positive Solaris ioctl return codes need to be negated for use by libc

This commit is contained in:
Brian Behlendorf 2009-07-23 16:14:52 -07:00
parent 3c9ce2bf69
commit 7064b767c2
1 changed files with 9 additions and 2 deletions

View File

@ -63,12 +63,19 @@ mod_generic_ioctl(struct inode *ino, struct file *file,
di = get_dev_info(MKDEV(imajor(ino), iminor(ino))); di = get_dev_info(MKDEV(imajor(ino), iminor(ino)));
if (di == NULL) if (di == NULL)
return EINVAL; return -EINVAL;
rc = di->di_ops->devo_cb_ops->cb_ioctl(di->di_dev, rc = di->di_ops->devo_cb_ops->cb_ioctl(di->di_dev,
(int)cmd, (intptr_t)arg, (int)cmd, (intptr_t)arg,
flags, cr, &rvalp); flags, cr, &rvalp);
return rc; /*
* The Solaris the kernel returns positive error codes to indicate
* a failure. Under linux the kernel is expected to return a
* small negative value which is trapped by libc and used to
* set errno correctly. For this reason we negate the Solaris
* return code to ensure errno gets set correctly.
*/
return -rc;
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT