gracefully handle full /tmp file system

If /tmp happens to be full, fio gives you a very unhelpful error:

# ./fio rand-write-256k-q256.job
Bus error

Use posix_fallocate() to gracefully handle this condition.

Signed-off-by: Greg Edwards <greg.edwards@hp.com>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
diff --git a/smalloc.c b/smalloc.c
index 409998a..4cd8298 100644
--- a/smalloc.c
+++ b/smalloc.c
@@ -10,9 +10,11 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <limits.h>
+#include <fcntl.h>
 
 #include "mutex.h"
 #include "arch/arch.h"
+#include "os/os.h"
 
 #define SMALLOC_REDZONE		/* define to detect memory corruption */
 
@@ -176,7 +178,7 @@
 
 static int add_pool(struct pool *pool, unsigned int alloc_size)
 {
-	int fd, bitmap_blocks;
+	int fd, bitmap_blocks, ret;
 	char file[] = "/tmp/.fio_smalloc.XXXXXX";
 	void *ptr;
 
@@ -200,6 +202,14 @@
 	pool->nr_blocks = bitmap_blocks;
 	pool->free_blocks = bitmap_blocks * SMALLOC_BPB;
 
+#ifdef FIO_HAVE_FALLOCATE
+	ret = posix_fallocate(fd, 0, alloc_size);
+	if (ret > 0) {
+		fprintf(stderr, "posix_fallocate pool file failed: %s\n", strerror(ret));
+		goto out_unlink;
+	}
+#endif
+
 	if (ftruncate(fd, alloc_size) < 0)
 		goto out_unlink;