@@ -85,24 +85,40 @@ static void flush_bios(struct bio *bio)
8585 }
8686}
8787
88- static void flush_delayed_bios_fast (struct delay_c * dc , bool flush_all )
88+ static void flush_delayed_bios (struct delay_c * dc , bool flush_all )
8989{
9090 struct dm_delay_info * delayed , * next ;
9191 struct bio_list flush_bio_list ;
92+ unsigned long next_expires = 0 ;
93+ bool start_timer = false;
9294 bio_list_init (& flush_bio_list );
9395
9496 mutex_lock (& delayed_bios_lock );
9597 list_for_each_entry_safe (delayed , next , & dc -> delayed_bios , list ) {
98+ cond_resched ();
9699 if (flush_all || time_after_eq (jiffies , delayed -> expires )) {
97100 struct bio * bio = dm_bio_from_per_bio_data (delayed ,
98101 sizeof (struct dm_delay_info ));
99102 list_del (& delayed -> list );
100103 bio_list_add (& flush_bio_list , bio );
101104 delayed -> class -> ops -- ;
105+ continue ;
106+ }
107+
108+ if (!delay_is_fast (dc )) {
109+ if (!start_timer ) {
110+ start_timer = true;
111+ next_expires = delayed -> expires ;
112+ } else {
113+ next_expires = min (next_expires , delayed -> expires );
114+ }
102115 }
103116 }
104117 mutex_unlock (& delayed_bios_lock );
105118
119+ if (start_timer )
120+ queue_timeout (dc , next_expires );
121+
106122 flush_bios (bio_list_get (& flush_bio_list ));
107123}
108124
@@ -111,7 +127,7 @@ static int flush_worker_fn(void *data)
111127 struct delay_c * dc = data ;
112128
113129 while (!kthread_should_stop ()) {
114- flush_delayed_bios_fast (dc , false);
130+ flush_delayed_bios (dc , false);
115131 mutex_lock (& delayed_bios_lock );
116132 if (unlikely (list_empty (& dc -> delayed_bios ))) {
117133 set_current_state (TASK_INTERRUPTIBLE );
@@ -126,48 +142,12 @@ static int flush_worker_fn(void *data)
126142 return 0 ;
127143}
128144
129- static void flush_delayed_bios (struct delay_c * dc , bool flush_all )
130- {
131- struct dm_delay_info * delayed , * next ;
132- unsigned long next_expires = 0 ;
133- unsigned long start_timer = 0 ;
134- struct bio_list flush_bio_list ;
135- bio_list_init (& flush_bio_list );
136-
137- mutex_lock (& delayed_bios_lock );
138- list_for_each_entry_safe (delayed , next , & dc -> delayed_bios , list ) {
139- if (flush_all || time_after_eq (jiffies , delayed -> expires )) {
140- struct bio * bio = dm_bio_from_per_bio_data (delayed ,
141- sizeof (struct dm_delay_info ));
142- list_del (& delayed -> list );
143- bio_list_add (& flush_bio_list , bio );
144- delayed -> class -> ops -- ;
145- continue ;
146- }
147-
148- if (!start_timer ) {
149- start_timer = 1 ;
150- next_expires = delayed -> expires ;
151- } else
152- next_expires = min (next_expires , delayed -> expires );
153- }
154- mutex_unlock (& delayed_bios_lock );
155-
156- if (start_timer )
157- queue_timeout (dc , next_expires );
158-
159- flush_bios (bio_list_get (& flush_bio_list ));
160- }
161-
162145static void flush_expired_bios (struct work_struct * work )
163146{
164147 struct delay_c * dc ;
165148
166149 dc = container_of (work , struct delay_c , flush_expired_bios );
167- if (delay_is_fast (dc ))
168- flush_delayed_bios_fast (dc , false);
169- else
170- flush_delayed_bios (dc , false);
150+ flush_delayed_bios (dc , false);
171151}
172152
173153static void delay_dtr (struct dm_target * ti )
@@ -354,12 +334,9 @@ static void delay_presuspend(struct dm_target *ti)
354334 dc -> may_delay = false;
355335 mutex_unlock (& delayed_bios_lock );
356336
357- if (delay_is_fast (dc )) {
358- flush_delayed_bios_fast (dc , true);
359- } else {
337+ if (!delay_is_fast (dc ))
360338 del_timer_sync (& dc -> delay_timer );
361- flush_delayed_bios (dc , true);
362- }
339+ flush_delayed_bios (dc , true);
363340}
364341
365342static void delay_resume (struct dm_target * ti )
0 commit comments