mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Bian Yu <bianyu@kedacom.com>,
	Jianpeng Ma <majianpeng@gmail.com>, NeilBrown <neilb@suse.de>
Subject: [PATCH 3.10 29/74] md: avoid deadlock when md_set_badblocks.
Date: Fri,  8 Nov 2013 22:51:34 -0800	[thread overview]
Message-ID: <20131109065115.571924977@linuxfoundation.org> (raw)
In-Reply-To: <20131109065113.502217951@linuxfoundation.org>

3.10-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Bian Yu <bianyu@kedacom.com>

commit 905b0297a9533d7a6ee00a01a990456636877dd6 upstream.

When operate harddisk and hit errors, md_set_badblocks is called after
scsi_restart_operations which already disabled the irq. but md_set_badblocks
will call write_sequnlock_irq and enable irq. so softirq can preempt the
current thread and that may cause a deadlock. I think this situation should
use write_sequnlock_irqsave/irqrestore instead.

I met the situation and the call trace is below:
[  638.919974] BUG: spinlock recursion on CPU#0, scsi_eh_13/1010
[  638.921923]  lock: 0xffff8800d4d51fc8, .magic: dead4ead, .owner: scsi_eh_13/1010, .owner_cpu: 0
[  638.923890] CPU: 0 PID: 1010 Comm: scsi_eh_13 Not tainted 3.12.0-rc5+ #37
[  638.925844] Hardware name: To be filled by O.E.M. To be filled by O.E.M./MAHOBAY, BIOS 4.6.5 03/05/2013
[  638.927816]  ffff880037ad4640 ffff880118c03d50 ffffffff8172ff85 0000000000000007
[  638.929829]  ffff8800d4d51fc8 ffff880118c03d70 ffffffff81730030 ffff8800d4d51fc8
[  638.931848]  ffffffff81a72eb0 ffff880118c03d90 ffffffff81730056 ffff8800d4d51fc8
[  638.933884] Call Trace:
[  638.935867]  <IRQ>  [<ffffffff8172ff85>] dump_stack+0x55/0x76
[  638.937878]  [<ffffffff81730030>] spin_dump+0x8a/0x8f
[  638.939861]  [<ffffffff81730056>] spin_bug+0x21/0x26
[  638.941836]  [<ffffffff81336de4>] do_raw_spin_lock+0xa4/0xc0
[  638.943801]  [<ffffffff8173f036>] _raw_spin_lock+0x66/0x80
[  638.945747]  [<ffffffff814a73ed>] ? scsi_device_unbusy+0x9d/0xd0
[  638.947672]  [<ffffffff8173fb1b>] ? _raw_spin_unlock+0x2b/0x50
[  638.949595]  [<ffffffff814a73ed>] scsi_device_unbusy+0x9d/0xd0
[  638.951504]  [<ffffffff8149ec47>] scsi_finish_command+0x37/0xe0
[  638.953388]  [<ffffffff814a75e8>] scsi_softirq_done+0xa8/0x140
[  638.955248]  [<ffffffff8130e32b>] blk_done_softirq+0x7b/0x90
[  638.957116]  [<ffffffff8104fddd>] __do_softirq+0xfd/0x330
[  638.958987]  [<ffffffff810b964f>] ? __lock_release+0x6f/0x100
[  638.960861]  [<ffffffff8174a5cc>] call_softirq+0x1c/0x30
[  638.962724]  [<ffffffff81004c7d>] do_softirq+0x8d/0xc0
[  638.964565]  [<ffffffff8105024e>] irq_exit+0x10e/0x150
[  638.966390]  [<ffffffff8174ad4a>] smp_apic_timer_interrupt+0x4a/0x60
[  638.968223]  [<ffffffff817499af>] apic_timer_interrupt+0x6f/0x80
[  638.970079]  <EOI>  [<ffffffff810b964f>] ? __lock_release+0x6f/0x100
[  638.971899]  [<ffffffff8173fa6a>] ? _raw_spin_unlock_irq+0x3a/0x50
[  638.973691]  [<ffffffff8173fa60>] ? _raw_spin_unlock_irq+0x30/0x50
[  638.975475]  [<ffffffff81562393>] md_set_badblocks+0x1f3/0x4a0
[  638.977243]  [<ffffffff81566e07>] rdev_set_badblocks+0x27/0x80
[  638.978988]  [<ffffffffa00d97bb>] raid5_end_read_request+0x36b/0x4e0 [raid456]
[  638.980723]  [<ffffffff811b5a1d>] bio_endio+0x1d/0x40
[  638.982463]  [<ffffffff81304ff3>] req_bio_endio.isra.65+0x83/0xa0
[  638.984214]  [<ffffffff81306b9f>] blk_update_request+0x7f/0x350
[  638.985967]  [<ffffffff81306ea1>] blk_update_bidi_request+0x31/0x90
[  638.987710]  [<ffffffff813085e0>] __blk_end_bidi_request+0x20/0x50
[  638.989439]  [<ffffffff8130862f>] __blk_end_request_all+0x1f/0x30
[  638.991149]  [<ffffffff81308746>] blk_peek_request+0x106/0x250
[  638.992861]  [<ffffffff814a62a9>] ? scsi_kill_request.isra.32+0xe9/0x130
[  638.994561]  [<ffffffff814a633a>] scsi_request_fn+0x4a/0x3d0
[  638.996251]  [<ffffffff813040a7>] __blk_run_queue+0x37/0x50
[  638.997900]  [<ffffffff813045af>] blk_run_queue+0x2f/0x50
[  638.999553]  [<ffffffff814a5750>] scsi_run_queue+0xe0/0x1c0
[  639.001185]  [<ffffffff814a7721>] scsi_run_host_queues+0x21/0x40
[  639.002798]  [<ffffffff814a2e87>] scsi_restart_operations+0x177/0x200
[  639.004391]  [<ffffffff814a4fe9>] scsi_error_handler+0xc9/0xe0
[  639.005996]  [<ffffffff814a4f20>] ? scsi_unjam_host+0xd0/0xd0
[  639.007600]  [<ffffffff81072f6b>] kthread+0xdb/0xe0
[  639.009205]  [<ffffffff81072e90>] ? flush_kthread_worker+0x170/0x170
[  639.010821]  [<ffffffff81748cac>] ret_from_fork+0x7c/0xb0
[  639.012437]  [<ffffffff81072e90>] ? flush_kthread_worker+0x170/0x170

