diff options
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/bcache/super.c | 3 | ||||
-rw-r--r-- | drivers/md/bcache/writeback.c | 14 | ||||
-rw-r--r-- | drivers/md/bcache/writeback.h | 3 |
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 | ||
481 | int bch_cached_dev_writeback_init(struct cached_dev *dc) | 481 | void 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 | |||
500 | int 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) | |||
85 | void bcache_dev_sectors_dirty_add(struct cache_set *, unsigned, uint64_t, int); | 85 | void bcache_dev_sectors_dirty_add(struct cache_set *, unsigned, uint64_t, int); |
86 | 86 | ||
87 | void bch_sectors_dirty_init(struct cached_dev *dc); | 87 | void bch_sectors_dirty_init(struct cached_dev *dc); |
88 | int bch_cached_dev_writeback_init(struct cached_dev *); | 88 | void bch_cached_dev_writeback_init(struct cached_dev *); |
89 | int bch_cached_dev_writeback_start(struct cached_dev *); | ||
89 | 90 | ||
90 | #endif | 91 | #endif |