• Dan Williams's avatar
    md: resolve external metadata handling deadlock in md_allow_write · b5470dc5
    Dan Williams authored
    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: default avatarDan Williams <dan.j.williams@intel.com>
    b5470dc5
md.c 161 KB