diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-12-30 20:57:53 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-01-05 01:40:51 +0100 |
commit | fa6ac76083b8ffc1309876459f54f9f0e2843731 (patch) | |
tree | 5169233d54825b07e63da5d11fbc3b4e248aa38b /src/journal/mmap-cache.h | |
parent | f93bf4363395018ef48d744c4624158623afd693 (diff) |
journald: process SIGBUS for the memory maps we set up
Even though we use fallocate() it appears that file systems like btrfs
will trigger SIGBUS on certain low-disk-space situation. We should
handle that, hence catch the signal, add it to a list of invalidated
pages, and replace the page with an empty memory area. After each write
check if SIGBUS was triggered, and consider the write invalid if it was.
This should make journald a lot more robust with file systems where
fallocate() is not reliable, for example all CoW file systems
(btrfs...), where changing written data can fail with disk full errors.
https://bugzilla.redhat.com/show_bug.cgi?id=1045810
Diffstat (limited to 'src/journal/mmap-cache.h')
-rw-r--r-- | src/journal/mmap-cache.h | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/journal/mmap-cache.h b/src/journal/mmap-cache.h index fe2c83d751..a85c2b6063 100644 --- a/src/journal/mmap-cache.h +++ b/src/journal/mmap-cache.h @@ -25,7 +25,8 @@ #include <stdbool.h> #include <sys/stat.h> -#define MMAP_CACHE_MAX_CONTEXTS 8 +/* One context per object type, plus one of the header, plus one "additional" one */ +#define MMAP_CACHE_MAX_CONTEXTS 9 typedef struct MMapCache MMapCache; @@ -47,3 +48,5 @@ void mmap_cache_close_fd(MMapCache *m, int fd); unsigned mmap_cache_get_hit(MMapCache *m); unsigned mmap_cache_get_missed(MMapCache *m); + +bool mmap_cache_got_sigbus(MMapCache *m, int fd); |