This bug was introduce in commit  2e8ac30312973dd20e68073653
(the first time rdev_set_badblock was call from interrupt context),
so this patch is appropriate for 3.5 and subsequent kernels.

Signed-off-by: Bian Yu <bianyu@kedacom.com>
Reviewed-by: Jianpeng Ma <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 drivers/md/md.c |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -8072,6 +8072,7 @@ static int md_set_badblocks(struct badbl
 	u64 *p;
 	int lo, hi;
 	int rv = 1;
+	unsigned long flags;
 
 	if (bb->shift < 0)
 		/* badblocks are disabled */
@@ -8086,7 +8087,7 @@ static int md_set_badblocks(struct badbl
 		sectors = next - s;
 	}
 
-	write_seqlock_irq(&bb->lock);
+	write_seqlock_irqsave(&bb->lock, flags);
 
 	p = bb->page;
 	lo = 0;
@@ -8202,7 +8203,7 @@ static int md_set_badblocks(struct badbl
 	bb->changed = 1;
 	if (!acknowledged)
 		bb->unacked_exist = 1;
-	write_sequnlock_irq(&bb->lock);
+	write_sequnlock_irqrestore(&bb->lock, flags);
 
 	return rv;
 }



  parent reply	other threads:[~2013-11-09  7:35 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-09  6:51 [PATCH 3.10 00/74] 3.10.19-stable review Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 01/74] usb-storage: add quirk for mandatory READ_CAPACITY_16 Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 02/74] USB: support new huawei devices in option.c Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 03/74] USB: quirks.c: add one device that cannot deal with suspension Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 04/74] USB: quirks: add touchscreen that is dazzeled by remote wakeup Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 05/74] USB: serial: ftdi_sio: add id for Z3X Box device Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 06/74] x86: Update UV3 hub revision ID Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 07/74] cpufreq / intel_pstate: Fix max_perf_pct on resume Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 08/74] bcache: Fixed incorrect order of arguments to bio_alloc_bioset() Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 09/74] cgroup: fix to break the while loop in cgroup_attach_task() correctly Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 10/74] mac80211: correctly close cancelled scans Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 11/74] mac80211: drop spoofed packets in ad-hoc mode Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 12/74] mac80211: use sta_info_get_bss() for nl80211 tx and client probing Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 13/74] mac80211: update sta->last_rx on acked tx frames Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 14/74] mac80211: fix crash if bitrate calculation goes wrong Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 15/74] ath9k: fix tx queue scheduling after channel changes Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 16/74] cfg80211: fix warning when using WEXT for IBSS Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 17/74] mwifiex: fix SDIO interrupt lost issue Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 18/74] rtlwifi: rtl8192cu: Fix error in pointer arithmetic Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 19/74] iwlwifi: pcie: add SKUs for 6000, 6005 and 6235 series Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 20/74] jfs: fix error path in ialloc Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 21/74] can: at91-can: fix device to driver data mapping for platform devices Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 22/74] can: flexcan: fix mx28 detection by rearanging OF match table Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 23/74] can: flexcan: flexcan_chip_start: fix regression, mark one MB for TX and abort pending TX Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 24/74] SCSI: sd: call blk_pm_runtime_init before add_disk Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 25/74] ecryptfs: Fix memory leakage in keystore.c Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 26/74] raid5: set bio bi_vcnt 0 for discard request Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 27/74] raid5: avoid finding "discard" stripe Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 28/74] libata: make ata_eh_qc_retry() bump scmd->allowed on bogus failures Greg Kroah-Hartman
