• Junichi Nomura's avatar
    dm mpath: fix infinite recursion in ioctl when no paths and !queue_if_no_path · 43e43c9e
    Junichi Nomura authored
    In multipath_prepare_ioctl(),
      - pgpath is a path selected from available paths
      - m->queue_io is true if we cannot send a request immediately to
        paths, either because:
          * there is no available path
          * the path group needs activation (pg_init)
              - pg_init is not started
              - pg_init is still running
      - m->queue_if_no_path is true if the device is configured to queue
        I/O if there are no available paths
    
    If !pgpath && !m->queue_if_no_path, the handler should return -EIO.
    However in the course of refactoring the condition check has broken
    and returns success in that case.  Since bdev points to the dm device
    itself, dm_blk_ioctl() calls __blk_dev_driver_ioctl() for itself and
    recurses until crash.
    
    You could reproduce the problem like this:
    
      # dmsetup create mp --table '0 1024 multipath 0 0 0 0'
      # sg_inq /dev/mapper/mp
      <crash>
      [  172.648615] BUG: unable to handle kernel paging request at fffffffc81b10268
      [  172.662843] PGD 19dd067 PUD 0
      [  172.666269] Thread overran stack, or stack corrupted
      [  172.671808] Oops: 0000 [#1] SMP
      ...
    
    Fix the condition check with some clarifications.
    
    Fixes: e56f81e0 ("dm: refactor ioctl handling")
    Signed-off-by: default avatarJun'ichi Nomura <j-nomura@ce.jp.nec.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    43e43c9e
dm-mpath.c 40.4 KB