linux/drivers/block
Nikanth Karthikesan f028f3b2f9 loop: fix circular locking in loop_clr_fd()
With CONFIG_PROVE_LOCKING enabled

$ losetup /dev/loop0 file
$ losetup -o 32256 /dev/loop1 /dev/loop0

$ losetup -d /dev/loop1
$ losetup -d /dev/loop0

triggers a [ INFO: possible circular locking dependency detected ]

I think this warning is a false positive.

Open/close on a loop device acquires bd_mutex of the device before
acquiring lo_ctl_mutex of the same device. For ioctl(LOOP_CLR_FD) after
acquiring lo_ctl_mutex, fput on the backing_file might acquire the bd_mutex of
a device, if backing file is a device and this is the last reference to the
file being dropped . But it is guaranteed that it is impossible to have a
circular list of backing devices.(say loop2->loop1->loop0->loop2 is not
possible), which guarantees that this can never deadlock.

So this warning should be suppressed. It is very difficult to annotate lockdep
not to warn here in the correct way. A simple way to silence lockdep could be
to mark the lo_ctl_mutex in ioctl to be a sub class, but this might mask some
other real bugs.

@@ -1164,7 +1164,7 @@ static int lo_ioctl(struct block_device *bdev, fmode_t mode,
 	struct loop_device *lo = bdev->bd_disk->private_data;
 	int err;

-	mutex_lock(&lo->lo_ctl_mutex);
+	mutex_lock_nested(&lo->lo_ctl_mutex, 1);
 	switch (cmd) {
 	case LOOP_SET_FD:
 		err = loop_set_fd(lo, mode, bdev, arg);

Or actually marking the bd_mutex after lo_ctl_mutex as a sub class could be
a better solution.

Luckily it is easy to avoid calling fput on backing file with lo_ctl_mutex
held, so no lockdep annotation is required.

If you do not like the special handling of the lo_ctl_mutex just for the
LOOP_CLR_FD ioctl in lo_ioctl(), the mutex handling could be moved inside
each of the individual ioctl handlers and I could send you another patch.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
2009-03-26 11:01:19 +01:00
..
aoe aoe: error printed 1 too early 2009-03-04 00:11:52 -08:00
paride paride/pg.c: xs(): &&/|| confusion 2009-02-18 10:32:01 +01:00
amiflop.c m68k: amiflop - Get rid of sleep_on calls 2009-01-12 20:56:33 +01:00
ataflop.c m68k: atari - Rename "mfp" to "st_mfp" 2009-02-22 09:23:02 -08:00
brd.c [PATCH] switch brd 2008-10-21 07:47:44 -04:00
cciss_cmd.h cciss: switch to using hlist for command list management 2008-12-29 08:28:43 +01:00
cciss_scsi.c cciss: Fix cciss SCSI rescan code to better notice device changes 2008-10-09 08:56:18 +02:00
cciss_scsi.h cciss: Fix cciss SCSI rescan code to better notice device changes 2008-10-09 08:56:18 +02:00
cciss.c cciss: add BUILD_BUG_ON() for catching bad CommandList_struct alignment 2009-03-24 12:35:16 +01:00
cciss.h cciss: switch to using hlist for command list management 2008-12-29 08:28:43 +01:00
cpqarray.c cpqarray: enable bus mastering 2009-03-24 12:35:17 +01:00
cpqarray.h
cryptoloop.c drivers: Remove unnecessary inclusions of asm/semaphore.h 2008-04-18 22:16:32 -04:00
DAC960.c [PATCH] switch DAC960 2008-10-21 07:47:36 -04:00
DAC960.h Fix DAC960 driver on machines which don't support 64-bit DMA 2007-09-11 17:21:19 -07:00
floppy.c floppy: request and release only the ports we actually use 2009-02-18 15:37:55 -08:00
hd.c hd: WIN_* -> ATA_CMD_* 2008-10-10 22:39:21 +02:00
ida_cmd.h
ida_ioctl.h
Kconfig Create/use more directory structure in the Documentation/ tree. 2008-11-14 17:28:53 +00:00
loop.c loop: fix circular locking in loop_clr_fd() 2009-03-26 11:01:19 +01:00
Makefile ps3/block: Replace mtd/ps3vram by block/ps3vram 2009-03-13 16:07:19 +11:00
nbd.c nbd: fix I/O hang on disconnected nbds 2009-02-11 14:25:37 -08:00
pktcdvd.c pktcdvd: remove broken dev_t export of class devices 2008-12-10 10:03:32 -08:00
ps3disk.c powerpc/ps3: Printing fixups for l64 to ll64 conversion drivers/block 2009-01-16 16:15:13 +11:00
ps3vram.c ps3/block: Replace mtd/ps3vram by block/ps3vram 2009-03-13 16:07:19 +11:00
smart1,2.h
sunvdc.c sparc64: Fix unsigned long long warnings in drivers. 2009-01-06 13:20:38 -08:00
swim3.c [PATCH] switch swim3 2008-10-21 07:48:03 -04:00
sx8.c block: replace remaining __FUNCTION__ occurrences 2008-04-21 09:51:04 +02:00
ub.c USB: change interface to usb_lock_device_for_reset() 2009-01-07 09:59:52 -08:00
umem.c Cleanup umem driver: fix most checkpatch warnings, conform to kernel 2007-12-18 08:29:28 +01:00
umem.h drivers/block/umem: trim trailing whitespace 2007-10-10 09:25:59 +02:00
viodasd.c [PATCH] switch viodasd 2008-10-21 07:48:07 -04:00
virtio_blk.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus 2008-12-30 17:37:25 -08:00
xd.c [PATCH] switch xd 2008-10-21 07:48:11 -04:00
xd.h [PATCH] switch xd 2008-10-21 07:48:11 -04:00
xen-blkfront.c Fix kernel NULL pointer dereference in xen-blkfront 2009-03-05 12:04:57 +01:00
xsysace.c Fix Xilinx SystemACE driver to handle empty CF slot 2009-03-14 21:06:52 +01:00
z2ram.c [PATCH] switch z2ram 2008-10-21 07:48:17 -04:00