Lines Matching +full:round +full:- +full:robin
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
10 * Round-robin path selector.
13 #include <linux/device-mapper.h>
15 #include "dm-path-selector.h"
20 #define DM_MSG_PREFIX "multipath round-robin"
25 *---------------------------------------------------------------
26 * Path-handling code, paths are held in lists
27 *---------------------------------------------------------------
40 list_del(&pi->list); in free_paths()
46 *---------------------------------------------------------------
47 * Round-robin selector
48 *---------------------------------------------------------------
61 INIT_LIST_HEAD(&s->valid_paths); in alloc_selector()
62 INIT_LIST_HEAD(&s->invalid_paths); in alloc_selector()
63 spin_lock_init(&s->lock); in alloc_selector()
75 return -ENOMEM; in rr_create()
77 ps->context = s; in rr_create()
83 struct selector *s = ps->context; in rr_destroy()
85 free_paths(&s->valid_paths); in rr_destroy()
86 free_paths(&s->invalid_paths); in rr_destroy()
88 ps->context = NULL; in rr_destroy()
104 pi = path->pscontext; in rr_status()
105 DMEMIT("%u ", pi->repeat_count); in rr_status()
124 struct selector *s = ps->context; in rr_add_path()
131 *error = "round-robin ps: incorrect number of arguments"; in rr_add_path()
132 return -EINVAL; in rr_add_path()
137 *error = "round-robin ps: invalid repeat count"; in rr_add_path()
138 return -EINVAL; in rr_add_path()
149 *error = "round-robin ps: Error allocating path context"; in rr_add_path()
150 return -ENOMEM; in rr_add_path()
153 pi->path = path; in rr_add_path()
154 pi->repeat_count = repeat_count; in rr_add_path()
156 path->pscontext = pi; in rr_add_path()
158 spin_lock_irqsave(&s->lock, flags); in rr_add_path()
159 list_add_tail(&pi->list, &s->valid_paths); in rr_add_path()
160 spin_unlock_irqrestore(&s->lock, flags); in rr_add_path()
168 struct selector *s = ps->context; in rr_fail_path()
169 struct path_info *pi = p->pscontext; in rr_fail_path()
171 spin_lock_irqsave(&s->lock, flags); in rr_fail_path()
172 list_move(&pi->list, &s->invalid_paths); in rr_fail_path()
173 spin_unlock_irqrestore(&s->lock, flags); in rr_fail_path()
179 struct selector *s = ps->context; in rr_reinstate_path()
180 struct path_info *pi = p->pscontext; in rr_reinstate_path()
182 spin_lock_irqsave(&s->lock, flags); in rr_reinstate_path()
183 list_move(&pi->list, &s->valid_paths); in rr_reinstate_path()
184 spin_unlock_irqrestore(&s->lock, flags); in rr_reinstate_path()
192 struct selector *s = ps->context; in rr_select_path()
195 spin_lock_irqsave(&s->lock, flags); in rr_select_path()
196 if (!list_empty(&s->valid_paths)) { in rr_select_path()
197 pi = list_entry(s->valid_paths.next, struct path_info, list); in rr_select_path()
198 list_move_tail(&pi->list, &s->valid_paths); in rr_select_path()
200 spin_unlock_irqrestore(&s->lock, flags); in rr_select_path()
202 return pi ? pi->path : NULL; in rr_select_path()
206 .name = "round-robin",
242 MODULE_DESCRIPTION(DM_NAME " round-robin multipath path selector");
243 MODULE_AUTHOR("Sistina Software <dm-devel@redhat.com>");