]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev/sd: add support for DISKSEQ
authorLuca Boccassi <luca.boccassi@microsoft.com>
Tue, 20 Jul 2021 14:22:16 +0000 (15:22 +0100)
committerLuca Boccassi <luca.boccassi@microsoft.com>
Wed, 28 Jul 2021 18:59:38 +0000 (19:59 +0100)
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.

src/libsystemd/libsystemd.sym
src/libsystemd/sd-device/device-internal.h
src/libsystemd/sd-device/device-private.c
src/libsystemd/sd-device/sd-device.c
src/systemd/sd-device.h

index 3730db6eef9d7405e001870ceb9c86f670b4e423..04db791f644c4f2c00586c40568e36114823aec2 100644 (file)
@@ -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;
index f4d02f995e22644d0083aef9e55d552d78ef72b7..76a1727b1c154ad1f02261fde86767032ef5ac5f 100644 (file)
@@ -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;
index 37c655578c73a41e43643ba48c5983ff94b6dbfb..16a2e9e1e43e8fb93629734c210ebe723b8d134f 100644 (file)
@@ -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;
index 388128bf330857332dfe81b720ee84cd449c6beb..62012665bd2591fc7e3f9d68697c6ad97aa6fb0c 100644 (file)
@@ -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);
 
index 7ab0a8334eb91d55907b6b4d0ec68dd322e7ced9..189a110ea0d1631c9a374f2f96e8a4fc27919a08 100644 (file)
@@ -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);