aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/bcache/super.c3
-rw-r--r--drivers/md/bcache/writeback.c14
-rw-r--r--drivers/md/bcache/writeback.h3
3 files changed, 15 insertions, 5 deletions
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
index 3b043a04d9bd..00cc42550f34 100644
--- a/drivers/md/bcache/super.c
+++ b/drivers/md/bcache/super.c
@@ -1042,6 +1042,9 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c)
1042 */ 1042 */
1043 atomic_set(&dc->count, 1); 1043 atomic_set(&dc->count, 1);
1044 1044
1045 if (bch_cached_dev_writeback_start(dc))
1046 return -ENOMEM;
1047
1045 if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) { 1048 if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) {
1046 bch_sectors_dirty_init(dc); 1049 bch_sectors_dirty_init(dc);
1047 atomic_set(&dc->has_dirty, 1); 1050 atomic_set(&dc->has_dirty, 1);
diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c
index f4300e4c0114..f1986bcd1bf0 100644
--- a/drivers/md/bcache/writeback.c
+++ b/drivers/md/bcache/writeback.c
@@ -239,7 +239,7 @@ static void read_dirty(struct cached_dev *dc)
239 if (KEY_START(&w->key) != dc->last_read || 239 if (KEY_START(&w->key) != dc->last_read ||
240 jiffies_to_msecs(delay) > 50) 240 jiffies_to_msecs(delay) > 50)
241 while (!kthread_should_stop() && delay) 241 while (!kthread_should_stop() && delay)
242 delay = schedule_timeout_uninterruptible(delay); 242 delay = schedule_timeout_interruptible(delay);
243 243
244 dc->last_read = KEY_OFFSET(&w->key); 244 dc->last_read = KEY_OFFSET(&w->key);
245 245
@@ -436,7 +436,7 @@ static int bch_writeback_thread(void *arg)
436 while (delay && 436 while (delay &&
437 !kthread_should_stop() && 437 !kthread_should_stop() &&
438 !test_bit(BCACHE_DEV_DETACHING, &dc->disk.flags)) 438 !test_bit(BCACHE_DEV_DETACHING, &dc->disk.flags))
439 delay = schedule_timeout_uninterruptible(delay); 439 delay = schedule_timeout_interruptible(delay);
440 } 440 }
441 } 441 }
442 442
@@ -478,7 +478,7 @@ void bch_sectors_dirty_init(struct cached_dev *dc)
478 dc->disk.sectors_dirty_last = bcache_dev_sectors_dirty(&dc->disk); 478 dc->disk.sectors_dirty_last = bcache_dev_sectors_dirty(&dc->disk);
479} 479}
480 480
481int bch_cached_dev_writeback_init(struct cached_dev *dc) 481void bch_cached_dev_writeback_init(struct cached_dev *dc)
482{ 482{
483 sema_init(&dc->in_flight, 64); 483 sema_init(&dc->in_flight, 64);
484 init_rwsem(&dc->writeback_lock); 484 init_rwsem(&dc->writeback_lock);
@@ -494,14 +494,20 @@ int bch_cached_dev_writeback_init(struct cached_dev *dc)
494 dc->writeback_rate_d_term = 30; 494 dc->writeback_rate_d_term = 30;
495 dc->writeback_rate_p_term_inverse = 6000; 495 dc->writeback_rate_p_term_inverse = 6000;
496 496
497 INIT_DELAYED_WORK(&dc->writeback_rate_update, update_writeback_rate);
498}
499
500int bch_cached_dev_writeback_start(struct cached_dev *dc)
501{
497 dc->writeback_thread = kthread_create(bch_writeback_thread, dc, 502 dc->writeback_thread = kthread_create(bch_writeback_thread, dc,
498 "bcache_writeback"); 503 "bcache_writeback");
499 if (IS_ERR(dc->writeback_thread)) 504 if (IS_ERR(dc->writeback_thread))
500 return PTR_ERR(dc->writeback_thread); 505 return PTR_ERR(dc->writeback_thread);
501 506
502 INIT_DELAYED_WORK(&dc->writeback_rate_update, update_writeback_rate);
503 schedule_delayed_work(&dc->writeback_rate_update, 507 schedule_delayed_work(&dc->writeback_rate_update,
504 dc->writeback_rate_update_seconds * HZ); 508 dc->writeback_rate_update_seconds * HZ);
505 509
510 bch_writeback_queue(dc);
511
506 return 0; 512 return 0;
507} 513}
diff --git a/drivers/md/bcache/writeback.h b/drivers/md/bcache/writeback.h
index e2f8598937ac..0a9dab187b79 100644
--- a/drivers/md/bcache/writeback.h
+++ b/drivers/md/bcache/writeback.h
@@ -85,6 +85,7 @@ static inline void bch_writeback_add(struct cached_dev *dc)
85void bcache_dev_sectors_dirty_add(struct cache_set *, unsigned, uint64_t, int); 85void bcache_dev_sectors_dirty_add(struct cache_set *, unsigned, uint64_t, int);
86 86
87void bch_sectors_dirty_init(struct cached_dev *dc); 87void bch_sectors_dirty_init(struct cached_dev *dc);
88int bch_cached_dev_writeback_init(struct cached_dev *); 88void bch_cached_dev_writeback_init(struct cached_dev *);
89int bch_cached_dev_writeback_start(struct cached_dev *);
89 90
90#endif 91#endif