linux_dsm_epyc7002/drivers/md/bcache
Zhiqiang Liu be23e83733 bcache: fix potential deadlock problem in btree_gc_coalesce
coccicheck reports:
  drivers/md//bcache/btree.c:1538:1-7: preceding lock on line 1417

In btree_gc_coalesce func, if the coalescing process fails, we will goto
to out_nocoalesce tag directly without releasing new_nodes[i]->write_lock.
Then, it will cause a deadlock when trying to acquire new_nodes[i]->
write_lock for freeing new_nodes[i] before return.

btree_gc_coalesce func details as follows:
	if alloc new_nodes[i] fails:
		goto out_nocoalesce;
	// obtain new_nodes[i]->write_lock
	mutex_lock(&new_nodes[i]->write_lock)
	// main coalescing process
	for (i = nodes - 1; i > 0; --i)
		[snipped]
		if coalescing process fails:
			// Here, directly goto out_nocoalesce
			 // tag will cause a deadlock
			goto out_nocoalesce;
		[snipped]
	// release new_nodes[i]->write_lock
	mutex_unlock(&new_nodes[i]->write_lock)
	// coalesing succ, return
	return;
out_nocoalesce:
	btree_node_free(new_nodes[i])	// free new_nodes[i]
	// obtain new_nodes[i]->write_lock
	mutex_lock(&new_nodes[i]->write_lock);
	// set flag for reuse
	clear_bit(BTREE_NODE_dirty, &ew_nodes[i]->flags);
	// release new_nodes[i]->write_lock
	mutex_unlock(&new_nodes[i]->write_lock);

To fix the problem, we add a new tag 'out_unlock_nocoalesce' for
releasing new_nodes[i]->write_lock before out_nocoalesce tag. If
coalescing process fails, we will go to out_unlock_nocoalesce tag
for releasing new_nodes[i]->write_lock before free new_nodes[i] in
out_nocoalesce tag.

(Coly Li helps to clean up commit log format.)

Fixes: 2a285686c1 ("bcache: btree locking rework")
Signed-off-by: Zhiqiang Liu <liuzhiqiang26@huawei.com>
Signed-off-by: Coly Li <colyli@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2020-06-14 16:47:56 -06:00
..
alloc.c Revert "bcache: ignore pending signals when creating gc and allocator thread" 2020-03-02 20:01:32 -07:00
bcache.h bcache: Convert pr_<level> uses to a more typical style 2020-05-27 05:19:36 -06:00
bset.c bcache: Convert pr_<level> uses to a more typical style 2020-05-27 05:19:36 -06:00
bset.h bcache: explicity type cast in bset_bkey_last() 2020-02-01 07:55:39 -07:00
btree.c bcache: fix potential deadlock problem in btree_gc_coalesce 2020-06-14 16:47:56 -06:00
btree.h bcache: remove dupplicated declaration from btree.h 2020-03-24 19:56:42 -06:00
closure.c
closure.h
debug.c
debug.h
extents.c bcache: Convert pr_<level> uses to a more typical style 2020-05-27 05:19:36 -06:00
extents.h
io.c bcache: Convert pr_<level> uses to a more typical style 2020-05-27 05:19:36 -06:00
journal.c bcache: Convert pr_<level> uses to a more typical style 2020-05-27 05:19:36 -06:00
journal.h
Kconfig bcache: configure the asynchronous registertion to be experimental 2020-05-27 05:19:36 -06:00
Makefile
movinggc.c
request.c for-5.8/drivers-2020-06-01 2020-06-02 15:37:03 -07:00
request.h bcache: pass the make_request methods to blk_queue_make_request 2020-03-27 10:23:43 -06:00
stats.c bcache: fix memory corruption in bch_cache_accounting_clear() 2020-02-01 07:55:39 -07:00
stats.h
super.c bcache: configure the asynchronous registertion to be experimental 2020-05-27 05:19:36 -06:00
sysfs.c bcache: Convert pr_<level> uses to a more typical style 2020-05-27 05:19:36 -06:00
sysfs.h
trace.c
util.c
util.h
writeback.c bcache: Convert pr_<level> uses to a more typical style 2020-05-27 05:19:36 -06:00
writeback.h bcache: make bch_sectors_dirty_init() to be multithreaded 2020-03-22 10:06:57 -06:00