warning because of race between userspace and add_disk()?

From: Roland Dreier
Date: Tue Jul 05 2011 - 20:14:40 EST


Hi Jens!

I'm seeing the warning below (with 3.0-rc5) when I hot-add a disk.
The system has a JBOD with 4 SAS paths, so we get 4 /dev/sdXX for the
disk (I don't think this is strictly required to trigger this, but I
think it makes the race bigger).

What I _think_ is happening is that add_disk() exposes the /dev/sdXX
device to userspace before it does disk_add_events(), and the
multipath daemon immediately tries to open the device. This means
that blkdev_get() (called from blkdev_open()) races with
disk_add_events() and so the first call to disk_block_events() returns
immediately because of

struct disk_events *ev = disk->ev;
if (!ev)
return;

but then on the way out, disk_unblock_events() finds that disk->ev has
been set and so hits the warning.

I guess the fix would be to be more careful about the order we expose
things when registering disks?

sdcr: unknown partition table
------------[ cut here ]------------
WARNING: at block/genhd.c:1466 __disk_unblock_events+0xf5/0x110()
Modules linked in: kvm_intel kvm serio_raw i7core_edac ioatdma dca
edac_core pci_stub ses enclosure usbhid usb_storage uas hid mpt2sas
qla2xxx ahci libahci e1000e scsi_transport_fc scsi_transport_sas
mlx4_core raid_class scsi_tgt
Pid: 12870, comm: multipath Not tainted 3.0.0-rc5+ #1
Call Trace:
[<ffffffff8104bd9f>] warn_slowpath_common+0x7f/0xc0
[<ffffffff8104bdfa>] warn_slowpath_null+0x1a/0x20
[<ffffffff81241a45>] __disk_unblock_events+0xf5/0x110
[<ffffffff8124302a>] disk_unblock_events+0x1a/0x20
[<ffffffff81179d10>] __blkdev_get+0x1b0/0x430
[<ffffffff8117a2d0>] ? blkdev_get+0x340/0x340
[<ffffffff81179fe3>] blkdev_get+0x53/0x340
[<ffffffff8117a2d0>] ? blkdev_get+0x340/0x340
[<ffffffff8117a335>] blkdev_open+0x65/0x80
[<ffffffff81144f4e>] __dentry_open+0x12e/0x300
[<ffffffff81152dab>] ? do_lookup+0x4b/0x310
[<ffffffff81146321>] nameidata_to_filp+0x71/0x80
[<ffffffff81153f06>] do_last.clone.18+0xb6/0x7f0
[<ffffffff81155864>] path_openat+0xc4/0x3a0
[<ffffffff81154f8b>] ? user_path_at+0x6b/0xb0
[<ffffffff81155b82>] do_filp_open+0x42/0xa0
[<ffffffff81161a2f>] ? alloc_fd+0x4f/0x150
[<ffffffff81146431>] do_sys_open+0x101/0x1e0
[<ffffffff81146530>] sys_open+0x20/0x30
[<ffffffff814e5942>] system_call_fastpath+0x16/0x1b
---[ end trace c6b59cca96c2a3cb ]---
sd 11:0:47:0: [sdcr] Attached SCSI disk
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/