• Junichi Nomura's avatar
    dm: fix reload failure of 0 path multipath mapping on blk-mq devices · c6b069f4
    Junichi Nomura authored
    commit 15b94a69 upstream.
    
    dm-multipath accepts 0 path mapping.
    
      # echo '0 2097152 multipath 0 0 0 0' | dmsetup create newdev
    
    Such a mapping can be used to release underlying devices while still
    holding requests in its queue until working paths come back.
    
    However, once the multipath device is created over blk-mq devices,
    it rejects reloading of 0 path mapping:
    
      # echo '0 2097152 multipath 0 0 1 1 queue-length 0 1 1 /dev/sda 1' \
          | dmsetup create mpath1
      # echo '0 2097152 multipath 0 0 0 0' | dmsetup load mpath1
      device-mapper: reload ioctl on mpath1 failed: Invalid argument
      Command failed
    
    With following kernel message:
      device-mapper: ioctl: can't change device type after initial table load.
    
    DM tries to inherit the current table type using dm_table_set_type()
    but it doesn't work as expected because of unnecessary check about
    whether the target type is hybrid or not.
    
    Hybrid type is for targets that work as either request-based or bio-based
    and not required for blk-mq or non blk-mq checking.
    
    Fixes: 65803c20 ("dm table: train hybrid target type detection to select blk-mq if appropriate")
    Signed-off-by: default avatarJun'ichi Nomura <j-nomura@ce.jp.nec.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    c6b069f4
dm-table.c 40.1 KB