• Artur Paszkiewicz's avatar
    md: don't check MD_SB_CHANGE_CLEAN in md_allow_write · b90f6ff0
    Artur Paszkiewicz authored
    Only MD_SB_CHANGE_PENDING should be used to wait for transition from
    clean to dirty. Checking also MD_SB_CHANGE_CLEAN is unnecessary and can
    race with e.g. md_do_sync(). This sporadically causes a hang when
    changing consistency policy during resync:
    
    INFO: task mdadm:6183 blocked for more than 30 seconds.
          Not tainted 4.14.0-rc3+ #391
    "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
    mdadm           D12752  6183   6022 0x00000000
    Call Trace:
     __schedule+0x93f/0x990
     schedule+0x6b/0x90
     md_allow_write+0x100/0x130 [md_mod]
     ? do_wait_intr_irq+0x90/0x90
     resize_stripes+0x3a/0x5b0 [raid456]
     ? kernfs_fop_write+0xbe/0x180
     raid5_change_consistency_policy+0xa6/0x200 [raid456]
     consistency_policy_store+0x2e/0x70 [md_mod]
     md_attr_store+0x90/0xc0 [md_mod]
     sysfs_kf_write+0x42/0x50
     kernfs_fop_write+0x119/0x180
     __vfs_write+0x28/0x110
     ? rcu_sync_lockdep_assert+0x12/0x60
     ? __sb_start_write+0x15a/0x1c0
     ? vfs_write+0xa3/0x1a0
     vfs_write+0xb4/0x1a0
     SyS_write+0x49/0xa0
     entry_SYSCALL_64_fastpath+0x18/0xad
    
    Fixes: 2214c260 ("md: don't return -EAGAIN in md_allow_write for external metadata arrays")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    b90f6ff0
md.c 243 KB