X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Frrd_open.c;h=d9946420a0dcd58bb1618916bd0d607a798ef438;hb=d9822df7ed5e8122cf3a62e4e99678e94007f504;hp=65e921a23619138202b85ec21c9becab9dd7679a;hpb=91b2f1022a195d008d818f283690ef63a00fd79c;p=pkg-rrdtool.git diff --git a/src/rrd_open.c b/src/rrd_open.c index 65e921a..d994642 100644 --- a/src/rrd_open.c +++ b/src/rrd_open.c @@ -1,11 +1,14 @@ /***************************************************************************** - * RRDtool 1.4.2 Copyright by Tobi Oetiker, 1997-2009 + * RRDtool 1.4.8 Copyright by Tobi Oetiker, 1997-2013 ***************************************************************************** * rrd_open.c Open an RRD File ***************************************************************************** - * $Id: rrd_open.c 1970 2009-11-15 11:54:23Z oetiker $ + * $Id$ *****************************************************************************/ +#include "rrd_tool.h" +#include "unused.h" + #ifdef WIN32 #include #include @@ -17,8 +20,6 @@ #include #endif -#include "rrd_tool.h" -#include "unused.h" #define MEMBLK 8192 #ifdef WIN32 @@ -156,7 +157,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 @@ -172,6 +175,9 @@ rrd_file_t *rrd_open( if (rdwr & RRD_CREAT) { flags |= (O_CREAT | O_TRUNC); } + if (rdwr & RRD_EXCL) { + flags |= O_EXCL; + } } if (rdwr & RRD_READAHEAD) { #ifdef MAP_POPULATE @@ -215,12 +221,20 @@ rrd_file_t *rrd_open( rrd_file->file_len = statb.st_size; } else { rrd_file->file_len = newfile_size; +#ifdef HAVE_POSIX_FALLOCATE + if (posix_fallocate(rrd_simple_file->fd, 0, newfile_size) == -1) { + rrd_set_error("posix_fallocate '%s': %s", file_name, + rrd_strerror(errno)); + goto out_close; + } +#else lseek(rrd_simple_file->fd, newfile_size - 1, SEEK_SET); if ( write(rrd_simple_file->fd, "\0", 1) == -1){ /* poke */ rrd_set_error("write '%s': %s", file_name, rrd_strerror(errno)); goto out_close; } lseek(rrd_simple_file->fd, 0, SEEK_SET); +#endif } #ifdef HAVE_POSIX_FADVISE /* In general we need no read-ahead when dealing with rrd_files. @@ -241,6 +255,40 @@ rrd_file_t *rrd_open( */ #ifdef HAVE_MMAP +#ifndef HAVE_POSIX_FALLOCATE + /* 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); + } +#endif + data = mmap(0, rrd_file->file_len, rrd_simple_file->mm_prot, rrd_simple_file->mm_flags, rrd_simple_file->fd, offset); @@ -252,10 +300,6 @@ rrd_file_t *rrd_open( goto out_close; } rrd_simple_file->file_start = data; - if (rdwr & RRD_CREAT) { - memset(data, DNAN, newfile_size - 1); - goto out_done; - } #endif if (rdwr & RRD_CREAT) goto out_done; @@ -577,9 +621,11 @@ off_t rrd_seek( int whence) { off_t ret = 0; +#ifndef HAVE_MMAP rrd_simple_file_t *rrd_simple_file; rrd_simple_file = (rrd_simple_file_t *)rrd_file->pvt; - +#endif + #ifdef HAVE_MMAP if (whence == SEEK_SET) rrd_file->pos = off; @@ -683,7 +729,7 @@ ssize_t rrd_write( /* this is a leftover from the old days, it serves no purpose and is therefore turned into a no-op */ void rrd_flush( - rrd_file_t *rrd_file __attribute__((unused))) + rrd_file_t UNUSED(*rrd_file)) { } @@ -745,10 +791,10 @@ void rrd_freemem( * aligning RRAs within stripes, or other performance enhancements */ void rrd_notify_row( - rrd_file_t *rrd_file __attribute__((unused)), - int rra_idx __attribute__((unused)), - unsigned long rra_row __attribute__((unused)), - time_t rra_time __attribute__((unused))) + rrd_file_t UNUSED(*rrd_file), + int UNUSED(rra_idx), + unsigned long UNUSED(rra_row), + time_t UNUSED(rra_time)) { } @@ -760,8 +806,8 @@ void rrd_notify_row( * don't change to a new disk block at the same time */ unsigned long rrd_select_initial_row( - rrd_file_t *rrd_file __attribute__((unused)), - int rra_idx __attribute__((unused)), + rrd_file_t UNUSED(*rrd_file), + int UNUSED(rra_idx), rra_def_t *rra ) {