1
0
mirror of https://github.com/systemd/systemd.git synced 2024-10-30 23:21:22 +03:00

Merge pull request #22913 from yuwata/sd-device-cleanups

sd-device,udev: several cleanups
This commit is contained in:
Yu Watanabe 2022-03-31 09:24:38 +09:00 committed by GitHub
commit a14b9ca2c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 41 deletions

View File

@ -340,7 +340,7 @@ _public_ int sd_device_new_from_subsystem_sysname(
assert_return(path_is_normalized(sysname), -EINVAL);
if (streq(subsystem, "subsystem")) {
FOREACH_STRING(s, "/sys/subsystem/", "/sys/bus/", "/sys/class/") {
FOREACH_STRING(s, "/sys/bus/", "/sys/class/") {
r = device_strjoin_new(s, sysname, NULL, NULL, ret);
if (r < 0)
return r;
@ -364,13 +364,11 @@ _public_ int sd_device_new_from_subsystem_sysname(
const char *subsys = memdupa_suffix0(sysname, sep - sysname);
sep++;
FOREACH_STRING(s, "/sys/subsystem/", "/sys/bus/") {
r = device_strjoin_new(s, subsys, "/drivers/", sep, ret);
if (r < 0)
return r;
if (r > 0)
return 0;
}
r = device_strjoin_new("/sys/bus/", subsys, "/drivers/", sep, ret);
if (r < 0)
return r;
if (r > 0)
return 0;
}
}
@ -380,13 +378,11 @@ _public_ int sd_device_new_from_subsystem_sysname(
if (name[i] == '/')
name[i] = '!';
FOREACH_STRING(s, "/sys/subsystem/", "/sys/bus/") {
r = device_strjoin_new(s, subsystem, "/devices/", name, ret);
if (r < 0)
return r;
if (r > 0)
return 0;
}
r = device_strjoin_new("/sys/bus/", subsystem, "/devices/", name, ret);
if (r < 0)
return r;
if (r > 0)
return 0;
r = device_strjoin_new("/sys/class/", subsystem, "/", name, ret);
if (r < 0)
@ -739,7 +735,7 @@ _public_ int sd_device_get_syspath(sd_device *device, const char **ret) {
static int device_new_from_child(sd_device **ret, sd_device *child) {
_cleanup_free_ char *path = NULL;
const char *subdir, *syspath;
const char *syspath;
int r;
assert(ret);
@ -749,35 +745,35 @@ static int device_new_from_child(sd_device **ret, sd_device *child) {
if (r < 0)
return r;
path = strdup(syspath);
if (!path)
return -ENOMEM;
subdir = path + STRLEN("/sys");
for (;;) {
char *pos;
_cleanup_free_ char *p = NULL;
pos = strrchr(subdir, '/');
if (!pos || pos < subdir + 2)
r = path_extract_directory(path ?: syspath, &p);
if (r < 0)
return r;
if (path_equal(p, "/sys"))
return -ENODEV;
*pos = '\0';
r = sd_device_new_from_syspath(ret, p);
if (r != -ENODEV)
return r;
r = sd_device_new_from_syspath(ret, path);
if (r < 0)
continue;
return 0;
free_and_replace(path, p);
}
}
_public_ int sd_device_get_parent(sd_device *child, sd_device **ret) {
int r;
assert_return(child, -EINVAL);
if (!child->parent_set) {
child->parent_set = true;
r = device_new_from_child(&child->parent, child);
if (r < 0 && r != -ENODEV)
return r;
(void) device_new_from_child(&child->parent, child);
child->parent_set = true;
}
if (!child->parent)
@ -869,9 +865,7 @@ _public_ int sd_device_get_subsystem(sd_device *device, const char **ret) {
r = device_set_subsystem(device, "module");
else if (strstr(syspath, "/drivers/"))
r = device_set_drivers_subsystem(device);
else if (PATH_STARTSWITH_SET(device->devpath, "/subsystem/",
"/class/",
"/bus/"))
else if (PATH_STARTSWITH_SET(device->devpath, "/class/", "/bus/"))
r = device_set_subsystem(device, "subsystem");
else {
device->subsystem_set = true;
@ -1144,8 +1138,14 @@ _public_ int sd_device_get_seqnum(sd_device *device, uint64_t *ret) {
}
_public_ int sd_device_get_diskseq(sd_device *device, uint64_t *ret) {
int r;
assert_return(device, -EINVAL);
r = device_read_uevent_file(device);
if (r < 0)
return r;
if (device->diskseq == 0)
return -ENOENT;

View File

@ -422,7 +422,7 @@ static int worker_send_result(Manager *manager, int result) {
return loop_write(manager->worker_watch[WRITE_END], &result, sizeof(result), false);
}
static int device_get_block_device(sd_device *dev, const char **ret) {
static int device_get_whole_disk(sd_device *dev, const char **ret) {
const char *val;
int r;
@ -451,6 +451,8 @@ static int device_get_block_device(sd_device *dev, const char **ret) {
return log_device_debug_errno(dev, r, "Failed to get devtype: %m");
if (r >= 0 && streq(val, "partition")) {
r = sd_device_get_parent(dev, &dev);
if (r == -ENOENT) /* The device may be already removed. */
goto irrelevant;
if (r < 0)
return log_device_debug_errno(dev, r, "Failed to get parent device: %m");
}
@ -469,7 +471,7 @@ irrelevant:
return 0;
}
static int worker_lock_block_device(sd_device *dev, int *ret_fd) {
static int worker_lock_whole_disk(sd_device *dev, int *ret_fd) {
_cleanup_close_ int fd = -1;
const char *val;
int r;
@ -482,7 +484,7 @@ static int worker_lock_block_device(sd_device *dev, int *ret_fd) {
* event handling; in the case udev acquired the lock, the external process can block until udev has
* finished its event handling. */
r = device_get_block_device(dev, &val);
r = device_get_whole_disk(dev, &val);
if (r < 0)
return r;
if (r == 0)
@ -579,7 +581,7 @@ static int worker_process_device(Manager *manager, sd_device *dev) {
* Instead of processing the event, we requeue the event and will try again after a delay.
*
* The user-facing side of this: https://systemd.io/BLOCK_DEVICE_LOCKING */
r = worker_lock_block_device(dev, &fd_lock);
r = worker_lock_whole_disk(dev, &fd_lock);
if (r == -EAGAIN)
return EVENT_RESULT_TRY_AGAIN;
if (r < 0)
@ -1091,7 +1093,7 @@ static int event_queue_assume_block_device_unlocked(Manager *manager, sd_device
* device is not locked anymore. The assumption may not be true, but that should not cause any
* issues, as in that case events will be requeued soon. */
r = device_get_block_device(dev, &devname);
r = device_get_whole_disk(dev, &devname);
if (r <= 0)
return r;
@ -1104,7 +1106,7 @@ static int event_queue_assume_block_device_unlocked(Manager *manager, sd_device
if (event->retry_again_next_usec == 0)
continue;
if (device_get_block_device(event->dev, &event_devname) <= 0)
if (device_get_whole_disk(event->dev, &event_devname) <= 0)
continue;
if (!streq(devname, event_devname))