X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_open.c;h=117c79cd3e11b9508ad385173f5e1d2871aeb23f;hb=a490ff8d4ae97046a200b6a1c9c033d9b461b77d;hp=9f4f6e2758a9095c657f2a19c90fcf1f3008d888;hpb=46a2db0465372eae273b1ff827e465a779339198;p=rrdtool.git diff --git a/src/rrd_open.c b/src/rrd_open.c index 9f4f6e2..117c79c 100644 --- a/src/rrd_open.c +++ b/src/rrd_open.c @@ -6,19 +6,21 @@ * $Id$ *****************************************************************************/ +#include "rrd_tool.h" +#include "unused.h" + #ifdef WIN32 #include #include #include #endif + #ifdef HAVE_BROKEN_MS_ASYNC #include #include #endif -#include "rrd_tool.h" -#include "unused.h" #define MEMBLK 8192 #ifdef WIN32 @@ -156,7 +158,9 @@ rrd_file_t *rrd_open( if (rdwr & RRD_READONLY) { flags |= O_RDONLY; #ifdef HAVE_MMAP +# if !defined(AIX) rrd_simple_file->mm_flags = MAP_PRIVATE; +# endif # ifdef MAP_NORESERVE rrd_simple_file->mm_flags |= MAP_NORESERVE; /* readonly, so no swap backing needed */ # endif @@ -244,6 +248,38 @@ rrd_file_t *rrd_open( */ #ifdef HAVE_MMAP + /* force allocating the file on the underlaying filesystem to prevent any + * future bus error when the filesystem is full and attempting to write + * trough the file mapping. Filling the file using memset on the file + * mapping can also lead some bus error, so we use the old fashioned + * write(). + */ + if (rdwr & RRD_CREAT) { + char buf[4096]; + unsigned i; + + memset(buf, DNAN, sizeof buf); + lseek(rrd_simple_file->fd, offset, SEEK_SET); + + for (i = 0; i < (newfile_size - 1) / sizeof buf; ++i) + { + if (write(rrd_simple_file->fd, buf, sizeof buf) == -1) + { + rrd_set_error("write '%s': %s", file_name, rrd_strerror(errno)); + goto out_close; + } + } + + if (write(rrd_simple_file->fd, buf, + (newfile_size - 1) % sizeof buf) == -1) + { + rrd_set_error("write '%s': %s", file_name, rrd_strerror(errno)); + goto out_close; + } + + lseek(rrd_simple_file->fd, 0, SEEK_SET); + } + data = mmap(0, rrd_file->file_len, rrd_simple_file->mm_prot, rrd_simple_file->mm_flags, rrd_simple_file->fd, offset); @@ -256,7 +292,6 @@ rrd_file_t *rrd_open( } rrd_simple_file->file_start = data; if (rdwr & RRD_CREAT) { - memset(data, DNAN, newfile_size - 1); goto out_done; } #endif @@ -667,7 +702,7 @@ ssize_t rrd_write( if((rrd_file->pos + count) > old_size) { - rrd_set_error("attempting to write beyond end of file"); + rrd_set_error("attempting to write beyond end of file (%ld + %ld > %ld)",rrd_file->pos, count, old_size); return -1; } memcpy(rrd_simple_file->file_start + rrd_file->pos, buf, count);