Lines Matching refs:dc
49 struct delay_c *dc = (struct delay_c *)data; in handle_delayed_timer() local
51 queue_work(dc->kdelayd_wq, &dc->flush_expired_bios); in handle_delayed_timer()
54 static void queue_timeout(struct delay_c *dc, unsigned long expires) in queue_timeout() argument
56 mutex_lock(&dc->timer_lock); in queue_timeout()
58 if (!timer_pending(&dc->delay_timer) || expires < dc->delay_timer.expires) in queue_timeout()
59 mod_timer(&dc->delay_timer, expires); in queue_timeout()
61 mutex_unlock(&dc->timer_lock); in queue_timeout()
76 static struct bio *flush_delayed_bios(struct delay_c *dc, int flush_all) in flush_delayed_bios() argument
84 list_for_each_entry_safe(delayed, next, &dc->delayed_bios, list) { in flush_delayed_bios()
107 queue_timeout(dc, next_expires); in flush_delayed_bios()
114 struct delay_c *dc; in flush_expired_bios() local
116 dc = container_of(work, struct delay_c, flush_expired_bios); in flush_expired_bios()
117 flush_bios(flush_delayed_bios(dc, 0)); in flush_expired_bios()
129 struct delay_c *dc; in delay_ctr() local
138 dc = kmalloc(sizeof(*dc), GFP_KERNEL); in delay_ctr()
139 if (!dc) { in delay_ctr()
144 dc->reads = dc->writes = 0; in delay_ctr()
150 dc->start_read = tmpll; in delay_ctr()
152 if (sscanf(argv[2], "%u%c", &dc->read_delay, &dummy) != 1) { in delay_ctr()
158 &dc->dev_read)) { in delay_ctr()
163 dc->dev_write = NULL; in delay_ctr()
171 dc->start_write = tmpll; in delay_ctr()
173 if (sscanf(argv[5], "%u%c", &dc->write_delay, &dummy) != 1) { in delay_ctr()
179 &dc->dev_write)) { in delay_ctr()
185 dc->kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0); in delay_ctr()
186 if (!dc->kdelayd_wq) { in delay_ctr()
191 setup_timer(&dc->delay_timer, handle_delayed_timer, (unsigned long)dc); in delay_ctr()
193 INIT_WORK(&dc->flush_expired_bios, flush_expired_bios); in delay_ctr()
194 INIT_LIST_HEAD(&dc->delayed_bios); in delay_ctr()
195 mutex_init(&dc->timer_lock); in delay_ctr()
196 atomic_set(&dc->may_delay, 1); in delay_ctr()
201 ti->private = dc; in delay_ctr()
205 if (dc->dev_write) in delay_ctr()
206 dm_put_device(ti, dc->dev_write); in delay_ctr()
208 dm_put_device(ti, dc->dev_read); in delay_ctr()
210 kfree(dc); in delay_ctr()
216 struct delay_c *dc = ti->private; in delay_dtr() local
218 destroy_workqueue(dc->kdelayd_wq); in delay_dtr()
220 dm_put_device(ti, dc->dev_read); in delay_dtr()
222 if (dc->dev_write) in delay_dtr()
223 dm_put_device(ti, dc->dev_write); in delay_dtr()
225 kfree(dc); in delay_dtr()
228 static int delay_bio(struct delay_c *dc, int delay, struct bio *bio) in delay_bio() argument
233 if (!delay || !atomic_read(&dc->may_delay)) in delay_bio()
238 delayed->context = dc; in delay_bio()
244 dc->writes++; in delay_bio()
246 dc->reads++; in delay_bio()
248 list_add_tail(&delayed->list, &dc->delayed_bios); in delay_bio()
252 queue_timeout(dc, expires); in delay_bio()
259 struct delay_c *dc = ti->private; in delay_presuspend() local
261 atomic_set(&dc->may_delay, 0); in delay_presuspend()
262 del_timer_sync(&dc->delay_timer); in delay_presuspend()
263 flush_bios(flush_delayed_bios(dc, 1)); in delay_presuspend()
268 struct delay_c *dc = ti->private; in delay_resume() local
270 atomic_set(&dc->may_delay, 1); in delay_resume()
275 struct delay_c *dc = ti->private; in delay_map() local
277 if ((bio_data_dir(bio) == WRITE) && (dc->dev_write)) { in delay_map()
278 bio->bi_bdev = dc->dev_write->bdev; in delay_map()
280 bio->bi_iter.bi_sector = dc->start_write + in delay_map()
283 return delay_bio(dc, dc->write_delay, bio); in delay_map()
286 bio->bi_bdev = dc->dev_read->bdev; in delay_map()
287 bio->bi_iter.bi_sector = dc->start_read + in delay_map()
290 return delay_bio(dc, dc->read_delay, bio); in delay_map()
296 struct delay_c *dc = ti->private; in delay_status() local
301 DMEMIT("%u %u", dc->reads, dc->writes); in delay_status()
305 DMEMIT("%s %llu %u", dc->dev_read->name, in delay_status()
306 (unsigned long long) dc->start_read, in delay_status()
307 dc->read_delay); in delay_status()
308 if (dc->dev_write) in delay_status()
309 DMEMIT(" %s %llu %u", dc->dev_write->name, in delay_status()
310 (unsigned long long) dc->start_write, in delay_status()
311 dc->write_delay); in delay_status()
319 struct delay_c *dc = ti->private; in delay_iterate_devices() local
322 ret = fn(ti, dc->dev_read, dc->start_read, ti->len, data); in delay_iterate_devices()
326 if (dc->dev_write) in delay_iterate_devices()
327 ret = fn(ti, dc->dev_write, dc->start_write, ti->len, data); in delay_iterate_devices()