linux-brain/drivers/lightnvm
Jia-Ju Bai 47f2932860 lightnvm: pblk: fix two sleep-in-atomic-context bugs
[ Upstream commit 7325b4bbe5 ]

The driver may sleep with holding a spinlock.

The function call paths (from bottom to top) in Linux-4.16 are:

[FUNC] nvm_dev_dma_alloc(GFP_KERNEL)
drivers/lightnvm/pblk-core.c, 754:
	nvm_dev_dma_alloc in pblk_line_submit_smeta_io
drivers/lightnvm/pblk-core.c, 1048:
	pblk_line_submit_smeta_io in pblk_line_init_bb
drivers/lightnvm/pblk-core.c, 1434:
	pblk_line_init_bb in pblk_line_replace_data
drivers/lightnvm/pblk-recovery.c, 980:
	pblk_line_replace_data in pblk_recov_l2p
drivers/lightnvm/pblk-recovery.c, 976:
	spin_lock in pblk_recov_l2p

[FUNC] bio_map_kern(GFP_KERNEL)
drivers/lightnvm/pblk-core.c, 762:
	bio_map_kern in pblk_line_submit_smeta_io
drivers/lightnvm/pblk-core.c, 1048:
	pblk_line_submit_smeta_io in pblk_line_init_bb
drivers/lightnvm/pblk-core.c, 1434:
	pblk_line_init_bb in pblk_line_replace_data
drivers/lightnvm/pblk-recovery.c, 980:
	pblk_line_replace_data in pblk_recov_l2p
drivers/lightnvm/pblk-recovery.c, 976:
	spin_lock in pblk_recov_l2p

To fix these bugs, the call to pblk_line_replace_data()
is moved out of the spinlock protection.

These bugs are found by my static analysis tool DSAC.

Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
Reviewed-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Matias Bjørling <mb@lightnvm.io>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-11-13 11:14:52 -08:00
..
core.c lightnvm: if LUNs are already allocated fix return 2017-06-27 08:22:09 -06:00
Kconfig lightnvm: physical block device (pblk) target 2017-04-16 10:06:33 -06:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pblk-cache.c lightnvm: pblk: fail gracefully on irrec. error 2017-06-26 16:27:39 -06:00
pblk-core.c lightnvm: pblk: free padded entries in write buffer 2018-09-15 09:45:35 +02:00
pblk-gc.c lightnvm: pblk: prevent gc kicks when gc is not operational 2017-12-20 10:10:37 +01:00
pblk-init.c lightnvm: pblk: fix min size for page mempool 2017-12-20 10:10:37 +01:00
pblk-map.c lightnvm: pblk: fix bad le64 assignations 2017-06-30 11:08:18 -06:00
pblk-rb.c lightnvm: pblk: warn in case of corrupted write buffer 2018-08-03 07:50:25 +02:00
pblk-read.c lightnvm: pblk: fix min size for page mempool 2017-12-20 10:10:37 +01:00
pblk-recovery.c lightnvm: pblk: fix two sleep-in-atomic-context bugs 2018-11-13 11:14:52 -08:00
pblk-rl.c lightnvm: pblk: fail gracefully on irrec. error 2017-06-26 16:27:39 -06:00
pblk-sysfs.c lightnvm: pblk: remove unused return variable 2017-06-30 11:08:18 -06:00
pblk-write.c lightnvm: pblk: free padded entries in write buffer 2018-09-15 09:45:35 +02:00
pblk.h lightnvm: pblk: fix min size for page mempool 2017-12-20 10:10:37 +01:00
rrpc.c blk: remove bio_set arg from blk_queue_split() 2017-06-18 12:40:59 -06:00
rrpc.h lightnvm: use end_io callback instead of instance 2017-01-31 08:32:13 -07:00