summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 2626578)
raw | patch | inline | side by side (parent: 2626578)
author | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Thu, 21 Apr 2011 06:12:50 +0000 (06:12 +0000) | ||
committer | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Thu, 21 Apr 2011 06:12:50 +0000 (06:12 +0000) |
zero. -- Francois-Xavier Bourlet francois-xavier.bourlet dotcloud.com
git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.4/program@2181 a5681a0c-68f1-0310-ab6d-d61299d08faa
git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.4/program@2181 a5681a0c-68f1-0310-ab6d-d61299d08faa
src/rrd_open.c | patch | blob | history |
diff --git a/src/rrd_open.c b/src/rrd_open.c
index 2fc7d192017251fb565bcb3d334de93983b5d935..a99f0ab6465cfcf5ff0fa185987ec9bdcdb83b6f 100644 (file)
--- a/src/rrd_open.c
+++ b/src/rrd_open.c
*/
#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);
}
rrd_simple_file->file_start = data;
if (rdwr & RRD_CREAT) {
- memset(data, DNAN, newfile_size - 1);
goto out_done;
}
#endif