@@ -34,6 +34,7 @@ struct delay_c {
34
34
35
35
struct delay_class read ;
36
36
struct delay_class write ;
37
+ struct delay_class flush ;
37
38
38
39
int argc ;
39
40
};
@@ -126,6 +127,8 @@ static void delay_dtr(struct dm_target *ti)
126
127
dm_put_device (ti , dc -> read .dev );
127
128
if (dc -> write .dev )
128
129
dm_put_device (ti , dc -> write .dev );
130
+ if (dc -> flush .dev )
131
+ dm_put_device (ti , dc -> flush .dev );
129
132
130
133
mutex_destroy (& dc -> timer_lock );
131
134
@@ -171,8 +174,8 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv)
171
174
struct delay_c * dc ;
172
175
int ret ;
173
176
174
- if (argc != 3 && argc != 6 ) {
175
- ti -> error = "Requires exactly 3 or 6 arguments" ;
177
+ if (argc != 3 && argc != 6 && argc != 9 ) {
178
+ ti -> error = "Requires exactly 3, 6 or 9 arguments" ;
176
179
return - EINVAL ;
177
180
}
178
181
@@ -196,6 +199,9 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv)
196
199
197
200
if (argc == 3 ) {
198
201
ret = delay_class_ctr (ti , & dc -> write , argv );
202
+ if (ret )
203
+ goto bad ;
204
+ ret = delay_class_ctr (ti , & dc -> flush , argv );
199
205
if (ret )
200
206
goto bad ;
201
207
goto out ;
@@ -204,6 +210,16 @@ static int delay_ctr(struct dm_target *ti, unsigned int argc, char **argv)
204
210
ret = delay_class_ctr (ti , & dc -> write , argv + 3 );
205
211
if (ret )
206
212
goto bad ;
213
+ if (argc == 6 ) {
214
+ ret = delay_class_ctr (ti , & dc -> flush , argv + 3 );
215
+ if (ret )
216
+ goto bad ;
217
+ goto out ;
218
+ }
219
+
220
+ ret = delay_class_ctr (ti , & dc -> flush , argv + 6 );
221
+ if (ret )
222
+ goto bad ;
207
223
208
224
out :
209
225
dc -> kdelayd_wq = alloc_workqueue ("kdelayd" , WQ_MEM_RECLAIM , 0 );
@@ -269,7 +285,10 @@ static int delay_map(struct dm_target *ti, struct bio *bio)
269
285
struct dm_delay_info * delayed = dm_per_bio_data (bio , sizeof (struct dm_delay_info ));
270
286
271
287
if (bio_data_dir (bio ) == WRITE ) {
272
- c = & dc -> write ;
288
+ if (unlikely (bio -> bi_opf & REQ_PREFLUSH ))
289
+ c = & dc -> flush ;
290
+ else
291
+ c = & dc -> write ;
273
292
} else {
274
293
c = & dc -> read ;
275
294
}
@@ -292,7 +311,7 @@ static void delay_status(struct dm_target *ti, status_type_t type,
292
311
293
312
switch (type ) {
294
313
case STATUSTYPE_INFO :
295
- DMEMIT ("%u %u" , dc -> read .ops , dc -> write .ops );
314
+ DMEMIT ("%u %u %u " , dc -> read .ops , dc -> write . ops , dc -> flush .ops );
296
315
break ;
297
316
298
317
case STATUSTYPE_TABLE :
@@ -301,6 +320,10 @@ static void delay_status(struct dm_target *ti, status_type_t type,
301
320
DMEMIT (" " );
302
321
DMEMIT_DELAY_CLASS (& dc -> write );
303
322
}
323
+ if (dc -> argc >= 9 ) {
324
+ DMEMIT (" " );
325
+ DMEMIT_DELAY_CLASS (& dc -> flush );
326
+ }
304
327
break ;
305
328
}
306
329
}
@@ -317,6 +340,9 @@ static int delay_iterate_devices(struct dm_target *ti,
317
340
ret = fn (ti , dc -> write .dev , dc -> write .start , ti -> len , data );
318
341
if (ret )
319
342
goto out ;
343
+ ret = fn (ti , dc -> flush .dev , dc -> flush .start , ti -> len , data );
344
+ if (ret )
345
+ goto out ;
320
346
321
347
out :
322
348
return ret ;
0 commit comments