assert(fn);
if ((fd = open(fn, O_RDONLY|O_CLOEXEC|O_NOATIME|O_NOCTTY|O_NOFOLLOW)) < 0) {
+
+ if (errno == ENOENT)
+ return 0;
+
+ if (errno == EPERM || errno == EACCES)
+ return 0;
+
log_warning("open(%s) failed: %m", fn);
r = -errno;
goto finish;
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;
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;
}
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;
char_array_0(fn);
if ((k = readlink_malloc(fn, &p)) >= 0) {
-
if (startswith(p, "/tmp") ||
+ endswith(p, " (deleted)") ||
hashmap_get(files, p))
/* Not interesting, or
* already read */
on_ssd = fs_on_ssd(root) > 0;
log_debug("On SSD: %s", yes_no(on_ssd));
- on_btrfs = statfs(root, &sfs) >= 0 && sfs.f_type == BTRFS_SUPER_MAGIC;
+ on_btrfs = statfs(root, &sfs) >= 0 && (long) sfs.f_type == (long) BTRFS_SUPER_MAGIC;
log_debug("On btrfs: %s", yes_no(on_btrfs));
asprintf(&pack_fn, "%s/.readahead", root);
int main(int argc, char *argv[]) {
int r;
+ const char *root;
log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
log_parse_environment();
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;