From 7064b767c22eba639ef20180f03b6a25b40ff2e1 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Thu, 23 Jul 2009 16:14:52 -0700 Subject: [PATCH] Positive Solaris ioctl return codes need to be negated for use by libc --- module/spl/spl-module.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) 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 -- 2.39.2