dm_pg_init_complete --- diff/drivers/md/dm-hw-handler.h 2004-10-29 15:38:35.000000000 +0100 +++ source/drivers/md/dm-hw-handler.h 2004-10-29 15:38:42.000000000 +0100 @@ -60,6 +60,9 @@ /* Default hwh_err_fn */ unsigned dm_hw_handler_err(struct hw_handler *hwh, struct bio *bio); +/* Callback for hwh_pg_init_fn to use when complete */ +void dm_pg_init_complete(struct path *path, unsigned err_flags); + /* hwh_err_fn return flags */ #define MP_FAIL_PATH 1 #define MP_BYPASS_PG 2 --- diff/drivers/md/dm-mpath.c 2004-10-29 15:38:35.000000000 +0100 +++ source/drivers/md/dm-mpath.c 2004-10-29 15:38:42.000000000 +0100 @@ -725,6 +725,24 @@ return -EINVAL; } +void dm_pg_init_complete(struct path *path, unsigned err_flags) +{ + struct priority_group *pg = path->pg; + struct multipath *m = pg->m; + unsigned long flags; + + if (err_flags & MP_FAIL_PATH) + fail_path(path); + + if (err_flags & MP_BYPASS_PG) + bypass_pg(m, pg, 1); + + spin_lock_irqsave(&m->lock, flags); + m->initialising_pg = 0; + schedule_work(&m->dispatch_queued); + spin_unlock_irqrestore(&m->lock, flags); +} + static int do_end_io(struct multipath *m, struct bio *bio, int error, struct mpath_io *mpio) { @@ -928,6 +946,8 @@ kmem_cache_destroy(_mpio_cache); } +EXPORT_SYMBOL(dm_pg_init_complete); + module_init(dm_multipath_init); module_exit(dm_multipath_exit);