• N
    md: don't report active array_state until after revalidate_disk() completes. · 9d4b45d6
    NeilBrown 提交于
    Until revalidate_disk() has completed, the size of a new md array will
    appear to be zero.
    So we shouldn't report, through array_state, that the array is active
    until that time.
    udev rules check array_state to see if the array is ready.  As soon as
    it appear to be zero, fsck can be run.  If it find the size to be
    zero, it will fail.
    
    So add a new flag to provide an interlock between do_md_run() and
    array_state_show().  This flag is set while do_md_run() is active and
    it prevents array_state_show() from reporting that the array is
    active.
    
    Before do_md_run() is called, ->pers will be NULL so array is
    definitely not active.
    After do_md_run() is called, revalidate_disk() will have run and the
    array will be completely ready.
    
    We also move various sysfs_notify*() calls out of md_run() into
    do_md_run() after MD_NOT_READY is cleared.  This ensure the
    information is ready before the notification is sent.
    
    Prior to v4.12, array_state_show() was called with the
    mddev->reconfig_mutex held, which provided exclusion with do_md_run().
    
    Note that MD_NOT_READY cleared twice.  This is deliberate to cover
    both success and error paths with minimal noise.
    
    Fixes: b7b17c9b ("md: remove mddev_lock() from md_attr_show()")
    Cc: stable@vger.kernel.org (v4.12++)
    Signed-off-by: NNeilBrown <neilb@suse.com>
    Signed-off-by: NSong Liu <songliubraving@fb.com>
    9d4b45d6
md.c 250.3 KB