md: resolve external metadata handling deadlock in md_allow_write
authorDan Williams <dan.j.williams@intel.com>
Sat, 28 Jun 2008 04:44:04 +0000 (21:44 -0700)
committerDan Williams <dan.j.williams@intel.com>
Tue, 1 Jul 2008 00:18:19 +0000 (17:18 -0700)
commitb5470dc5fc18a8ff6517c3bb538d1479e58ecb02
tree37b0eb3a4691bdbe58dc5c6c73b2dc8d3925b332
parent1fe797e67fb07d605b82300934d0de67068a0aca
md: resolve external metadata handling deadlock in md_allow_write

md_allow_write() marks the metadata dirty while holding mddev->lock and then
waits for the write to complete.  For externally managed metadata this causes a
deadlock as userspace needs to take the lock to communicate that the metadata
update has completed.

Change md_allow_write() in the 'external' case to start the 'mark active'
operation and then return -EAGAIN.  The expected side effects while waiting for
userspace to write 'active' to 'array_state' are holding off reshape (code
currently handles -ENOMEM), cause some 'stripe_cache_size' change requests to
fail, cause some GET_BITMAP_FILE ioctl requests to fall back to GFP_NOIO, and
cause updates to 'raid_disks' to fail.  Except for 'stripe_cache_size' changes
these failures can be mitigated by coordinating with mdmon.

md_write_start() still prevents writes from occurring until the metadata
handler has had a chance to take action as it unconditionally waits for
MD_CHANGE_CLEAN to be cleared.

[neilb@suse.de: return -EAGAIN, try GFP_NOIO]
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/md/md.c
drivers/md/raid1.c
drivers/md/raid5.c
include/linux/raid/md.h