gracefully handle full /tmp file system
authorGreg Edwards <greg.edwards@hp.com>
Fri, 25 Jun 2010 15:24:19 +0000 (09:24 -0600)
committerJens Axboe <jaxboe@fusionio.com>
Mon, 28 Jun 2010 06:12:29 +0000 (08:12 +0200)
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>
mutex.c
smalloc.c

diff --git a/mutex.c b/mutex.c
index abe073f4ffdf7d49ee92500db8d89e254def2852..88044f3a818753feb374bc0370e545fb2095d248 100644 (file)
--- a/mutex.c
+++ b/mutex.c
@@ -33,6 +33,14 @@ struct fio_mutex *fio_mutex_init(int value)
                return NULL;
        }
 
+#ifdef FIO_HAVE_FALLOCATE
+       ret = posix_fallocate(fd, 0, sizeof(struct fio_mutex));
+       if (ret > 0) {
+               fprintf(stderr, "posix_fallocate mutex failed: %s\n", strerror(ret));
+               goto err;
+       }
+#endif
+
        if (ftruncate(fd, sizeof(struct fio_mutex)) < 0) {
                perror("ftruncate mutex");
                goto err;
index 409998aa8ad5a66ebbc8ac7d2fb620553ac75880..4cd8298eaa004d7a56d861aefcb1373ae7fd7001 100644 (file)
--- a/smalloc.c
+++ b/smalloc.c
 #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 find_next_zero(int word, int start)
 
 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 @@ static int add_pool(struct pool *pool, unsigned int alloc_size)
        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;