Commit f893366
block: loop: don't hold lo_ctl_mutex in lo_open
The lo_ctl_mutex is held for running all ioctl handlers, and
in some ioctl handlers, ioctl_by_bdev(BLKRRPART) is called for
rereading partitions, which requires bd_mutex.
So it is easy to cause failure because trylock(bd_mutex) may
fail inside blkdev_reread_part(), and follows the lock context:
blkid or other application:
->open()
->mutex_lock(bd_mutex)
->lo_open()
->mutex_lock(lo_ctl_mutex)
losetup(set fd ioctl):
->mutex_lock(lo_ctl_mutex)
->ioctl_by_bdev(BLKRRPART)
->trylock(bd_mutex)
This patch trys to eliminate the ABBA lock dependency by removing
lo_ctl_mutext in lo_open() with the following approach:
1) make lo_refcnt as atomic_t and avoid acquiring lo_ctl_mutex in lo_open():
- for open vs. add/del loop, no any problem because of loop_index_mutex
- freeze request queue during clr_fd, so I/O can't come until
clearing fd is completed, like the effect of holding lo_ctl_mutex
in lo_open
- both open() and release() have been serialized by bd_mutex already
2) don't hold lo_ctl_mutex for decreasing/checking lo_refcnt in
lo_release(), then lo_ctl_mutex is only required for the last release.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Tested-by: Jarod Wilson <jarod@redhat.com>
Acked-by: Jarod Wilson <jarod@redhat.com>
Signed-off-by: Ming Lei <ming.lei@canonical.com>
Signed-off-by: Jens Axboe <axboe@fb.com>1 parent b816d45 commit f893366
2 files changed
Lines changed: 13 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
831 | 831 | | |
832 | 832 | | |
833 | 833 | | |
834 | | - | |
| 834 | + | |
835 | 835 | | |
836 | 836 | | |
837 | 837 | | |
| |||
840 | 840 | | |
841 | 841 | | |
842 | 842 | | |
| 843 | + | |
| 844 | + | |
| 845 | + | |
843 | 846 | | |
844 | 847 | | |
845 | 848 | | |
| |||
871 | 874 | | |
872 | 875 | | |
873 | 876 | | |
| 877 | + | |
| 878 | + | |
874 | 879 | | |
875 | 880 | | |
876 | 881 | | |
| |||
1330 | 1335 | | |
1331 | 1336 | | |
1332 | 1337 | | |
1333 | | - | |
1334 | | - | |
1335 | | - | |
| 1338 | + | |
1336 | 1339 | | |
1337 | 1340 | | |
1338 | 1341 | | |
| |||
1343 | 1346 | | |
1344 | 1347 | | |
1345 | 1348 | | |
1346 | | - | |
1347 | | - | |
1348 | | - | |
1349 | | - | |
| 1349 | + | |
| 1350 | + | |
1350 | 1351 | | |
| 1352 | + | |
1351 | 1353 | | |
1352 | 1354 | | |
1353 | 1355 | | |
| |||
1601 | 1603 | | |
1602 | 1604 | | |
1603 | 1605 | | |
| 1606 | + | |
1604 | 1607 | | |
1605 | 1608 | | |
1606 | 1609 | | |
| |||
1718 | 1721 | | |
1719 | 1722 | | |
1720 | 1723 | | |
1721 | | - | |
| 1724 | + | |
1722 | 1725 | | |
1723 | 1726 | | |
1724 | 1727 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
31 | | - | |
| 31 | + | |
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
| |||
0 commit comments