2013-11-09  6:51 ` Greg Kroah-Hartman [this message]
2013-11-09  6:51 ` [PATCH 3.10 30/74] md: Fix skipping recovery for read-only arrays Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 31/74] target/pscsi: fix return value check Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 32/74] vhost/scsi: Fix incorrect usage of get_user_pages_fast write parameter Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 33/74] clockevents: Sanitize ticks to nsec conversion Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 34/74] parisc: Do not crash 64bit SMP kernels on machines with >= 4GB RAM Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 35/74] scripts/kallsyms: filter symbols not in kernel address space Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 36/74] ARC: Incorrect mm reference used in vmalloc fault handler Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 37/74] ALSA: hda - Add missing initial vmaster hook at build_controls callback Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 38/74] ALSA: hda - Fix unbalanced runtime PM refcount after S3/S4 Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 39/74] ALSA: hda - Add a fixup for ASUS N76VZ Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 40/74] ALSA: fix oops in snd_pcm_info() caused by ASoC DPCM Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 41/74] ASoC: wm_hubs: Add missing break in hp_supply_event() Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 42/74] ASoC: dapm: Fix source list debugfs outputs Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 43/74] staging: ozwpan: prevent overflow in oz_cdev_write() Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 44/74] Staging: bcm: info leak in ioctl Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 45/74] Staging: sb105x: info leak in mp_get_count() Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 46/74] staging: wlags49_h2: buffer overflow setting station name Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 47/74] uml: check length in exitcode_proc_write() Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 48/74] xtensa: dont use alternate signal stack on threads Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 49/74] mm: make generic_access_phys available for modules Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 50/74] uio: provide vm access to UIO_MEM_PHYS maps Greg Kroah-Hartman
2013-11-09 14:22   ` Uwe Kleine-König
2013-11-09 16:10     ` Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 51/74] au1100fb: VM_IO is set by io_remap_pfn_range() Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 52/74] au1200fb: io_remap_pfn_range() sets VM_IO Greg Kroah-Hartman
2013-11-09  6:51 ` [PATCH 3.10 54/74] lib/scatterlist.c: dont flush_kernel_dcache_page on slab page Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 55/74] aacraid: missing capable() check in compat ioctl Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 56/74] clk: fixup argument order when setting VCO parameters Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 57/74] mm: numa: Do not account for a hinting fault if we raced Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 58/74] mm: Wait for THP migrations to complete during NUMA hinting faults Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 59/74] mm: Prevent parallel splits during THP migration Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 60/74] mm: numa: Sanitize task_numa_fault() callsites Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 61/74] mm: Close races between THP migration and PMD numa clearing Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 62/74] mm: Account for a THP NUMA hinting update as one PTE update Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 63/74] mm/pagewalk.c: fix walk_page_range() access of wrong PTEs Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 64/74] mm/vmalloc.c: fix an overflow bug in alloc_vmap_area() Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 65/74] drm/vmwgfx: Dont put resources with invalid ids on lru list Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 66/74] drm/vmwgfx: Dont kill clients on VT switch Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 67/74] drm: Prevent overwriting from userspace underallocating core ioctl structs Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 68/74] drm: Pad drm_mode_get_connector to 64-bit boundary Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 69/74] drm/radeon/atom: workaround vbios bug in transmitter table on rs780 Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 70/74] seq_file: always update file->f_pos in seq_lseek() Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 71/74] NTB: Add Error Handling in ntb_device_setup Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 72/74] NTB: Correct Number of Scratch Pad Registers Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 73/74] NTB: Correct USD/DSD Identification Greg Kroah-Hartman
2013-11-09  6:52 ` [PATCH 3.10 74/74] NTB: Correct debugfs to work with more than 1 NTB Device Greg Kroah-Hartman
2013-11-09 17:01 ` [PATCH 3.10 00/74] 3.10.19-stable review Guenter Roeck
2013-11-09 17:12   ` Greg Kroah-Hartman
2013-11-10 11:51 ` Satoru Takeuchi
2013-11-10 15:15   ` Greg Kroah-Hartman
2013-11-11 17:56 ` Shuah Khan
2013-11-11 22:51   ` Greg Kroah-Hartman

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=20131109065115.571924977@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=bianyu@kedacom.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=majianpeng@gmail.com \
    --cc=neilb@suse.de \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome