X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Freadahead-collect.c;h=eac11e7e5c160477f6c8ba61fd4d2394a67b6b97;hp=ac46c7b3ea2afca7e49fb34c71e64ba93c674b97;hb=798e258d301ac237cb1d72b5fc4b19ee900d6f7d;hpb=a78899f541b944dd02fe581b1c3230eadccad1ba diff --git a/src/readahead-collect.c b/src/readahead-collect.c index ac46c7b3e..eac11e7e5 100644 --- a/src/readahead-collect.c +++ b/src/readahead-collect.c @@ -49,6 +49,7 @@ #include "sd-daemon.h" #include "ioprio.h" #include "readahead-common.h" +#include "virt.h" /* fixme: * @@ -96,6 +97,9 @@ static int pack_file(FILE *pack, const char *fn, bool on_btrfs) { if (errno == ENOENT) return 0; + if (errno == EPERM || errno == EACCES) + return 0; + log_warning("open(%s) failed: %m", fn); r = -errno; goto finish; @@ -116,9 +120,10 @@ static int pack_file(FILE *pack, const char *fn, bool on_btrfs) { goto finish; } - pages = l / PAGE_SIZE; + pages = l / page_size(); vec = alloca(pages); + memset(vec, 0, pages); if (mincore(start, l, vec) < 0) { log_warning("mincore(%s) failed: %m", fn); r = -errno; @@ -286,13 +291,13 @@ static int collect(const char *root) { log_debug("Collecting..."); - if (access("/dev/.systemd/readahead/cancel", F_OK) >= 0) { + if (access("/run/systemd/readahead/cancel", F_OK) >= 0) { log_debug("Collection canceled"); r = -ECANCELED; goto finish; } - if (access("/dev/.systemd/readahead/done", F_OK) >= 0) { + if (access("/run/systemd/readahead/done", F_OK) >= 0) { log_debug("Got termination request"); goto done; } @@ -379,6 +384,16 @@ static int collect(const char *root) { if (errno == EINTR || errno == EAGAIN) continue; + /* fanotify sometimes returns EACCES on read() + * where it shouldn't. For now let's just + * ignore it here (which is safe), but + * eventually this should be + * dropped when the kernel is fixed. + * + * https://bugzilla.redhat.com/show_bug.cgi?id=707577 */ + if (errno == EACCES) + continue; + log_error("Failed to read event: %m"); r = -errno; goto finish; @@ -636,26 +651,41 @@ static int parse_argv(int argc, char *argv[]) { int main(int argc, char *argv[]) { int r; + const char *root; log_set_target(LOG_TARGET_SYSLOG_OR_KMSG); log_parse_environment(); log_open(); + umask(0022); + if ((r = parse_argv(argc, argv)) <= 0) return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + root = optind < argc ? argv[optind] : "/"; + + if (fs_on_read_only(root) > 0) { + log_info("Disabling readahead collector due to read-only media."); + return 0; + } + if (!enough_ram()) { log_info("Disabling readahead collector due to low memory."); return 0; } + if (detect_virtualization(NULL) > 0) { + log_info("Disabling readahead collector due to execution in virtualized environment."); + return 0; + } + if (!(shared = shared_get())) return 1; shared->collect = getpid(); __sync_synchronize(); - if (collect(optind < argc ? argv[optind] : "/") < 0) + if (collect(root) < 0) return 1; return 0;