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);
 
