From: Luca Boccassi Date: Tue, 20 Jul 2021 14:22:16 +0000 (+0100) Subject: udev/sd: add support for DISKSEQ X-Git-Tag: v250-rc1~754^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=122adcb294b98409c2f7ce4845d9d3ad1e4ef8b6;p=thirdparty%2Fsystemd.git udev/sd: add support for DISKSEQ DISKSEQ is a monotonic per-use unique sequence number, incremented on each block device create/attach. For example, the same loop device will have different diskseq each time an object is attached to it. Add sd/udev helpers to parse/expose it. --- diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index 3730db6eef9..04db791f644 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -762,3 +762,8 @@ global: sd_device_new_from_ifname; sd_device_new_from_ifindex; } LIBSYSTEMD_248; + +LIBSYSTEMD_250 { +global: + sd_device_get_diskseq; +} LIBSYSTEMD_249; diff --git a/src/libsystemd/sd-device/device-internal.h b/src/libsystemd/sd-device/device-internal.h index f4d02f995e2..76a1727b1c1 100644 --- a/src/libsystemd/sd-device/device-internal.h +++ b/src/libsystemd/sd-device/device-internal.h @@ -75,6 +75,8 @@ struct sd_device { uid_t devuid; gid_t devgid; + uint64_t diskseq; /* Block device sequence number, monothonically incremented by the kernel on create/attach */ + /* only set when device is passed through netlink */ sd_device_action_t action; uint64_t seqnum; diff --git a/src/libsystemd/sd-device/device-private.c b/src/libsystemd/sd-device/device-private.c index 37c655578c7..16a2e9e1e43 100644 --- a/src/libsystemd/sd-device/device-private.c +++ b/src/libsystemd/sd-device/device-private.c @@ -226,6 +226,28 @@ static int device_set_seqnum(sd_device *device, const char *str) { return 0; } +static int device_set_diskseq(sd_device *device, const char *str) { + uint64_t diskseq; + int r; + + assert(device); + assert(str); + + r = safe_atou64(str, &diskseq); + if (r < 0) + return r; + if (diskseq == 0) + return -EINVAL; + + r = device_add_property_internal(device, "DISKSEQ", str); + if (r < 0) + return r; + + device->diskseq = diskseq; + + return 0; +} + static int device_amend(sd_device *device, const char *key, const char *value) { int r; @@ -292,6 +314,10 @@ static int device_amend(sd_device *device, const char *key, const char *value) { r = device_set_seqnum(device, value); if (r < 0) return log_device_debug_errno(device, r, "sd-device: Failed to set SEQNUM to '%s': %m", value); + } else if (streq(key, "DISKSEQ")) { + r = device_set_diskseq(device, value); + if (r < 0) + return log_device_debug_errno(device, r, "sd-device: Failed to set DISKSEQ to '%s': %m", value); } else if (streq(key, "DEVLINKS")) { for (const char *p = value;;) { _cleanup_free_ char *word = NULL; diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index 388128bf330..62012665bd2 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -1140,6 +1140,18 @@ _public_ int sd_device_get_seqnum(sd_device *device, uint64_t *ret) { return 0; } +_public_ int sd_device_get_diskseq(sd_device *device, uint64_t *ret) { + assert_return(device, -EINVAL); + + if (device->diskseq == 0) + return -ENOENT; + + if (ret) + *ret = device->diskseq; + + return 0; +} + static bool is_valid_tag(const char *tag) { assert(tag); diff --git a/src/systemd/sd-device.h b/src/systemd/sd-device.h index 7ab0a8334eb..189a110ea0d 100644 --- a/src/systemd/sd-device.h +++ b/src/systemd/sd-device.h @@ -80,6 +80,7 @@ int sd_device_get_sysname(sd_device *device, const char **ret); int sd_device_get_sysnum(sd_device *device, const char **ret); int sd_device_get_action(sd_device *device, sd_device_action_t *ret); int sd_device_get_seqnum(sd_device *device, uint64_t *ret); +int sd_device_get_diskseq(sd_device *device, uint64_t *ret); int sd_device_get_is_initialized(sd_device *device); int sd_device_get_usec_initialized(sd_device *device, uint64_t *usec);