]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-device: skip diskseq verification when ID_IGNORE_DISKSEQ property is set
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 13 Apr 2022 14:01:33 +0000 (23:01 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 13 Apr 2022 15:10:28 +0000 (00:10 +0900)
Some drivers do not announce the diskseq change.
E.g. for md devices, the kernel increments the diskseq *after*
emitting a 'change' uevent when backing block devices are added to
a md device, and udevd does not receive no uevent which contains
the new diskseq.

src/libsystemd/sd-device/sd-device.c

index d31526fc222071e3429c3b0f8eb64c8b3458726d..7a346257dfb2496ea646f5069edb6ac521c8bd24 100644 (file)
@@ -2281,7 +2281,7 @@ _public_ int sd_device_trigger_with_uuid(
 
 _public_ int sd_device_open(sd_device *device, int flags) {
         _cleanup_close_ int fd = -1, fd2 = -1;
-        const char *devname, *subsystem = NULL;
+        const char *devname, *subsystem = NULL, *val = NULL;
         uint64_t q, diskseq = 0;
         struct stat st;
         dev_t devnum;
@@ -2306,10 +2306,6 @@ _public_ int sd_device_open(sd_device *device, int flags) {
         if (r < 0 && r != -ENOENT)
                 return r;
 
-        r = sd_device_get_diskseq(device, &diskseq);
-        if (r < 0 && r != -ENOENT)
-                return r;
-
         fd = open(devname, FLAGS_SET(flags, O_PATH) ? flags : O_CLOEXEC|O_NOFOLLOW|O_PATH);
         if (fd < 0)
                 return -errno;
@@ -2327,6 +2323,16 @@ _public_ int sd_device_open(sd_device *device, int flags) {
         if (FLAGS_SET(flags, O_PATH))
                 return TAKE_FD(fd);
 
+        r = sd_device_get_property_value(device, "ID_IGNORE_DISKSEQ", &val);
+        if (r < 0 && r != -ENOENT)
+                return r;
+
+        if (!val || parse_boolean(val) <= 0) {
+                r = sd_device_get_diskseq(device, &diskseq);
+                if (r < 0 && r != -ENOENT)
+                        return r;
+        }
+
         fd2 = open(FORMAT_PROC_FD_PATH(fd), flags);
         if (fd2 < 0)
                 return -errno;