2 * Copyright (c) 2004, 2005 Christophe Varoqui
3 * Copyright (c) 2004 Stefan Bader, IBM
7 #include <libdevmapper.h>
17 #include "structs_vec.h"
18 #include "blacklist.h"
25 pp = (struct path *)MALLOC(sizeof(struct path));
28 pp->sg_id.host_no = -1;
29 pp->sg_id.channel = -1;
30 pp->sg_id.scsi_id = -1;
38 free_path (struct path * pp)
43 if (checker_selected(&pp->checker))
44 checker_put(&pp->checker);
53 free_pathvec (vector vec, int free_paths)
62 vector_foreach_slot(vec, pp, i)
69 alloc_pathgroup (void)
71 struct pathgroup * pgp;
73 pgp = (struct pathgroup *)MALLOC(sizeof(struct pathgroup));
78 pgp->paths = vector_alloc();
87 free_pathgroup (struct pathgroup * pgp, int free_paths)
92 free_pathvec(pgp->paths, free_paths);
97 free_pgvec (vector pgvec, int free_paths)
100 struct pathgroup * pgp;
105 vector_foreach_slot(pgvec, pgp, i)
106 free_pathgroup(pgp, free_paths);
112 alloc_multipath (void)
114 struct multipath * mpp;
116 mpp = (struct multipath *)MALLOC(sizeof(struct multipath));
125 free_multipath_attributes (struct multipath * mpp)
131 mpp->selector != conf->selector &&
132 (!mpp->mpe || (mpp->mpe && mpp->selector != mpp->mpe->selector)) &&
133 (!mpp->hwe || (mpp->hwe && mpp->selector != mpp->hwe->selector))) {
135 mpp->selector = NULL;
139 mpp->features != conf->features &&
140 (!mpp->hwe || (mpp->hwe && mpp->features != mpp->hwe->features))) {
142 mpp->features = NULL;
145 if (mpp->hwhandler &&
146 mpp->hwhandler != conf->hwhandler &&
147 (!mpp->hwe || (mpp->hwe && mpp->hwhandler != mpp->hwe->hwhandler))) {
148 FREE(mpp->hwhandler);
149 mpp->hwhandler = NULL;
154 free_multipath (struct multipath * mpp, int free_paths)
159 free_multipath_attributes(mpp);
162 (!mpp->mpe || (mpp->mpe && mpp->alias != mpp->mpe->alias)) &&
163 (mpp->wwid && mpp->alias != mpp->wwid)) {
173 * better own vecs->lock here
176 ((struct event_thread *)mpp->waiter)->mpp = NULL;
179 free_pathvec(mpp->paths, free_paths);
180 free_pgvec(mpp->pg, free_paths);
185 drop_multipath (vector mpvec, char * wwid, int free_paths)
188 struct multipath * mpp;
193 vector_foreach_slot (mpvec, mpp, i) {
194 if (!strncmp(mpp->wwid, wwid, WWID_SIZE)) {
195 free_multipath(mpp, free_paths);
196 vector_del_slot(mpvec, i);
203 free_multipathvec (vector mpvec, int free_paths)
206 struct multipath * mpp;
211 vector_foreach_slot (mpvec, mpp, i)
212 free_multipath(mpp, free_paths);
218 store_path (vector pathvec, struct path * pp)
220 if (!vector_alloc_slot(pathvec))
223 vector_set_slot(pathvec, pp);
229 store_pathgroup (vector pgvec, struct pathgroup * pgp)
231 if (!vector_alloc_slot(pgvec))
234 vector_set_slot(pgvec, pgp);
240 find_mp_by_minor (vector mpvec, int minor)
243 struct multipath * mpp;
248 vector_foreach_slot (mpvec, mpp, i) {
252 if (mpp->dmi->minor == minor)
259 find_mp_by_wwid (vector mpvec, char * wwid)
262 struct multipath * mpp;
267 vector_foreach_slot (mpvec, mpp, i)
268 if (!strncmp(mpp->wwid, wwid, WWID_SIZE))
275 find_mp_by_alias (vector mpvec, char * alias)
279 struct multipath * mpp;
289 vector_foreach_slot (mpvec, mpp, i) {
290 if (strlen(mpp->alias) == len &&
291 !strncmp(mpp->alias, alias, len))
298 find_mp_by_str (vector mpvec, char * str)
302 if (sscanf(str, "dm-%d", &minor) == 1)
303 return find_mp_by_minor(mpvec, minor);
305 return find_mp_by_alias(mpvec, str);
309 find_path_by_dev (vector pathvec, char * dev)
317 vector_foreach_slot (pathvec, pp, i)
318 if (!strcmp_chomp(pp->dev, dev))
321 condlog(3, "%s: not found in pathvec", dev);
326 find_path_by_devt (vector pathvec, char * dev_t)
334 vector_foreach_slot (pathvec, pp, i)
335 if (!strcmp_chomp(pp->dev_t, dev_t))
338 condlog(3, "%s: not found in pathvec", dev_t);
343 pathcount (struct multipath * mpp, int state)
345 struct pathgroup *pgp;
350 vector_foreach_slot (mpp->pg, pgp, i)
351 vector_foreach_slot (pgp->paths, pp, j)
352 if ((pp->state == state) || (state < 0))