From: Brian Behlendorf Date: Thu, 23 Jul 2009 23:14:52 +0000 (-0700) Subject: Positive Solaris ioctl return codes need to be negated for use by libc X-Git-Tag: spl-0.4.5~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7064b767c22eba639ef20180f03b6a25b40ff2e1;p=spl Positive Solaris ioctl return codes need to be negated for use by libc --- diff --git a/module/spl/spl-module.c b/module/spl/spl-module.c index aa3d561..f179748 100644 --- a/module/spl/spl-module.c +++ b/module/spl/spl-module.c @@ -63,12 +63,19 @@ mod_generic_ioctl(struct inode *ino, struct file *file, di = get_dev_info(MKDEV(imajor(ino), iminor(ino))); if (di == NULL) - return EINVAL; + return -EINVAL; rc = di->di_ops->devo_cb_ops->cb_ioctl(di->di_dev, (int)cmd, (intptr_t)arg, 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