From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
NeilBrown <neilb@suse.de>
Subject: [28/67] md: fix another deadlock with removing sysfs attributes.
Date: Wed, 11 Aug 2010 17:05:43 -0700 [thread overview]
Message-ID: <20100812000615.235736426@clark.site> (raw)
In-Reply-To: <20100812000641.GA6348@kroah.com>
2.6.35-stable review patch. If anyone has any objections, please let us know.
------------------
From: NeilBrown <neilb@suse.de>
commit bb4f1e9d0e2ef93de8e36ca0f5f26625fcd70b7d upstream.
Move the deletion of sysfs attributes from reconfig_mutex to
open_mutex didn't really help as a process can try to take
open_mutex while holding reconfig_mutex, so the same deadlock can
happen, just requiring one more process to be involved in the chain.
I looks like I cannot easily use locking to wait for the sysfs
deletion to complete, so don't.
The only things that we cannot do while the deletions are still
pending is other things which can change the sysfs namespace: run,
takeover, stop. Each of these can fail with -EBUSY.
So set a flag while doing a sysfs deletion, and fail run, takeover,
stop if that flag is set.
This is suitable for 2.6.35.x
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/md/md.c | 31 +++++++++++++++++--------------
drivers/md/md.h | 4 ++++
2 files changed, 21 insertions(+), 14 deletions(-)
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -532,13 +532,17 @@ static void mddev_unlock(mddev_t * mddev
* an access to the files will try to take reconfig_mutex
* while holding the file unremovable, which leads to
* a deadlock.
- * So hold open_mutex instead - we are allowed to take
- * it while holding reconfig_mutex, and md_run can
- * use it to wait for the remove to complete.
+ * So hold set sysfs_active while the remove in happeing,
+ * and anything else which might set ->to_remove or my
+ * otherwise change the sysfs namespace will fail with
+ * -EBUSY if sysfs_active is still set.
+ * We set sysfs_active under reconfig_mutex and elsewhere
+ * test it under the same mutex to ensure its correct value
+ * is seen.
*/
struct attribute_group *to_remove = mddev->to_remove;
mddev->to_remove = NULL;
- mutex_lock(&mddev->open_mutex);
+ mddev->sysfs_active = 1;
mutex_unlock(&mddev->reconfig_mutex);
if (to_remove != &md_redundancy_group)
@@ -550,7 +554,7 @@ static void mddev_unlock(mddev_t * mddev
sysfs_put(mddev->sysfs_action);
mddev->sysfs_action = NULL;
}
- mutex_unlock(&mddev->open_mutex);
+ mddev->sysfs_active = 0;
} else
mutex_unlock(&mddev->reconfig_mutex);
@@ -2960,7 +2964,9 @@ level_store(mddev_t *mddev, const char *
* - new personality will access other array.
*/
- if (mddev->sync_thread || mddev->reshape_position != MaxSector)
+ if (mddev->sync_thread ||
+ mddev->reshape_position != MaxSector ||
+ mddev->sysfs_active)
return -EBUSY;
if (!mddev->pers->quiesce) {
@@ -4344,13 +4350,9 @@ static int md_run(mddev_t *mddev)
if (mddev->pers)
return -EBUSY;
-
- /* These two calls synchronise us with the
- * sysfs_remove_group calls in mddev_unlock,
- * so they must have completed.
- */
- mutex_lock(&mddev->open_mutex);
- mutex_unlock(&mddev->open_mutex);
+ /* Cannot run until previous stop completes properly */
+ if (mddev->sysfs_active)
+ return -EBUSY;
/*
* Analyze all RAID superblock(s)
@@ -4716,7 +4718,8 @@ static int do_md_stop(mddev_t * mddev, i
mdk_rdev_t *rdev;
mutex_lock(&mddev->open_mutex);
- if (atomic_read(&mddev->openers) > is_open) {
+ if (atomic_read(&mddev->openers) > is_open ||
+ mddev->sysfs_active) {
printk("md: %s still in use.\n",mdname(mddev));
err = -EBUSY;
} else if (mddev->pers) {
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -125,6 +125,10 @@ struct mddev_s
int suspended;
atomic_t active_io;
int ro;
+ int sysfs_active; /* set when sysfs deletes
+ * are happening, so run/
+ * takeover/stop are not safe
+ */
struct gendisk *gendisk;
next prev parent reply other threads:[~2010-08-12 0:16 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-12 0:06 [00/67] 2.6.35.2 stable review Greg KH
2010-08-12 0:05 ` [01/67] x86, vmware: Preset lpj values when on VMware Greg KH
2010-08-12 0:05 ` [02/67] ata_piix: fix locking around SIDPR access Greg KH
2010-08-12 0:05 ` [03/67] perf, powerpc: fsl_emb: Restore setting perf_sample_data.period Greg KH
2010-08-12 0:05 ` [04/67] powerpc: fix build with make 3.82 Greg KH
2010-08-12 0:05 ` [05/67] x86, kmmio/mmiotrace: Fix double free of kmmio_fault_pages Greg KH
2010-08-12 0:05 ` [06/67] x86/PCI: use host bridge _CRS info on ASRock ALiveSATA2-GLAN Greg KH
2010-08-12 0:05 ` [07/67] pcmcia: avoid buffer overflow in pcmcia_setup_isa_irq Greg KH
2010-08-12 0:05 ` [08/67] x86: Add memory modify constraints to xchg() and cmpxchg() Greg KH
2010-08-12 0:05 ` [09/67] staging: rt2870: Add USB ID for Belkin F6D4050 v2 Greg KH
2010-08-12 0:05 ` [10/67] Staging: line6: needs to select SND_PCM Greg KH
2010-08-12 0:05 ` [11/67] Staging: panel: Prevent double-calling of parport_release - fix oops Greg KH
2010-08-12 0:05 ` [12/67] staging: hv: Fix Kconfig dependency of hv_blkvsc Greg KH
2010-08-12 0:05 ` [13/67] serial: add support for OX16PCI958 card Greg KH
2010-08-12 0:05 ` [14/67] PCI: Do not run NVidia quirks related to MSI with MSI disabled Greg KH
2010-08-12 0:05 ` [15/67] PCI: disable MSI on VIA K8M800 Greg KH
2010-08-12 0:05 ` [16/67] solos-pci: Fix race condition in tasklet RX handling Greg KH
2010-08-12 0:05 ` [17/67] x86, mtrr: Use stop machine context to rendezvous all the cpus Greg KH
2010-08-12 0:05 ` [18/67] ALSA: hda - Add PC-beep whitelist for an Intel board Greg KH
2010-08-12 0:05 ` [19/67] Char: nozomi, fix tty->count counting Greg KH
2010-08-12 0:05 ` [20/67] Char: nozomi, set tty->driver_data appropriately Greg KH
2010-08-12 0:05 ` [21/67] mm: fix corruption of hibernation caused by reusing swap during image saving Greg KH
2010-08-12 0:05 ` [22/67] drivers/video/w100fb.c: ignore void return value / fix build failure Greg KH
2010-08-12 0:05 ` [23/67] iwlwifi: fix TX tracer Greg KH
2010-08-12 0:05 ` [24/67] rtl8180: avoid potential NULL deref in rtl8180_beacon_work Greg KH
2010-08-12 0:05 ` [25/67] ipmi: fix ACPI detection with regspacing Greg KH
2010-08-12 0:05 ` [26/67] ide-cd: Do not access completed requests in the irq handler Greg KH
2010-08-12 0:05 ` [27/67] md: move revalidate_disk() back outside open_mutex Greg KH
2010-08-12 0:05 ` Greg KH [this message]
2010-08-12 0:05 ` [29/67] md/raid10: fix deadlock with unaligned read during resync Greg KH
2010-08-12 0:05 ` [30/67] e100/e1000*/igb*/ixgb*: Add missing read memory barrier Greg KH
2010-08-12 0:05 ` [31/67] ioat2: catch and recover from broken vtd configurations v6 Greg KH
2010-08-12 0:05 ` [32/67] Fix sget() race with failing mount Greg KH
2010-08-12 0:05 ` [33/67] blkdev: cgroup whitelist permission fix Greg KH
2010-08-12 0:05 ` [34/67] eCryptfs: Handle ioctl calls with unlocked and compat functions Greg KH
2010-08-12 0:05 ` [35/67] ecryptfs: release reference to lower mount if interpose fails Greg KH
2010-08-12 0:05 ` [36/67] fs/ecryptfs/file.c: introduce missing free Greg KH
2010-08-12 0:05 ` [37/67] drbd: Initialize all members of sync_conf to their defaults [Bugz 315] Greg KH
2010-08-12 0:05 ` [38/67] drbd: Disable delay probes for the upcomming release Greg KH
2010-08-12 3:15 ` [Stable-review] " Ben Hutchings
2010-08-12 10:24 ` Lars Ellenberg
2010-08-12 0:05 ` [39/67] bio, fs: update RWA_MASK, READA and SWRITE to match the corresponding BIO_RW_* bits Greg KH
2010-08-12 0:05 ` [40/67] signalfd: fill in ssi_int for posix timers and message queues Greg KH
2010-08-12 0:05 ` [41/67] [ARM] pxa/cm-x300: fix ffuart registration Greg KH
2010-08-12 0:05 ` [42/67] smsc911x: Add spinlocks around registers access Greg KH
2010-08-12 0:05 ` [43/67] ARM: 6299/1: errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID Greg KH
2010-08-12 0:05 ` [44/67] ARM: 6280/1: imx: Fix build failure when including <mach/gpio.h> without <linux/spinlock.h> Greg KH
2010-08-12 0:06 ` [45/67] USB: musb: use correct register widths in register dumps Greg KH
2010-08-12 0:06 ` [46/67] USB: EHCI: remove PCI assumption Greg KH
2010-08-12 0:06 ` [47/67] USB: resizing usbmon binary interface buffer causes protection faults Greg KH
2010-08-12 0:06 ` [48/67] USB delay init quirk for logitech Harmony 700-series devices Greg KH
2010-08-12 0:06 ` [49/67] USB: serial: enabling support for Segway RMP in ftdi_sio Greg KH
2010-08-12 0:06 ` [50/67] USB: option: Huawei ETS 1220 support added Greg KH
2010-08-12 0:06 ` [51/67] USB: option: add huawei k3765 k4505 devices to work properly Greg KH
2010-08-12 0:06 ` [52/67] USB: ftdi_sio: device id for Navitator Greg KH
2010-08-12 0:06 ` [53/67] USB: cp210x: Add four new device IDs Greg KH
2010-08-12 0:06 ` [54/67] USB: usbtest: avoid to free coherent buffer in atomic context Greg KH
2010-08-12 0:06 ` [55/67] USB: fix thread-unsafe anchor utiliy routines Greg KH
2010-08-12 0:06 ` [56/67] USB: serial: fix stalled writes Greg KH
2010-08-12 0:06 ` [57/67] Bluetooth: Added support for controller shipped with iMac i5 Greg KH
2010-08-12 0:06 ` [58/67] sched: Revert nohz_ratelimit() for now Greg KH
2010-08-12 0:06 ` [59/67] mtd: mxc_nand: fix unbalanced enable for IRQ Greg KH
2010-08-12 0:06 ` [60/67] mtd: gen_nand: fix support for multiple chips Greg KH
2010-08-12 1:07 ` Marek Vasut
2010-08-12 0:06 ` [61/67] l2tp: fix export of header file for userspace Greg KH
2010-08-12 0:06 ` [62/67] jfs: dont allow os2 xattr namespace overlap with others Greg KH
2010-08-12 0:06 ` [63/67] net: Fix NETDEV_NOTIFY_PEERS to not conflict with NETDEV_BONDING_DESLAVE Greg KH
2010-08-12 0:06 ` [64/67] irq: Add new IRQ flag IRQF_NO_SUSPEND Greg KH
2010-08-12 0:06 ` [65/67] xen: Do not suspend IPI IRQs Greg KH
2010-08-12 0:06 ` [66/67] crypto: testmgr - add an option to disable cryptoalgos self-tests Greg KH
2010-08-12 0:06 ` [67/67] ext4: fix freeze deadlock under IO Greg KH
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=20100812000615.235736426@clark.site \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=neilb@suse.de \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.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
all inboxes | Powered by JetHome®