• Yu Kuai's avatar
    md: fix duplicate filename for rdev · 3ce94ce5
    Yu Kuai authored
    Commit 5792a285 ("[PATCH] md: avoid a deadlock when removing a device
    from an md array via sysfs") delays the deletion of rdev, however, this
    introduces a window that rdev can be added again while the deletion is
    not done yet, and sysfs will complain about duplicate filename.
    
    Follow up patches try to fix this problem by flushing workqueue, however,
    flush_rdev_wq() is just dead code, the progress in
    md_kick_rdev_from_array():
    
    1) list_del_rcu(&rdev->same_set);
    2) synchronize_rcu();
    3) queue_work(md_rdev_misc_wq, &rdev->del_work);
    
    So in flush_rdev_wq(), if rdev is found in the list, work_pending() can
    never pass, in the meantime, if work is queued, then rdev can never be
    found in the list.
    
    flush_rdev_wq() can be replaced by flush_workqueue() directly, however,
    this approach is not good:
    - the workqueue is global, this synchronization for all raid disks is
      not necessary.
    - flush_workqueue can't be called under 'reconfig_mutex', there is still
      a small window between flush_workqueue() and mddev_lock() that other
      contexts can queue new work, hence the problem is not solved completely.
    
    sysfs already has apis to support delete itself through writer, and
    these apis, specifically sysfs_break/unbreak_active_protection(), is used
    to support deleting rdev synchronously. Therefore, the above commit can be
    reverted, and sysfs duplicate filename can be avoided.
    
    A new mdadm regression test is proposed as well([1]).
    
    [1] https://lore.kernel.org/linux-raid/20230428062845.1975462-1-yukuai1@huaweicloud.com/
    
    Fixes: 5792a285 ("[PATCH] md: avoid a deadlock when removing a device from an md array via sysfs")
    Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
    Signed-off-by: default avatarSong Liu <song@kernel.org>
    Link: https://lore.kernel.org/r/20230523012727.3042247-1-yukuai1@huaweicloud.com
    3ce94ce5
md.h 28.7 KB