]> git.baikalelectronics.ru Git - kernel.git/commit
loop: reintroduce global lock for safe loop_validate_file() traversal
authorTetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Tue, 6 Jul 2021 14:40:34 +0000 (23:40 +0900)
committerJens Axboe <axboe@kernel.dk>
Fri, 23 Jul 2021 16:18:25 +0000 (10:18 -0600)
commitdcc1a4639299e5b72be43c5241fd305dbb90e8e0
treefc2ed8f0a332beb2ece07dee8947808823dfb8cb
parentd3cc884a651b1c0a35579d54fda919d5556a9cb5
loop: reintroduce global lock for safe loop_validate_file() traversal

Commit 76cd721e811be086 ("loop: scale loop device by introducing per
device lock") re-opened a race window for NULL pointer dereference at
loop_validate_file() where commit f78957d8d6e487f1 ("block/loop: Use
global lock for ioctl() operation.") has closed.

Although we need to guarantee that other loop devices will not change
during traversal, we can't take remote "struct loop_device"->lo_mutex
inside loop_validate_file() in order to avoid AB-BA deadlock. Therefore,
introduce a global lock dedicated for loop_validate_file() which is
conditionally taken before local "struct loop_device"->lo_mutex is taken.

Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Fixes: 76cd721e811be086 ("loop: scale loop device by introducing per device lock")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/loop.c