From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Rabin Vincent <rabinv@axis.com>,
Jan Kara <jack@suse.cz>, Christoph Hellwig <hch@lst.de>,
Jens Axboe <axboe@fb.com>
Subject: [PATCH 4.4 25/58] block: protect iterate_bdevs() against concurrent close
Date: Fri, 6 Jan 2017 22:44:10 +0100 [thread overview]
Message-ID: <20170106213907.609539445@linuxfoundation.org> (raw)
In-Reply-To: <20170106213906.290654840@linuxfoundation.org>
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rabin Vincent <rabinv@axis.com>
commit af309226db916e2c6e08d3eba3fa5c34225200c4 upstream.
If a block device is closed while iterate_bdevs() is handling it, the
following NULL pointer dereference occurs because bdev->b_disk is NULL
in bdev_get_queue(), which is called from blk_get_backing_dev_info() (in
turn called by the mapping_cap_writeback_dirty() call in
__filemap_fdatawrite_range()):
BUG: unable to handle kernel NULL pointer dereference at 0000000000000508
IP: [<ffffffff81314790>] blk_get_backing_dev_info+0x10/0x20
PGD 9e62067 PUD 9ee8067 PMD 0
Oops: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
Modules linked in:
CPU: 1 PID: 2422 Comm: sync Not tainted 4.5.0-rc7+ #400
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996)
task: ffff880009f4d700 ti: ffff880009f5c000 task.ti: ffff880009f5c000
RIP: 0010:[<ffffffff81314790>] [<ffffffff81314790>] blk_get_backing_dev_info+0x10/0x20
RSP: 0018:ffff880009f5fe68 EFLAGS: 00010246
RAX: 0000000000000000 RBX: ffff88000ec17a38 RCX: ffffffff81a4e940
RDX: 7fffffffffffffff RSI: 0000000000000000 RDI: ffff88000ec176c0
RBP: ffff880009f5fe68 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000001 R11: 0000000000000000 R12: ffff88000ec17860
R13: ffffffff811b25c0 R14: ffff88000ec178e0 R15: ffff88000ec17a38
FS: 00007faee505d700(0000) GS:ffff88000fb00000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: 0000000000000508 CR3: 0000000009e8a000 CR4: 00000000000006e0
Stack:
ffff880009f5feb8 ffffffff8112e7f5 0000000000000000 7fffffffffffffff
0000000000000000 0000000000000000 7fffffffffffffff 0000000000000001
ffff88000ec178e0 ffff88000ec17860 ffff880009f5fec8 ffffffff8112e81f
Call Trace:
[<ffffffff8112e7f5>] __filemap_fdatawrite_range+0x85/0x90
[<ffffffff8112e81f>] filemap_fdatawrite+0x1f/0x30
[<ffffffff811b25d6>] fdatawrite_one_bdev+0x16/0x20
[<ffffffff811bc402>] iterate_bdevs+0xf2/0x130
[<ffffffff811b2763>] sys_sync+0x63/0x90
[<ffffffff815d4272>] entry_SYSCALL_64_fastpath+0x12/0x76
Code: 0f 1f 44 00 00 48 8b 87 f0 00 00 00 55 48 89 e5 <48> 8b 80 08 05 00 00 5d
RIP [<ffffffff81314790>] blk_get_backing_dev_info+0x10/0x20
RSP <ffff880009f5fe68>
CR2: 0000000000000508
---[ end trace 2487336ceb3de62d ]---
The crash is easily reproducible by running the following command, if an
msleep(100) is inserted before the call to func() in iterate_devs():
while :; do head -c1 /dev/nullb0; done > /dev/null & while :; do sync; done
Fix it by holding the bd_mutex across the func() call and only calling
func() if the bdev is opened.
Fixes: 5c0d6b60a0ba ("vfs: Create function for iterating over block devices")
Reported-and-tested-by: Wei Fang <fangwei1@huawei.com>
Signed-off-by: Rabin Vincent <rabinv@axis.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
fs/block_dev.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1806,6 +1806,7 @@ void iterate_bdevs(void (*func)(struct b
spin_lock(&blockdev_superblock->s_inode_list_lock);
list_for_each_entry(inode, &blockdev_superblock->s_inodes, i_sb_list) {
struct address_space *mapping = inode->i_mapping;
+ struct block_device *bdev;
spin_lock(&inode->i_lock);
if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW) ||
@@ -1826,8 +1827,12 @@ void iterate_bdevs(void (*func)(struct b
*/
iput(old_inode);
old_inode = inode;
+ bdev = I_BDEV(inode);
- func(I_BDEV(inode), arg);
+ mutex_lock(&bdev->bd_mutex);
+ if (bdev->bd_openers)
+ func(bdev, arg);
+ mutex_unlock(&bdev->bd_mutex);
spin_lock(&blockdev_superblock->s_inode_list_lock);
}
next prev parent reply other threads:[~2017-01-06 22:07 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20170106220400epcas3p1efbe4d9a81e843002529bd6fc2826260@epcas3p1.samsung.com>
2017-01-06 21:43 ` [PATCH 4.4 00/58] 4.4.41-stable review Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 01/58] ssb: Fix error routine when fallback SPROM fails Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 02/58] rtlwifi: Fix enter/exit power_save Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 03/58] cfg80211/mac80211: fix BSS leaks when abandoning assoc attempts Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 04/58] ath9k: Really fix LED polarity for some Mini PCI AR9220 MB92 cards Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 05/58] mmc: sdhci: Fix recovery from tuning timeout Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 06/58] regulator: stw481x-vmmc: fix ages old enable error Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 07/58] timekeeping_Force_unsigned_clocksource_to_nanoseconds_conversion Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 08/58] clk: bcm2835: Avoid overwriting the div info when disabling a pll_div clk Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 09/58] thermal: hwmon: Properly report critical temperature in sysfs Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 10/58] staging: comedi: ni_mio_common: fix M Series ni_ai_insn_read() data mask Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 11/58] staging: comedi: ni_mio_common: fix E series ni_ai_insn_read() data Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 12/58] ACPI / video: Add force_native quirk for Dell XPS 17 L702X Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 13/58] ACPI / video: Add force_native quirk for HP Pavilion dv6 Greg Kroah-Hartman
2017-01-06 21:43 ` [PATCH 4.4 14/58] drm/nouveau/kms: lvds panel strap moved again on maxwell Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 15/58] drm/nouveau/bios: require checksum to match for fast acpi shadow method Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 16/58] drm/nouveau/ltc: protect clearing of comptags with mutex Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 17/58] drm/nouveau/fifo/gf100-: protect channel preempt with subdev mutex Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 18/58] drm/nouveau/i2c/gk110b,gm10x: use the correct implementation Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 21/58] drm/radeon: add additional pci revision to dpm workaround Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 22/58] drm/gma500: Add compat ioctl Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 23/58] drivers/gpu/drm/ast: Fix infinite loop if read fails Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 24/58] mei: request async autosuspend at the end of enumeration Greg Kroah-Hartman
2017-01-06 21:44 ` Greg Kroah-Hartman [this message]
2017-01-06 21:44 ` [PATCH 4.4 26/58] vt: fix Scroll Lock LED trigger name Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 27/58] scsi: megaraid_sas: For SRIOV enabled firmware, ensure VF driver waits for 30secs before reset Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 28/58] scsi: megaraid_sas: Do not set MPI2_TYPE_CUDA for JBOD FP path for FW which does not support JBOD sequence map Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 29/58] scsi: zfcp: fix use-after-"free" in FC ingress path after TMF Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 30/58] scsi: zfcp: do not trace pure benign residual HBA responses at default level Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 31/58] scsi: zfcp: fix rport unblock race with LUN recovery Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 32/58] scsi: avoid a permanent stop of the scsi devices request queue Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 33/58] ARC: mm: arc700: Dont assume 2 colours for aliasing VIPT dcache Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 34/58] firmware: fix usermode helper fallback loading Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 35/58] s390/vmlogrdr: fix IUCV buffer allocation Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 36/58] sc16is7xx: Drop bogus use of IRQF_ONESHOT Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 37/58] md/raid5: limit request size according to implementation limits Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 38/58] KVM: PPC: Book3S HV: Save/restore XER in checkpointed register state Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 39/58] KVM: PPC: Book3S HV: Dont lose hardware R/C bit updates in H_PROTECT Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 40/58] kvm: nVMX: Allow L1 to intercept software exceptions (#BP and #OF) Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 41/58] ftrace/x86_32: Set ftrace_stub to weak to prevent gcc from using short jumps to it Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 42/58] platform/x86: asus-nb-wmi.c: Add X45U quirk Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 43/58] fgraph: Handle a case where a tracer ignores set_graph_notrace Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 44/58] IB/mad: Fix an array index check Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 45/58] IPoIB: Avoid reading an uninitialized member variable Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 46/58] IB/multicast: Check ib_find_pkey() return value Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 47/58] IB/cma: Fix a race condition in iboe_addr_get_sgid() Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 48/58] [media] media: solo6x10: fix lockup by avoiding delayed register write Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 49/58] Input: drv260x - fix input devices parent assignment Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 50/58] PCI: Check for PME in targeted sleep state Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 51/58] libceph: verify authorize reply on connect Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 52/58] nfs_write_end(): fix handling of short copies Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 53/58] powerpc/ps3: Fix system hang with GCC 5 builds Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 54/58] powerpc: Convert cmp to cmpd in idle enter sequence Greg Kroah-Hartman
2017-01-09 9:55 ` Vaidyanathan Srinivasan
2017-01-06 21:44 ` [PATCH 4.4 55/58] target/user: Fix use-after-free of tcmu_cmds if they are expired Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 56/58] kconfig/nconf: Fix hang when editing symbol with a long prompt Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 57/58] sg_write()/bsg_write() is not fit to be called under KERNEL_DS Greg Kroah-Hartman
2017-01-06 21:44 ` [PATCH 4.4 58/58] net: mvpp2: fix dma unmapping of TX buffers for fragments Greg Kroah-Hartman
2017-01-07 2:05 ` [PATCH 4.4 00/58] 4.4.41-stable review Shuah Khan
2017-01-07 15:51 ` Guenter Roeck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170106213907.609539445@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=axboe@fb.com \
--cc=hch@lst.de \
--cc=jack@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=rabinv@axis.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.