X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Freadahead%2Freadahead-common.c;h=aea1fbeea4ff8fe02e8f226f7b5c5f25ecb65363;hp=41aaff0a3d1532caf323f936bb9577e3a21df24b;hb=f75cac3746efa4c3fb0b1dbc458c9ae0bf083a52;hpb=d7228cb8529de83115af04bf653b4d204dad8fae diff --git a/src/readahead/readahead-common.c b/src/readahead/readahead-common.c index 41aaff0a3..aea1fbeea 100644 --- a/src/readahead/readahead-common.c +++ b/src/readahead/readahead-common.c @@ -27,12 +27,14 @@ #include #include #include -#include #include "log.h" #include "readahead-common.h" #include "util.h" #include "missing.h" +#include "fileio.h" +#include "libudev.h" +#include "udev-util.h" int file_verify(int fd, const char *fn, off_t file_size_max, struct stat *st) { assert(fd >= 0); @@ -59,9 +61,9 @@ int file_verify(int fd, const char *fn, off_t file_size_max, struct stat *st) { int fs_on_ssd(const char *p) { struct stat st; - struct udev *udev = NULL; - struct udev_device *udev_device = NULL, *look_at = NULL; - bool b = false; + _cleanup_udev_unref_ struct udev *udev = NULL; + _cleanup_udev_device_unref_ struct udev_device *udev_device = NULL; + struct udev_device *look_at = NULL; const char *devtype, *rotational, *model, *id; int r; @@ -127,7 +129,7 @@ int fs_on_ssd(const char *p) { udev_device = udev_device_new_from_devnum(udev, 'b', st.st_dev); if (!udev_device) - goto finish; + return false; devtype = udev_device_get_property_value(udev_device, "DEVTYPE"); if (devtype && streq(devtype, "partition")) @@ -136,46 +138,34 @@ int fs_on_ssd(const char *p) { look_at = udev_device; if (!look_at) - goto finish; + return false; /* First, try high-level property */ id = udev_device_get_property_value(look_at, "ID_SSD"); - if (id) { - b = streq(id, "1"); - goto finish; - } + if (id) + return streq(id, "1"); /* Second, try kernel attribute */ rotational = udev_device_get_sysattr_value(look_at, "queue/rotational"); - if (rotational) { - b = streq(rotational, "0"); - goto finish; - } + if (rotational) + return streq(rotational, "0"); /* Finally, fallback to heuristics */ look_at = udev_device_get_parent(look_at); if (!look_at) - goto finish; + return false; model = udev_device_get_sysattr_value(look_at, "model"); if (model) - b = !!strstr(model, "SSD"); - -finish: - if (udev_device) - udev_device_unref(udev_device); + return !!strstr(model, "SSD"); - if (udev) - udev_unref(udev); - - return b; + return false; } int fs_on_read_only(const char *p) { struct stat st; - struct udev *udev = NULL; - struct udev_device *udev_device = NULL; - bool b = false; + _cleanup_udev_unref_ struct udev *udev = NULL; + _cleanup_udev_device_unref_ struct udev_device *udev_device = NULL; const char *read_only; assert(p); @@ -186,24 +176,19 @@ int fs_on_read_only(const char *p) { if (major(st.st_dev) == 0) return false; - if (!(udev = udev_new())) + udev = udev_new(); + if (!udev) return -ENOMEM; - if (!(udev_device = udev_device_new_from_devnum(udev, 'b', st.st_dev))) - goto finish; - - if ((read_only = udev_device_get_sysattr_value(udev_device, "ro"))) - if ((b = streq(read_only, "1"))) - goto finish; - -finish: - if (udev_device) - udev_device_unref(udev_device); + udev_device = udev_device_new_from_devnum(udev, 'b', st.st_dev); + if (!udev_device) + return false; - if (udev) - udev_unref(udev); + read_only = udev_device_get_sysattr_value(udev_device, "ro"); + if (read_only) + return streq(read_only, "1"); - return b; + return false; } bool enough_ram(void) { @@ -215,16 +200,23 @@ bool enough_ram(void) { return si.totalram > 127 * 1024*1024 / si.mem_unit; } +static void mkdirs(void) { + if (mkdir("/run/systemd", 0755) && errno != EEXIST) + log_warning("Failed to create /run/systemd: %m"); + if (mkdir("/run/systemd/readahead", 0755) && errno != EEXIST) + log_warning("Failed to create /run/systemd: %m"); +} + int open_inotify(void) { int fd; - if ((fd = inotify_init1(IN_CLOEXEC|IN_NONBLOCK)) < 0) { + fd = inotify_init1(IN_CLOEXEC|IN_NONBLOCK); + if (fd < 0) { log_error("Failed to create inotify handle: %m"); return -errno; } - mkdir("/run/systemd", 0755); - mkdir("/run/systemd/readahead", 0755); + mkdirs(); if (inotify_add_watch(fd, "/run/systemd/readahead", IN_CREATE) < 0) { log_error("Failed to watch /run/systemd/readahead: %m"); @@ -236,32 +228,28 @@ int open_inotify(void) { } ReadaheadShared *shared_get(void) { - int fd; + int _cleanup_close_ fd = -1; ReadaheadShared *m = NULL; - mkdir("/run/systemd", 0755); - mkdir("/run/systemd/readahead", 0755); + mkdirs(); - if ((fd = open("/run/systemd/readahead/shared", O_CREAT|O_RDWR|O_CLOEXEC, 0644)) < 0) { + fd = open("/run/systemd/readahead/shared", O_CREAT|O_RDWR|O_CLOEXEC, 0644); + if (fd < 0) { log_error("Failed to create shared memory segment: %m"); - goto finish; + return NULL; } if (ftruncate(fd, sizeof(ReadaheadShared)) < 0) { log_error("Failed to truncate shared memory segment: %m"); - goto finish; + return NULL; } - if ((m = mmap(NULL, sizeof(ReadaheadShared), PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) { + m = mmap(NULL, sizeof(ReadaheadShared), PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0); + if (m == MAP_FAILED) { log_error("Failed to mmap shared memory segment: %m"); - m = NULL; - goto finish; + return NULL; } -finish: - if (fd >= 0) - close_nointr_nofail(fd); - return m; } @@ -315,7 +303,7 @@ int block_bump_request_nr(const char *p) { goto finish; } - r = write_one_line_file(ap, line); + r = write_string_file(ap, line); if (r < 0) goto finish; @@ -398,7 +386,7 @@ int block_set_readahead(const char *p, uint64_t bytes) { goto finish; } - r = write_one_line_file(ap, line); + r = write_string_file(ap, line); if (r < 0) goto finish;