Loading drivers/md/dm-mpath.c +51 −50 Original line number Diff line number Diff line Loading @@ -34,11 +34,12 @@ struct pgpath { struct list_head list; struct priority_group *pg; /* Owning PG */ unsigned is_active; /* Path status */ unsigned fail_count; /* Cumulative failure count */ struct dm_path path; struct delayed_work activate_path; bool is_active:1; /* Path status */ }; #define path_to_pgpath(__pgp) container_of((__pgp), struct pgpath, path) Loading @@ -54,10 +55,10 @@ struct priority_group { struct path_selector ps; unsigned pg_num; /* Reference number */ unsigned bypassed; /* Temporarily bypass this PG? */ unsigned nr_pgpaths; /* Number of paths in PG */ struct list_head pgpaths; bool bypassed:1; /* Temporarily bypass this PG? */ }; /* Multipath context */ Loading @@ -75,20 +76,20 @@ struct multipath { wait_queue_head_t pg_init_wait; /* Wait for pg_init completion */ unsigned pg_init_required; /* pg_init needs calling? */ unsigned pg_init_in_progress; /* Only one pg_init allowed at once */ unsigned pg_init_delay_retry; /* Delay pg_init retry? */ unsigned nr_valid_paths; /* Total number of usable paths */ struct pgpath *current_pgpath; struct priority_group *current_pg; struct priority_group *next_pg; /* Switch to this PG if set */ unsigned queue_io:1; /* Must we queue all I/O? */ unsigned queue_if_no_path:1; /* Queue I/O if last path fails? */ unsigned saved_queue_if_no_path:1; /* Saved state during suspension */ unsigned retain_attached_hw_handler:1; /* If there's already a hw_handler present, don't change it. */ unsigned pg_init_disabled:1; /* pg_init is not currently allowed */ bool queue_io:1; /* Must we queue all I/O? */ bool queue_if_no_path:1; /* Queue I/O if last path fails? */ bool saved_queue_if_no_path:1; /* Saved state during suspension */ bool retain_attached_hw_handler:1; /* If there's already a hw_handler present, don't change it. */ bool pg_init_disabled:1; /* pg_init is not currently allowed */ bool pg_init_required:1; /* pg_init needs calling? */ bool pg_init_delay_retry:1; /* Delay pg_init retry? */ unsigned pg_init_retries; /* Number of times to retry pg_init */ unsigned pg_init_count; /* Number of times pg_init called */ Loading Loading @@ -132,7 +133,7 @@ static struct pgpath *alloc_pgpath(void) struct pgpath *pgpath = kzalloc(sizeof(*pgpath), GFP_KERNEL); if (pgpath) { pgpath->is_active = 1; pgpath->is_active = true; INIT_DELAYED_WORK(&pgpath->activate_path, activate_path); } Loading Loading @@ -189,7 +190,7 @@ static struct multipath *alloc_multipath(struct dm_target *ti, bool use_blk_mq) if (m) { INIT_LIST_HEAD(&m->priority_groups); spin_lock_init(&m->lock); m->queue_io = 1; m->queue_io = true; m->pg_init_delay_msecs = DM_PG_INIT_DELAY_DEFAULT; INIT_WORK(&m->trigger_event, trigger_event); init_waitqueue_head(&m->pg_init_wait); Loading Loading @@ -278,7 +279,7 @@ static int __pg_init_all_paths(struct multipath *m) return 0; m->pg_init_count++; m->pg_init_required = 0; m->pg_init_required = false; /* Check here to reset pg_init_required */ if (!m->current_pg) Loading @@ -304,11 +305,11 @@ static void __switch_pg(struct multipath *m, struct pgpath *pgpath) /* Must we initialise the PG first, and queue I/O till it's ready? */ if (m->hw_handler_name) { m->pg_init_required = 1; m->queue_io = 1; m->pg_init_required = true; m->queue_io = true; } else { m->pg_init_required = 0; m->queue_io = 0; m->pg_init_required = false; m->queue_io = false; } m->pg_init_count = 0; Loading @@ -334,10 +335,10 @@ static int __choose_path_in_pg(struct multipath *m, struct priority_group *pg, static void __choose_pgpath(struct multipath *m, size_t nr_bytes) { struct priority_group *pg; unsigned bypassed = 1; bool bypassed = true; if (!m->nr_valid_paths) { m->queue_io = 0; m->queue_io = false; goto failed; } Loading Loading @@ -365,7 +366,7 @@ static void __choose_pgpath(struct multipath *m, size_t nr_bytes) continue; if (!__choose_path_in_pg(m, pg, nr_bytes)) { if (!bypassed) m->pg_init_delay_retry = 1; m->pg_init_delay_retry = true; return; } } Loading Loading @@ -496,8 +497,8 @@ static void multipath_release_clone(struct request *clone) /* * If we run out of usable paths, should we queue I/O or error it? */ static int queue_if_no_path(struct multipath *m, unsigned queue_if_no_path, unsigned save_old_value) static int queue_if_no_path(struct multipath *m, bool queue_if_no_path, bool save_old_value) { unsigned long flags; Loading Loading @@ -803,12 +804,12 @@ static int parse_features(struct dm_arg_set *as, struct multipath *m) argc--; if (!strcasecmp(arg_name, "queue_if_no_path")) { r = queue_if_no_path(m, 1, 0); r = queue_if_no_path(m, true, false); continue; } if (!strcasecmp(arg_name, "retain_attached_hw_handler")) { m->retain_attached_hw_handler = 1; m->retain_attached_hw_handler = true; continue; } Loading Loading @@ -947,7 +948,7 @@ static void flush_multipath_work(struct multipath *m) unsigned long flags; spin_lock_irqsave(&m->lock, flags); m->pg_init_disabled = 1; m->pg_init_disabled = true; spin_unlock_irqrestore(&m->lock, flags); flush_workqueue(kmpath_handlerd); Loading @@ -956,7 +957,7 @@ static void flush_multipath_work(struct multipath *m) flush_work(&m->trigger_event); spin_lock_irqsave(&m->lock, flags); m->pg_init_disabled = 0; m->pg_init_disabled = false; spin_unlock_irqrestore(&m->lock, flags); } Loading Loading @@ -984,7 +985,7 @@ static int fail_path(struct pgpath *pgpath) DMWARN("Failing path %s.", pgpath->path.dev->name); pgpath->pg->ps.type->fail_path(&pgpath->pg->ps, &pgpath->path); pgpath->is_active = 0; pgpath->is_active = false; pgpath->fail_count++; m->nr_valid_paths--; Loading Loading @@ -1028,7 +1029,7 @@ static int reinstate_path(struct pgpath *pgpath) if (r) goto out; pgpath->is_active = 1; pgpath->is_active = true; if (!m->nr_valid_paths++) { m->current_pgpath = NULL; Loading Loading @@ -1075,7 +1076,7 @@ static int action_dev(struct multipath *m, struct dm_dev *dev, * Temporarily try to avoid having to use the specified PG */ static void bypass_pg(struct multipath *m, struct priority_group *pg, int bypassed) bool bypassed) { unsigned long flags; Loading Loading @@ -1108,7 +1109,7 @@ static int switch_pg_num(struct multipath *m, const char *pgstr) spin_lock_irqsave(&m->lock, flags); list_for_each_entry(pg, &m->priority_groups, list) { pg->bypassed = 0; pg->bypassed = false; if (--pgnum) continue; Loading @@ -1126,7 +1127,7 @@ static int switch_pg_num(struct multipath *m, const char *pgstr) * Set/clear bypassed status of a PG. * PGs are numbered upwards from 1 in the order they were declared. */ static int bypass_pg_num(struct multipath *m, const char *pgstr, int bypassed) static int bypass_pg_num(struct multipath *m, const char *pgstr, bool bypassed) { struct priority_group *pg; unsigned pgnum; Loading @@ -1150,17 +1151,17 @@ static int bypass_pg_num(struct multipath *m, const char *pgstr, int bypassed) /* * Should we retry pg_init immediately? */ static int pg_init_limit_reached(struct multipath *m, struct pgpath *pgpath) static bool pg_init_limit_reached(struct multipath *m, struct pgpath *pgpath) { unsigned long flags; int limit_reached = 0; bool limit_reached = false; spin_lock_irqsave(&m->lock, flags); if (m->pg_init_count <= m->pg_init_retries && !m->pg_init_disabled) m->pg_init_required = 1; m->pg_init_required = true; else limit_reached = 1; limit_reached = true; spin_unlock_irqrestore(&m->lock, flags); Loading @@ -1173,7 +1174,7 @@ static void pg_init_done(void *data, int errors) struct priority_group *pg = pgpath->pg; struct multipath *m = pg->m; unsigned long flags; unsigned delay_retry = 0; bool delay_retry = false; /* device or driver problems */ switch (errors) { Loading @@ -1196,7 +1197,7 @@ static void pg_init_done(void *data, int errors) * Probably doing something like FW upgrade on the * controller so try the other pg. */ bypass_pg(m, pg, 1); bypass_pg(m, pg, true); break; case SCSI_DH_RETRY: /* Wait before retrying. */ Loading Loading @@ -1224,7 +1225,7 @@ static void pg_init_done(void *data, int errors) m->current_pg = NULL; } } else if (!m->pg_init_required) pg->bypassed = 0; pg->bypassed = false; if (--m->pg_init_in_progress) /* Activations of other paths are still on going */ Loading @@ -1235,7 +1236,7 @@ static void pg_init_done(void *data, int errors) if (__pg_init_all_paths(m)) goto out; } m->queue_io = 0; m->queue_io = false; /* * Wake up any thread waiting to suspend. Loading Loading @@ -1350,7 +1351,7 @@ static void multipath_presuspend(struct dm_target *ti) { struct multipath *m = ti->private; queue_if_no_path(m, 0, 1); queue_if_no_path(m, false, true); } static void multipath_postsuspend(struct dm_target *ti) Loading Loading @@ -1516,10 +1517,10 @@ static int multipath_message(struct dm_target *ti, unsigned argc, char **argv) if (argc == 1) { if (!strcasecmp(argv[0], "queue_if_no_path")) { r = queue_if_no_path(m, 1, 0); r = queue_if_no_path(m, true, false); goto out; } else if (!strcasecmp(argv[0], "fail_if_no_path")) { r = queue_if_no_path(m, 0, 0); r = queue_if_no_path(m, false, false); goto out; } } Loading @@ -1530,10 +1531,10 @@ static int multipath_message(struct dm_target *ti, unsigned argc, char **argv) } if (!strcasecmp(argv[0], "disable_group")) { r = bypass_pg_num(m, argv[1], 1); r = bypass_pg_num(m, argv[1], true); goto out; } else if (!strcasecmp(argv[0], "enable_group")) { r = bypass_pg_num(m, argv[1], 0); r = bypass_pg_num(m, argv[1], false); goto out; } else if (!strcasecmp(argv[0], "switch_group")) { r = switch_pg_num(m, argv[1]); Loading Loading @@ -1651,7 +1652,7 @@ static int __pgpath_busy(struct pgpath *pgpath) */ static int multipath_busy(struct dm_target *ti) { int busy = 0, has_active = 0; bool busy = false, has_active = false; struct multipath *m = ti->private; struct priority_group *pg; struct pgpath *pgpath; Loading @@ -1662,7 +1663,7 @@ static int multipath_busy(struct dm_target *ti) /* pg_init in progress or no paths available */ if (m->pg_init_in_progress || (!m->nr_valid_paths && m->queue_if_no_path)) { busy = 1; busy = true; goto out; } /* Guess which priority_group will be used at next mapping time */ Loading @@ -1684,13 +1685,13 @@ static int multipath_busy(struct dm_target *ti) * If there is one non-busy active path at least, the path selector * will be able to select it. So we consider such a pg as not busy. */ busy = 1; busy = true; list_for_each_entry(pgpath, &pg->pgpaths, list) if (pgpath->is_active) { has_active = 1; has_active = true; if (!__pgpath_busy(pgpath)) { busy = 0; busy = false; break; } } Loading @@ -1701,7 +1702,7 @@ static int multipath_busy(struct dm_target *ti) * the current_pg will be changed at next mapping time. * We need to try mapping to determine it. */ busy = 0; busy = false; out: spin_unlock_irqrestore(&m->lock, flags); Loading Loading
drivers/md/dm-mpath.c +51 −50 Original line number Diff line number Diff line Loading @@ -34,11 +34,12 @@ struct pgpath { struct list_head list; struct priority_group *pg; /* Owning PG */ unsigned is_active; /* Path status */ unsigned fail_count; /* Cumulative failure count */ struct dm_path path; struct delayed_work activate_path; bool is_active:1; /* Path status */ }; #define path_to_pgpath(__pgp) container_of((__pgp), struct pgpath, path) Loading @@ -54,10 +55,10 @@ struct priority_group { struct path_selector ps; unsigned pg_num; /* Reference number */ unsigned bypassed; /* Temporarily bypass this PG? */ unsigned nr_pgpaths; /* Number of paths in PG */ struct list_head pgpaths; bool bypassed:1; /* Temporarily bypass this PG? */ }; /* Multipath context */ Loading @@ -75,20 +76,20 @@ struct multipath { wait_queue_head_t pg_init_wait; /* Wait for pg_init completion */ unsigned pg_init_required; /* pg_init needs calling? */ unsigned pg_init_in_progress; /* Only one pg_init allowed at once */ unsigned pg_init_delay_retry; /* Delay pg_init retry? */ unsigned nr_valid_paths; /* Total number of usable paths */ struct pgpath *current_pgpath; struct priority_group *current_pg; struct priority_group *next_pg; /* Switch to this PG if set */ unsigned queue_io:1; /* Must we queue all I/O? */ unsigned queue_if_no_path:1; /* Queue I/O if last path fails? */ unsigned saved_queue_if_no_path:1; /* Saved state during suspension */ unsigned retain_attached_hw_handler:1; /* If there's already a hw_handler present, don't change it. */ unsigned pg_init_disabled:1; /* pg_init is not currently allowed */ bool queue_io:1; /* Must we queue all I/O? */ bool queue_if_no_path:1; /* Queue I/O if last path fails? */ bool saved_queue_if_no_path:1; /* Saved state during suspension */ bool retain_attached_hw_handler:1; /* If there's already a hw_handler present, don't change it. */ bool pg_init_disabled:1; /* pg_init is not currently allowed */ bool pg_init_required:1; /* pg_init needs calling? */ bool pg_init_delay_retry:1; /* Delay pg_init retry? */ unsigned pg_init_retries; /* Number of times to retry pg_init */ unsigned pg_init_count; /* Number of times pg_init called */ Loading Loading @@ -132,7 +133,7 @@ static struct pgpath *alloc_pgpath(void) struct pgpath *pgpath = kzalloc(sizeof(*pgpath), GFP_KERNEL); if (pgpath) { pgpath->is_active = 1; pgpath->is_active = true; INIT_DELAYED_WORK(&pgpath->activate_path, activate_path); } Loading Loading @@ -189,7 +190,7 @@ static struct multipath *alloc_multipath(struct dm_target *ti, bool use_blk_mq) if (m) { INIT_LIST_HEAD(&m->priority_groups); spin_lock_init(&m->lock); m->queue_io = 1; m->queue_io = true; m->pg_init_delay_msecs = DM_PG_INIT_DELAY_DEFAULT; INIT_WORK(&m->trigger_event, trigger_event); init_waitqueue_head(&m->pg_init_wait); Loading Loading @@ -278,7 +279,7 @@ static int __pg_init_all_paths(struct multipath *m) return 0; m->pg_init_count++; m->pg_init_required = 0; m->pg_init_required = false; /* Check here to reset pg_init_required */ if (!m->current_pg) Loading @@ -304,11 +305,11 @@ static void __switch_pg(struct multipath *m, struct pgpath *pgpath) /* Must we initialise the PG first, and queue I/O till it's ready? */ if (m->hw_handler_name) { m->pg_init_required = 1; m->queue_io = 1; m->pg_init_required = true; m->queue_io = true; } else { m->pg_init_required = 0; m->queue_io = 0; m->pg_init_required = false; m->queue_io = false; } m->pg_init_count = 0; Loading @@ -334,10 +335,10 @@ static int __choose_path_in_pg(struct multipath *m, struct priority_group *pg, static void __choose_pgpath(struct multipath *m, size_t nr_bytes) { struct priority_group *pg; unsigned bypassed = 1; bool bypassed = true; if (!m->nr_valid_paths) { m->queue_io = 0; m->queue_io = false; goto failed; } Loading Loading @@ -365,7 +366,7 @@ static void __choose_pgpath(struct multipath *m, size_t nr_bytes) continue; if (!__choose_path_in_pg(m, pg, nr_bytes)) { if (!bypassed) m->pg_init_delay_retry = 1; m->pg_init_delay_retry = true; return; } } Loading Loading @@ -496,8 +497,8 @@ static void multipath_release_clone(struct request *clone) /* * If we run out of usable paths, should we queue I/O or error it? */ static int queue_if_no_path(struct multipath *m, unsigned queue_if_no_path, unsigned save_old_value) static int queue_if_no_path(struct multipath *m, bool queue_if_no_path, bool save_old_value) { unsigned long flags; Loading Loading @@ -803,12 +804,12 @@ static int parse_features(struct dm_arg_set *as, struct multipath *m) argc--; if (!strcasecmp(arg_name, "queue_if_no_path")) { r = queue_if_no_path(m, 1, 0); r = queue_if_no_path(m, true, false); continue; } if (!strcasecmp(arg_name, "retain_attached_hw_handler")) { m->retain_attached_hw_handler = 1; m->retain_attached_hw_handler = true; continue; } Loading Loading @@ -947,7 +948,7 @@ static void flush_multipath_work(struct multipath *m) unsigned long flags; spin_lock_irqsave(&m->lock, flags); m->pg_init_disabled = 1; m->pg_init_disabled = true; spin_unlock_irqrestore(&m->lock, flags); flush_workqueue(kmpath_handlerd); Loading @@ -956,7 +957,7 @@ static void flush_multipath_work(struct multipath *m) flush_work(&m->trigger_event); spin_lock_irqsave(&m->lock, flags); m->pg_init_disabled = 0; m->pg_init_disabled = false; spin_unlock_irqrestore(&m->lock, flags); } Loading Loading @@ -984,7 +985,7 @@ static int fail_path(struct pgpath *pgpath) DMWARN("Failing path %s.", pgpath->path.dev->name); pgpath->pg->ps.type->fail_path(&pgpath->pg->ps, &pgpath->path); pgpath->is_active = 0; pgpath->is_active = false; pgpath->fail_count++; m->nr_valid_paths--; Loading Loading @@ -1028,7 +1029,7 @@ static int reinstate_path(struct pgpath *pgpath) if (r) goto out; pgpath->is_active = 1; pgpath->is_active = true; if (!m->nr_valid_paths++) { m->current_pgpath = NULL; Loading Loading @@ -1075,7 +1076,7 @@ static int action_dev(struct multipath *m, struct dm_dev *dev, * Temporarily try to avoid having to use the specified PG */ static void bypass_pg(struct multipath *m, struct priority_group *pg, int bypassed) bool bypassed) { unsigned long flags; Loading Loading @@ -1108,7 +1109,7 @@ static int switch_pg_num(struct multipath *m, const char *pgstr) spin_lock_irqsave(&m->lock, flags); list_for_each_entry(pg, &m->priority_groups, list) { pg->bypassed = 0; pg->bypassed = false; if (--pgnum) continue; Loading @@ -1126,7 +1127,7 @@ static int switch_pg_num(struct multipath *m, const char *pgstr) * Set/clear bypassed status of a PG. * PGs are numbered upwards from 1 in the order they were declared. */ static int bypass_pg_num(struct multipath *m, const char *pgstr, int bypassed) static int bypass_pg_num(struct multipath *m, const char *pgstr, bool bypassed) { struct priority_group *pg; unsigned pgnum; Loading @@ -1150,17 +1151,17 @@ static int bypass_pg_num(struct multipath *m, const char *pgstr, int bypassed) /* * Should we retry pg_init immediately? */ static int pg_init_limit_reached(struct multipath *m, struct pgpath *pgpath) static bool pg_init_limit_reached(struct multipath *m, struct pgpath *pgpath) { unsigned long flags; int limit_reached = 0; bool limit_reached = false; spin_lock_irqsave(&m->lock, flags); if (m->pg_init_count <= m->pg_init_retries && !m->pg_init_disabled) m->pg_init_required = 1; m->pg_init_required = true; else limit_reached = 1; limit_reached = true; spin_unlock_irqrestore(&m->lock, flags); Loading @@ -1173,7 +1174,7 @@ static void pg_init_done(void *data, int errors) struct priority_group *pg = pgpath->pg; struct multipath *m = pg->m; unsigned long flags; unsigned delay_retry = 0; bool delay_retry = false; /* device or driver problems */ switch (errors) { Loading @@ -1196,7 +1197,7 @@ static void pg_init_done(void *data, int errors) * Probably doing something like FW upgrade on the * controller so try the other pg. */ bypass_pg(m, pg, 1); bypass_pg(m, pg, true); break; case SCSI_DH_RETRY: /* Wait before retrying. */ Loading Loading @@ -1224,7 +1225,7 @@ static void pg_init_done(void *data, int errors) m->current_pg = NULL; } } else if (!m->pg_init_required) pg->bypassed = 0; pg->bypassed = false; if (--m->pg_init_in_progress) /* Activations of other paths are still on going */ Loading @@ -1235,7 +1236,7 @@ static void pg_init_done(void *data, int errors) if (__pg_init_all_paths(m)) goto out; } m->queue_io = 0; m->queue_io = false; /* * Wake up any thread waiting to suspend. Loading Loading @@ -1350,7 +1351,7 @@ static void multipath_presuspend(struct dm_target *ti) { struct multipath *m = ti->private; queue_if_no_path(m, 0, 1); queue_if_no_path(m, false, true); } static void multipath_postsuspend(struct dm_target *ti) Loading Loading @@ -1516,10 +1517,10 @@ static int multipath_message(struct dm_target *ti, unsigned argc, char **argv) if (argc == 1) { if (!strcasecmp(argv[0], "queue_if_no_path")) { r = queue_if_no_path(m, 1, 0); r = queue_if_no_path(m, true, false); goto out; } else if (!strcasecmp(argv[0], "fail_if_no_path")) { r = queue_if_no_path(m, 0, 0); r = queue_if_no_path(m, false, false); goto out; } } Loading @@ -1530,10 +1531,10 @@ static int multipath_message(struct dm_target *ti, unsigned argc, char **argv) } if (!strcasecmp(argv[0], "disable_group")) { r = bypass_pg_num(m, argv[1], 1); r = bypass_pg_num(m, argv[1], true); goto out; } else if (!strcasecmp(argv[0], "enable_group")) { r = bypass_pg_num(m, argv[1], 0); r = bypass_pg_num(m, argv[1], false); goto out; } else if (!strcasecmp(argv[0], "switch_group")) { r = switch_pg_num(m, argv[1]); Loading Loading @@ -1651,7 +1652,7 @@ static int __pgpath_busy(struct pgpath *pgpath) */ static int multipath_busy(struct dm_target *ti) { int busy = 0, has_active = 0; bool busy = false, has_active = false; struct multipath *m = ti->private; struct priority_group *pg; struct pgpath *pgpath; Loading @@ -1662,7 +1663,7 @@ static int multipath_busy(struct dm_target *ti) /* pg_init in progress or no paths available */ if (m->pg_init_in_progress || (!m->nr_valid_paths && m->queue_if_no_path)) { busy = 1; busy = true; goto out; } /* Guess which priority_group will be used at next mapping time */ Loading @@ -1684,13 +1685,13 @@ static int multipath_busy(struct dm_target *ti) * If there is one non-busy active path at least, the path selector * will be able to select it. So we consider such a pg as not busy. */ busy = 1; busy = true; list_for_each_entry(pgpath, &pg->pgpaths, list) if (pgpath->is_active) { has_active = 1; has_active = true; if (!__pgpath_busy(pgpath)) { busy = 0; busy = false; break; } } Loading @@ -1701,7 +1702,7 @@ static int multipath_busy(struct dm_target *ti) * the current_pg will be changed at next mapping time. * We need to try mapping to determine it. */ busy = 0; busy = false; out: spin_unlock_irqrestore(&m->lock, flags); Loading