• Hannes Reinecke's avatar
    dm mpath: remove process_queued_ios() · 3e9f1be1
    Hannes Reinecke authored
    process_queued_ios() has served 3 functions:
      1) select pg and pgpath if none is selected
      2) start pg_init if requested
      3) dispatch queued IOs when pg is ready
    
    Basically, a call to queue_work(process_queued_ios) can be replaced by
    dm_table_run_md_queue_async(), which runs request queue and ends up
    calling map_io(), which does 1), 2) and 3).
    
    Exception is when !pg_ready() (which means either pg_init is running or
    requested), then multipath_busy() prevents map_io() being called from
    request_fn.
    
    If pg_init is running, it should be ok as long as pg_init_done() does
    the right thing when pg_init is completed, I.e.: restart pg_init if
    !pg_ready() or call dm_table_run_md_queue_async() to kick map_io().
    
    If pg_init is requested, we have to make sure the request is detected
    and pg_init will be started.  pg_init is requested in 3 places:
      a) __choose_pgpath() in map_io()
      b) __choose_pgpath() in multipath_ioctl()
      c) pg_init retry in pg_init_done()
    a) is ok because map_io() calls __pg_init_all_paths(), which does 2).
    b) needs a call to __pg_init_all_paths(), which does 2).
    c) needs a call to __pg_init_all_paths(), which does 2).
    
    So this patch removes process_queued_ios() and ensures that
    __pg_init_all_paths() is called at the appropriate locations.
    Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Reviewed-by: default avatarJun'ichi Nomura <j-nomura@ce.jp.nec.com>
    3e9f1be1
dm-mpath.c 40.2 KB