@@ -780,6 +780,35 @@ static int event_is_blocked(Event *event) {
780780
781781 /* lookup event for identical, parent, child device */
782782
783+ assert (event );
784+ assert (event -> manager );
785+ assert (event -> blocker_seqnum <= event -> seqnum );
786+
787+ if (event -> blocker_seqnum == event -> seqnum )
788+ /* we have checked previously and no blocker found */
789+ return false;
790+
791+ LIST_FOREACH (event , loop_event , event -> manager -> events ) {
792+ /* we already found a later event, earlier cannot block us, no need to check again */
793+ if (loop_event -> seqnum < event -> blocker_seqnum )
794+ continue ;
795+
796+ /* event we checked earlier still exists, no need to check again */
797+ if (loop_event -> seqnum == event -> blocker_seqnum )
798+ return true;
799+
800+ /* found ourself, no later event can block us */
801+ if (loop_event -> seqnum >= event -> seqnum )
802+ goto no_blocker ;
803+
804+ /* found event we have not checked */
805+ break ;
806+ }
807+
808+ assert (loop_event );
809+ assert (loop_event -> seqnum > event -> blocker_seqnum &&
810+ loop_event -> seqnum < event -> seqnum );
811+
783812 r = sd_device_get_subsystem (event -> dev , & subsystem );
784813 if (r < 0 )
785814 return r ;
@@ -805,21 +834,13 @@ static int event_is_blocked(Event *event) {
805834 return r ;
806835
807836 /* check if queue contains events we depend on */
808- LIST_FOREACH (event , loop_event , event -> manager -> events ) {
837+ LIST_FOREACH (event , loop_event , loop_event ) {
809838 size_t loop_devpath_len , common ;
810839 const char * loop_devpath ;
811840
812- /* we already found a later event, earlier cannot block us, no need to check again */
813- if (loop_event -> seqnum < event -> blocker_seqnum )
814- continue ;
815-
816- /* event we checked earlier still exists, no need to check again */
817- if (loop_event -> seqnum == event -> blocker_seqnum )
818- return true;
819-
820841 /* found ourself, no later event can block us */
821842 if (loop_event -> seqnum >= event -> seqnum )
822- return false ;
843+ goto no_blocker ;
823844
824845 /* check major/minor */
825846 if (major (devnum ) != 0 ) {
@@ -879,6 +900,10 @@ static int event_is_blocked(Event *event) {
879900
880901 event -> blocker_seqnum = loop_event -> seqnum ;
881902 return true;
903+
904+ no_blocker :
905+ event -> blocker_seqnum = event -> seqnum ;
906+ return false;
882907}
883908
884909static int event_queue_start (Manager * manager ) {
0 commit comments