d->state = state;
if (state != old_state)
- log_debug_unit(UNIT(d)->id,
+ log_unit_debug(UNIT(d)->id,
"%s changed %s -> %s", UNIT(d)->id,
device_state_to_string(old_state),
device_state_to_string(state));
return r;
}
if (!isempty(state))
- log_warning_unit(u->id, "Property %s on %s has trailing garbage, ignoring.",
+ log_unit_warning(u->id, "Property %s on %s has trailing garbage, ignoring.",
property, strna(udev_device_get_syspath(dev)));
return 0;
goto fail;
}
- r = hashmap_ensure_allocated(&m->devices_by_sysfs, string_hash_func, string_compare_func);
+ r = hashmap_ensure_allocated(&m->devices_by_sysfs, &string_hash_ops);
if (r < 0)
goto fail;
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);
* 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))
return 0;
}
- set = set_new(NULL, NULL);
+ set = set_new(NULL);
if (!set)
return -ENOMEM;
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;
}
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);
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"
.enumerate = device_enumerate,
.shutdown = device_shutdown,
+ .supported = device_supported,
.status_message_formats = {
.starting_stopping = {