From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrey Vagin Date: Tue, 06 Mar 2012 08:48:01 +0000 Subject: [PATCH] udev: fix problem due to unsorted events Message-Id: <1331023681-27958-1-git-send-email-avagin@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-hotplug@vger.kernel.org From: Andrey Vagin A kernel gives events, but this events can be unsorted. For example, here is log from system: udevd[77]: seq 924 queued, 'add' 'bdi' udevd[77]: seq 926 queued, 'add' 'block' udevd[77]: seq 927 queued, 'add' 'block' udevd[77]: seq 928 queued, 'add' 'block udevd[77]: seq 925 queued, 'add' 'drivers' In this case "udevadm settle" returns an error: queue is empty but kernel events still pending [928]<->[925] Let's look at update_queue(). It contains the follow code: /* now write to the queue */ if (state = DEVICE_QUEUED) { udev_queue_export->queued_count++; udev_queue_export->seqnum_min = seqnum; } where seqnum_min is latest sequence number in queue file. Probably we should check that seqnum is not less than seqnum_min and update it only in this case. https://bugzilla.redhat.com/show_bug.cgi?idy9834 Signed-off-by: Andrey Vagin --- src/libudev-queue-private.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/src/libudev-queue-private.c b/src/libudev-queue-private.c index 7177195..6a689c4 100644 --- a/src/libudev-queue-private.c +++ b/src/libudev-queue-private.c @@ -376,7 +376,8 @@ static int update_queue(struct udev_queue_export *udev_queue_export, /* now write to the queue */ if (state = DEVICE_QUEUED) { udev_queue_export->queued_count++; - udev_queue_export->seqnum_min = seqnum; + if (udev_queue_export->seqnum_min < seqnum) + udev_queue_export->seqnum_min = seqnum; } else { udev_queue_export->waste_bytes += queue_record_size(devpath_len) + queue_record_size(0); udev_queue_export->queued_count--; -- 1.7.7.6