CPU set creation and destruction can fail on some platforms

Check for that and error out if necessary.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/fio.c b/fio.c
index 2a468b1..30b40cc 100644
--- a/fio.c
+++ b/fio.c
@@ -1116,8 +1116,11 @@
 	close_ioengine(td);
 	cleanup_io_u(td);
 
-	if (td->o.cpumask_set)
-		fio_cpuset_exit(td);
+	if (td->o.cpumask_set) {
+		int ret = fio_cpuset_exit(&td->o.cpumask);
+
+		td_verror(td, ret, "fio_cpuset_exit");
+	}
 
 	/*
 	 * do this very late, it will log file closing as well
diff --git a/options.c b/options.c
index 8e11227..f5bc9c0 100644
--- a/options.c
+++ b/options.c
@@ -247,8 +247,15 @@
 	struct thread_data *td = data;
 	unsigned int i;
 	long max_cpu;
+	int ret;
 
-	fio_cpuset_init(td);
+	ret = fio_cpuset_init(&td->o.cpumask);
+	if (ret < 0) {
+		log_err("fio: cpuset_init failed\n");
+		td_verror(td, ret, "fio_cpuset_init");
+		return 1;
+	}
+
 	max_cpu = sysconf(_SC_NPROCESSORS_ONLN);
 
 	for (i = 0; i < sizeof(int) * 8; i++) {
@@ -274,7 +281,12 @@
 	long max_cpu;
 	int ret = 0;
 
-	fio_cpuset_init(td);
+	ret = fio_cpuset_init(&td->o.cpumask);
+	if (ret < 0) {
+		log_err("fio: cpuset_init failed\n");
+		td_verror(td, ret, "fio_cpuset_init");
+		return 1;
+	}
 
 	p = str = strdup(input);
 
diff --git a/os/os-linux.h b/os/os-linux.h
index 3338046..03d2450 100644
--- a/os/os-linux.h
+++ b/os/os-linux.h
@@ -65,8 +65,17 @@
 
 #define fio_cpu_clear(mask, cpu)	CPU_CLR((cpu), (mask))
 #define fio_cpu_set(mask, cpu)		CPU_SET((cpu), (mask))
-#define fio_cpuset_init(td)		CPU_ZERO(&(td)->o.cpumask)
-#define fio_cpuset_exit(td)		do { } while (0)
+
+static inline int fio_cpuset_init(os_cpu_mask_t *mask)
+{
+	CPU_ZERO(mask);
+	return 0;
+}
+
+static inline int fio_cpuset_exit(os_cpu_mask_t *mask)
+{
+	return 0;
+}
 
 #define FIO_MAX_CPUS			CPU_SETSIZE
 
diff --git a/os/os-solaris.h b/os/os-solaris.h
index de94895..6b44ec0 100644
--- a/os/os-solaris.h
+++ b/os/os-solaris.h
@@ -74,8 +74,30 @@
 
 #define fio_cpu_clear(mask, cpu)	pset_assign(*(mask), (cpu), PS_NONE)
 #define fio_cpu_set(mask, cpu)		pset_assign(*(mask), (cpu), PS_MYID)
-#define fio_cpuset_init(td)		pset_create(&(td)->o.cpumask)
-#define fio_cpuset_exit(td)		pset_destroy((td)->o.cpumask)
+
+static inline int fio_cpuset_init(os_cpu_mask_t *mask)
+{
+	int ret;
+
+	if (pset_create(mask) < 0) {
+		ret = errno;
+		return -1;
+	}
+
+	return 0;
+}
+
+static inline int fio_cpuset_exit(os_cpu_mask_t *mask)
+{
+	int ret;
+
+	if (pset_destroy(*mask) < 0) {
+		ret = errno;
+		return -1;
+	}
+
+	return 0;
+}
 
 /*
  * Should be enough, not aware of what (if any) restrictions Solaris has