2 * Copyright (C) 2005-2007 Red Hat GmbH
4 * A target that delays reads and/or writes and can send
5 * them to different devices.
7 * This file is released under the GPL.
10 #include <linux/module.h>
11 #include <linux/init.h>
12 #include <linux/blkdev.h>
13 #include <linux/bio.h>
14 #include <linux/slab.h>
16 #include <linux/device-mapper.h>
18 #define DM_MSG_PREFIX "delay"
28 struct timer_list delay_timer
;
29 struct mutex timer_lock
;
30 struct workqueue_struct
*kdelayd_wq
;
31 struct work_struct flush_expired_bios
;
32 struct list_head delayed_bios
;
35 struct delay_class read
;
36 struct delay_class write
;
37 struct delay_class flush
;
42 struct dm_delay_info
{
43 struct delay_c
*context
;
44 struct delay_class
*class;
45 struct list_head list
;
46 unsigned long expires
;
49 static DEFINE_MUTEX(delayed_bios_lock
);
51 static void handle_delayed_timer(struct timer_list
*t
)
53 struct delay_c
*dc
= from_timer(dc
, t
, delay_timer
);
55 queue_work(dc
->kdelayd_wq
, &dc
->flush_expired_bios
);
58 static void queue_timeout(struct delay_c
*dc
, unsigned long expires
)
60 mutex_lock(&dc
->timer_lock
);
62 if (!timer_pending(&dc
->delay_timer
) || expires
< dc
->delay_timer
.expires
)
63 mod_timer(&dc
->delay_timer
, expires
);
65 mutex_unlock(&dc
->timer_lock
);
68 static void flush_bios(struct bio
*bio
)
75 submit_bio_noacct(bio
);
80 static struct bio
*flush_delayed_bios(struct delay_c
*dc
, int flush_all
)
82 struct dm_delay_info
*delayed
, *next
;
83 unsigned long next_expires
= 0;
84 unsigned long start_timer
= 0;
85 struct bio_list flush_bios
= { };
87 mutex_lock(&delayed_bios_lock
);
88 list_for_each_entry_safe(delayed
, next
, &dc
->delayed_bios
, list
) {
89 if (flush_all
|| time_after_eq(jiffies
, delayed
->expires
)) {
90 struct bio
*bio
= dm_bio_from_per_bio_data(delayed
,
91 sizeof(struct dm_delay_info
));
92 list_del(&delayed
->list
);
93 bio_list_add(&flush_bios
, bio
);
94 delayed
->class->ops
--;
100 next_expires
= delayed
->expires
;
102 next_expires
= min(next_expires
, delayed
->expires
);
104 mutex_unlock(&delayed_bios_lock
);
107 queue_timeout(dc
, next_expires
);
109 return bio_list_get(&flush_bios
);
112 static void flush_expired_bios(struct work_struct
*work
)
116 dc
= container_of(work
, struct delay_c
, flush_expired_bios
);
117 flush_bios(flush_delayed_bios(dc
, 0));
120 static void delay_dtr(struct dm_target
*ti
)
122 struct delay_c
*dc
= ti
->private;
125 destroy_workqueue(dc
->kdelayd_wq
);
128 dm_put_device(ti
, dc
->read
.dev
);
130 dm_put_device(ti
, dc
->write
.dev
);
132 dm_put_device(ti
, dc
->flush
.dev
);
134 mutex_destroy(&dc
->timer_lock
);
139 static int delay_class_ctr(struct dm_target
*ti
, struct delay_class
*c
, char **argv
)
142 unsigned long long tmpll
;
145 if (sscanf(argv
[1], "%llu%c", &tmpll
, &dummy
) != 1 || tmpll
!= (sector_t
)tmpll
) {
146 ti
->error
= "Invalid device sector";
151 if (sscanf(argv
[2], "%u%c", &c
->delay
, &dummy
) != 1) {
152 ti
->error
= "Invalid delay";
156 ret
= dm_get_device(ti
, argv
[0], dm_table_get_mode(ti
->table
), &c
->dev
);
158 ti
->error
= "Device lookup failed";
166 * Mapping parameters:
167 * <device> <offset> <delay> [<write_device> <write_offset> <write_delay>]
169 * With separate write parameters, the first set is only used for reads.
170 * Offsets are specified in sectors.
171 * Delays are specified in milliseconds.
173 static int delay_ctr(struct dm_target
*ti
, unsigned int argc
, char **argv
)
178 if (argc
!= 3 && argc
!= 6 && argc
!= 9) {
179 ti
->error
= "Requires exactly 3, 6 or 9 arguments";
183 dc
= kzalloc(sizeof(*dc
), GFP_KERNEL
);
185 ti
->error
= "Cannot allocate context";
190 timer_setup(&dc
->delay_timer
, handle_delayed_timer
, 0);
191 INIT_WORK(&dc
->flush_expired_bios
, flush_expired_bios
);
192 INIT_LIST_HEAD(&dc
->delayed_bios
);
193 mutex_init(&dc
->timer_lock
);
194 atomic_set(&dc
->may_delay
, 1);
197 ret
= delay_class_ctr(ti
, &dc
->read
, argv
);
202 ret
= delay_class_ctr(ti
, &dc
->write
, argv
);
205 ret
= delay_class_ctr(ti
, &dc
->flush
, argv
);
211 ret
= delay_class_ctr(ti
, &dc
->write
, argv
+ 3);
215 ret
= delay_class_ctr(ti
, &dc
->flush
, argv
+ 3);
221 ret
= delay_class_ctr(ti
, &dc
->flush
, argv
+ 6);
226 dc
->kdelayd_wq
= alloc_workqueue("kdelayd", WQ_MEM_RECLAIM
, 0);
227 if (!dc
->kdelayd_wq
) {
229 DMERR("Couldn't start kdelayd");
233 ti
->num_flush_bios
= 1;
234 ti
->num_discard_bios
= 1;
235 ti
->per_io_data_size
= sizeof(struct dm_delay_info
);
243 static int delay_bio(struct delay_c
*dc
, struct delay_class
*c
, struct bio
*bio
)
245 struct dm_delay_info
*delayed
;
246 unsigned long expires
= 0;
248 if (!c
->delay
|| !atomic_read(&dc
->may_delay
))
249 return DM_MAPIO_REMAPPED
;
251 delayed
= dm_per_bio_data(bio
, sizeof(struct dm_delay_info
));
253 delayed
->context
= dc
;
254 delayed
->expires
= expires
= jiffies
+ msecs_to_jiffies(c
->delay
);
256 mutex_lock(&delayed_bios_lock
);
258 list_add_tail(&delayed
->list
, &dc
->delayed_bios
);
259 mutex_unlock(&delayed_bios_lock
);
261 queue_timeout(dc
, expires
);
263 return DM_MAPIO_SUBMITTED
;
266 static void delay_presuspend(struct dm_target
*ti
)
268 struct delay_c
*dc
= ti
->private;
270 atomic_set(&dc
->may_delay
, 0);
271 del_timer_sync(&dc
->delay_timer
);
272 flush_bios(flush_delayed_bios(dc
, 1));
275 static void delay_resume(struct dm_target
*ti
)
277 struct delay_c
*dc
= ti
->private;
279 atomic_set(&dc
->may_delay
, 1);
282 static int delay_map(struct dm_target
*ti
, struct bio
*bio
)
284 struct delay_c
*dc
= ti
->private;
285 struct delay_class
*c
;
286 struct dm_delay_info
*delayed
= dm_per_bio_data(bio
, sizeof(struct dm_delay_info
));
288 if (bio_data_dir(bio
) == WRITE
) {
289 if (unlikely(bio
->bi_opf
& REQ_PREFLUSH
))
297 bio_set_dev(bio
, c
->dev
->bdev
);
298 if (bio_sectors(bio
))
299 bio
->bi_iter
.bi_sector
= c
->start
+ dm_target_offset(ti
, bio
->bi_iter
.bi_sector
);
301 return delay_bio(dc
, c
, bio
);
304 #define DMEMIT_DELAY_CLASS(c) \
305 DMEMIT("%s %llu %u", (c)->dev->name, (unsigned long long)(c)->start, (c)->delay)
307 static void delay_status(struct dm_target
*ti
, status_type_t type
,
308 unsigned status_flags
, char *result
, unsigned maxlen
)
310 struct delay_c
*dc
= ti
->private;
314 case STATUSTYPE_INFO
:
315 DMEMIT("%u %u %u", dc
->read
.ops
, dc
->write
.ops
, dc
->flush
.ops
);
318 case STATUSTYPE_TABLE
:
319 DMEMIT_DELAY_CLASS(&dc
->read
);
322 DMEMIT_DELAY_CLASS(&dc
->write
);
326 DMEMIT_DELAY_CLASS(&dc
->flush
);
332 static int delay_iterate_devices(struct dm_target
*ti
,
333 iterate_devices_callout_fn fn
, void *data
)
335 struct delay_c
*dc
= ti
->private;
338 ret
= fn(ti
, dc
->read
.dev
, dc
->read
.start
, ti
->len
, data
);
341 ret
= fn(ti
, dc
->write
.dev
, dc
->write
.start
, ti
->len
, data
);
344 ret
= fn(ti
, dc
->flush
.dev
, dc
->flush
.start
, ti
->len
, data
);
352 static struct target_type delay_target
= {
354 .version
= {1, 2, 1},
355 .features
= DM_TARGET_PASSES_INTEGRITY
,
356 .module
= THIS_MODULE
,
360 .presuspend
= delay_presuspend
,
361 .resume
= delay_resume
,
362 .status
= delay_status
,
363 .iterate_devices
= delay_iterate_devices
,
366 static int __init
dm_delay_init(void)
370 r
= dm_register_target(&delay_target
);
372 DMERR("register failed %d", r
);
382 static void __exit
dm_delay_exit(void)
384 dm_unregister_target(&delay_target
);
388 module_init(dm_delay_init
);
389 module_exit(dm_delay_exit
);
391 MODULE_DESCRIPTION(DM_NAME
" delay target");
392 MODULE_AUTHOR("Heinz Mauelshagen <mauelshagen@redhat.com>");
393 MODULE_LICENSE("GPL");