@@ -85,24 +85,40 @@ static void flush_bios(struct bio *bio)
85
85
}
86
86
}
87
87
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 )
89
89
{
90
90
struct dm_delay_info * delayed , * next ;
91
91
struct bio_list flush_bio_list ;
92
+ unsigned long next_expires = 0 ;
93
+ bool start_timer = false;
92
94
bio_list_init (& flush_bio_list );
93
95
94
96
mutex_lock (& delayed_bios_lock );
95
97
list_for_each_entry_safe (delayed , next , & dc -> delayed_bios , list ) {
98
+ cond_resched ();
96
99
if (flush_all || time_after_eq (jiffies , delayed -> expires )) {
97
100
struct bio * bio = dm_bio_from_per_bio_data (delayed ,
98
101
sizeof (struct dm_delay_info ));
99
102
list_del (& delayed -> list );
100
103
bio_list_add (& flush_bio_list , bio );
101
104
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
+ }
102
115
}
103
116
}
104
117
mutex_unlock (& delayed_bios_lock );
105
118
119
+ if (start_timer )
120
+ queue_timeout (dc , next_expires );
121
+
106
122
flush_bios (bio_list_get (& flush_bio_list ));
107
123
}
108
124
@@ -111,7 +127,7 @@ static int flush_worker_fn(void *data)
111
127
struct delay_c * dc = data ;
112
128
113
129
while (!kthread_should_stop ()) {
114
- flush_delayed_bios_fast (dc , false);
130
+ flush_delayed_bios (dc , false);
115
131
mutex_lock (& delayed_bios_lock );
116
132
if (unlikely (list_empty (& dc -> delayed_bios ))) {
117
133
set_current_state (TASK_INTERRUPTIBLE );
@@ -126,48 +142,12 @@ static int flush_worker_fn(void *data)
126
142
return 0 ;
127
143
}
128
144
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
-
162
145
static void flush_expired_bios (struct work_struct * work )
163
146
{
164
147
struct delay_c * dc ;
165
148
166
149
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);
171
151
}
172
152
173
153
static void delay_dtr (struct dm_target * ti )
@@ -354,12 +334,9 @@ static void delay_presuspend(struct dm_target *ti)
354
334
dc -> may_delay = false;
355
335
mutex_unlock (& delayed_bios_lock );
356
336
357
- if (delay_is_fast (dc )) {
358
- flush_delayed_bios_fast (dc , true);
359
- } else {
337
+ if (!delay_is_fast (dc ))
360
338
del_timer_sync (& dc -> delay_timer );
361
- flush_delayed_bios (dc , true);
362
- }
339
+ flush_delayed_bios (dc , true);
363
340
}
364
341
365
342
static void delay_resume (struct dm_target * ti )
0 commit comments