Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcache: Fix a shutdown bug

Shutdown wasn't cancelling/waiting on journal_write_work()

Signed-off-by: Kent Overstreet <kmo@daterainc.com>

+12 -2
+7 -2
drivers/md/bcache/journal.c
··· 536 536 atomic_set(&fifo_back(&j->pin), 1); 537 537 538 538 j->cur->data->seq = ++j->seq; 539 + j->cur->dirty = false; 539 540 j->cur->need_write = false; 540 541 j->cur->data->keys = 0; 541 542 ··· 732 731 struct cache_set, 733 732 journal.work); 734 733 spin_lock(&c->journal.lock); 735 - journal_try_write(c); 734 + if (c->journal.cur->dirty) 735 + journal_try_write(c); 736 + else 737 + spin_unlock(&c->journal.lock); 736 738 } 737 739 738 740 /* ··· 765 761 if (parent) { 766 762 closure_wait(&w->wait, parent); 767 763 journal_try_write(c); 768 - } else if (!w->need_write) { 764 + } else if (!w->dirty) { 765 + w->dirty = true; 769 766 schedule_delayed_work(&c->journal.work, 770 767 msecs_to_jiffies(c->journal_delay_ms)); 771 768 spin_unlock(&c->journal.lock);
+1
drivers/md/bcache/journal.h
··· 95 95 96 96 struct cache_set *c; 97 97 struct closure_waitlist wait; 98 + bool dirty; 98 99 bool need_write; 99 100 }; 100 101
+4
drivers/md/bcache/super.c
··· 1403 1403 if (ca->alloc_thread) 1404 1404 kthread_stop(ca->alloc_thread); 1405 1405 1406 + cancel_delayed_work_sync(&c->journal.work); 1407 + /* flush last journal entry if needed */ 1408 + c->journal.work.work.func(&c->journal.work.work); 1409 + 1406 1410 closure_return(cl); 1407 1411 } 1408 1412