X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fdevice.c;h=d3deac393649667a89a676d2f1c570bfa45f34b2;hb=0faacd470dfbd24f4c6504da6f04213aa05f9d19;hp=068578dc829a82f8f6ea85c0157c11f2a8140d1a;hpb=79008bddf679a5e0900369950eb346c9fa687107;p=elogind.git diff --git a/src/core/device.c b/src/core/device.c index 068578dc8..d3deac393 100644 --- a/src/core/device.c +++ b/src/core/device.c @@ -334,7 +334,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p return 0; fail: - log_warning("Failed to load device unit: %s", strerror(-r)); + log_warning_errno(r, "Failed to load device unit: %m"); if (delete && u) unit_free(u); @@ -382,7 +382,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev) { * same /dev/disk/by-label/xxx link because they have * the same label. We want to make sure that the same * device that won the symlink wins in systemd, so we - * check the device node major/minor*/ + * check the device node major/minor */ if (stat(p, &st) >= 0) if ((!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode)) || st.st_rdev != udev_device_get_devnum(dev)) @@ -628,7 +628,7 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, static RATELIMIT_DEFINE(limit, 10*USEC_PER_SEC, 5); if (!ratelimit_test(&limit)) - log_error("Failed to get udev event: %m"); + log_error_errno(errno, "Failed to get udev event: %m"); if (!(revents & EPOLLIN)) return 0; } @@ -650,20 +650,20 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, if (streq(action, "remove") || !device_is_ready(dev)) { r = device_process_removed_device(m, dev); if (r < 0) - log_error("Failed to process device remove event: %s", strerror(-r)); + log_error_errno(r, "Failed to process device remove event: %m"); r = swap_process_removed_device(m, dev); if (r < 0) - log_error("Failed to process swap device remove event: %s", strerror(-r)); + log_error_errno(r, "Failed to process swap device remove event: %m"); } else { r = device_process_new_device(m, dev); if (r < 0) - log_error("Failed to process device new event: %s", strerror(-r)); + log_error_errno(r, "Failed to process device new event: %m"); r = swap_process_new_device(m, dev); if (r < 0) - log_error("Failed to process swap device new event: %s", strerror(-r)); + log_error_errno(r, "Failed to process swap device new event: %m"); manager_dispatch_load_queue(m); @@ -673,6 +673,19 @@ static int device_dispatch_io(sd_event_source *source, int fd, uint32_t revents, return 0; } +static bool device_supported(Manager *m) { + static int read_only = -1; + assert(m); + + /* If /sys is read-only we don't support device units, and any + * attempts to start one should fail immediately. */ + + if (read_only < 0) + read_only = path_is_read_only_fs("/sys"); + + return read_only <= 0; +} + static const char* const device_state_table[_DEVICE_STATE_MAX] = { [DEVICE_DEAD] = "dead", [DEVICE_PLUGGED] = "plugged" @@ -708,6 +721,7 @@ const UnitVTable device_vtable = { .enumerate = device_enumerate, .shutdown = device_shutdown, + .supported = device_supported, .status_message_formats = { .starting_stopping = {