chiark / gitweb /
udevd: serialize events if they refer to the same major:minor number
[elogind.git] / udevd.c
diff --git a/udevd.c b/udevd.c
index eb311dfba72e7e5e7ce29b0fd2c9d21c785b819a..82ebd22dbad1dc1891fcdc34bcbee2a5df8182d8 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -76,17 +76,14 @@ void log_message(int priority, const char *format, ...)
        if (priority > udev_log_priority)
                return;
 
+       va_start(args, format);
        if (verbose) {
                printf("[%d] ", (int) getpid());
-               va_start(args, format);
                vprintf(format, args);
-               va_end(args);
                printf("\n");
-       } else {
-               va_start(args, format);
+       } else
                vsyslog(priority, format, args);
-               va_end(args);
-       }
+       va_end(args);
 }
 
 #endif
@@ -482,12 +479,20 @@ static int devpath_busy(struct udevd_uevent_msg *msg, int limit)
                        return 3;
                }
 
+               /* check for our major:minor number */
+               if (msg->devt && loop_msg->devt == msg->devt &&
+                   strcmp(msg->subsystem, loop_msg->subsystem) == 0) {
+                       dbg("%llu, device event still pending %llu (%d:%d)", msg->seqnum,
+                           loop_msg->seqnum, major(loop_msg->devt), minor(loop_msg->devt));
+                       return 4;
+               }
+
                /* check physical device event (special case of parent) */
                if (msg->physdevpath && msg->action && strcmp(msg->action, "add") == 0)
                        if (compare_devpath(loop_msg->devpath, msg->physdevpath) != 0) {
                                dbg("%llu, physical device event still pending %llu (%s)",
                                    msg->seqnum, loop_msg->seqnum, loop_msg->devpath);
-                               return 4;
+                               return 5;
                        }
        }
 
@@ -510,12 +515,20 @@ static int devpath_busy(struct udevd_uevent_msg *msg, int limit)
                        return 3;
                }
 
+               /* check for our major:minor number */
+               if (msg->devt && loop_msg->devt == msg->devt &&
+                   strcmp(msg->subsystem, loop_msg->subsystem) == 0) {
+                       dbg("%llu, device event still running %llu (%d:%d)", msg->seqnum,
+                           loop_msg->seqnum, major(loop_msg->devt), minor(loop_msg->devt));
+                       return 4;
+               }
+
                /* check physical device event (special case of parent) */
                if (msg->physdevpath && msg->action && strcmp(msg->action, "add") == 0)
                        if (compare_devpath(loop_msg->devpath, msg->physdevpath) != 0) {
                                dbg("%llu, physical device event still running %llu (%s)",
                                    msg->seqnum, loop_msg->seqnum, loop_msg->devpath);
-                               return 4;
+                               return 5;
                        }
        }
        return 0;