• Li Lingfeng's avatar
    dm: don't lock fs when the map is NULL in process of resume · 38d11da5
    Li Lingfeng authored
    Commit fa247089 ("dm: requeue IO if mapping table not yet available")
    added a detection of whether the mapping table is available in the IO
    submission process. If the mapping table is unavailable, it returns
    BLK_STS_RESOURCE and requeues the IO.
    This can lead to the following deadlock problem:
    
    dm create                                      mount
    ioctl(DM_DEV_CREATE_CMD)
    ioctl(DM_TABLE_LOAD_CMD)
                                   do_mount
                                    vfs_get_tree
                                     ext4_get_tree
                                      get_tree_bdev
                                       sget_fc
                                        alloc_super
                                         // got &s->s_umount
                                         down_write_nested(&s->s_umount, ...);
                                       ext4_fill_super
                                        ext4_load_super
                                         ext4_read_bh
                                          submit_bio
                                          // submit and wait io end
    ioctl(DM_DEV_SUSPEND_CMD)
    dev_suspend
     do_resume
      dm_suspend
       __dm_suspend
        lock_fs
         freeze_bdev
          get_active_super
           grab_super
            // wait for &s->s_umount
            down_write(&s->s_umount);
      dm_swap_table
       __bind
        // set md->map(can't get here)
    
    IO will be continuously requeued while holding the lock since mapping
    table is NULL. At the same time, mapping table won't be set since the
    lock is not available.
    Like request-based DM, bio-based DM also has the same problem.
    
    It's not proper to just abort IO if the mapping table not available.
    So clear DM_SKIP_LOCKFS_FLAG when the mapping table is NULL, this
    allows the DM table to be loaded and the IO submitted upon resume.
    
    Fixes: fa247089 ("dm: requeue IO if mapping table not yet available")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarLi Lingfeng <lilingfeng3@huawei.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
    38d11da5
dm-ioctl.c 50.2 KB