Commit dabb4433 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcache: Fix a shutdown bug



Shutdown wasn't cancelling/waiting on journal_write_work()

Signed-off-by: default avatarKent Overstreet <kmo@daterainc.com>
parent 1b4eaf3d
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -536,6 +536,7 @@ void bch_journal_next(struct journal *j)
	atomic_set(&fifo_back(&j->pin), 1);

	j->cur->data->seq	= ++j->seq;
	j->cur->dirty		= false;
	j->cur->need_write	= false;
	j->cur->data->keys	= 0;

@@ -731,7 +732,10 @@ static void journal_write_work(struct work_struct *work)
					   struct cache_set,
					   journal.work);
	spin_lock(&c->journal.lock);
	if (c->journal.cur->dirty)
		journal_try_write(c);
	else
		spin_unlock(&c->journal.lock);
}

/*
@@ -761,7 +765,8 @@ atomic_t *bch_journal(struct cache_set *c,
	if (parent) {
		closure_wait(&w->wait, parent);
		journal_try_write(c);
	} else if (!w->need_write) {
	} else if (!w->dirty) {
		w->dirty = true;
		schedule_delayed_work(&c->journal.work,
				      msecs_to_jiffies(c->journal_delay_ms));
		spin_unlock(&c->journal.lock);
+1 −0
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ struct journal_write {

	struct cache_set	*c;
	struct closure_waitlist	wait;
	bool			dirty;
	bool			need_write;
};

+4 −0
Original line number Diff line number Diff line
@@ -1403,6 +1403,10 @@ static void cache_set_flush(struct closure *cl)
		if (ca->alloc_thread)
			kthread_stop(ca->alloc_thread);

	cancel_delayed_work_sync(&c->journal.work);
	/* flush last journal entry if needed */
	c->journal.work.work.func(&c->journal.work.work);

	closure_return(cl);
}