2 * Copyright (c) 2004, 2005 Christophe Varoqui
3 * Copyright (c) 2004 Stefan Bader, IBM
7 #include <libdevmapper.h>
21 pp = (struct path *)MALLOC(sizeof(struct path));
24 pp->sg_id.host_no = -1;
25 pp->sg_id.channel = -1;
26 pp->sg_id.scsi_id = -1;
34 free_path (struct path * pp)
39 if (pp->checker_context)
40 free(pp->checker_context);
49 free_pathvec (vector vec, int free_paths)
58 vector_foreach_slot(vec, pp, i)
65 alloc_pathgroup (void)
67 struct pathgroup * pgp;
69 pgp = (struct pathgroup *)MALLOC(sizeof(struct pathgroup));
74 pgp->paths = vector_alloc();
83 free_pathgroup (struct pathgroup * pgp, int free_paths)
88 free_pathvec(pgp->paths, free_paths);
93 free_pgvec (vector pgvec, int free_paths)
96 struct pathgroup * pgp;
101 vector_foreach_slot(pgvec, pgp, i)
102 free_pathgroup(pgp, free_paths);
108 alloc_multipath (void)
110 struct multipath * mpp;
112 mpp = (struct multipath *)MALLOC(sizeof(struct multipath));
121 free_multipath_attributes (struct multipath * mpp)
127 mpp->selector != conf->selector &&
128 (!mpp->mpe || (mpp->mpe && mpp->selector != mpp->mpe->selector)) &&
129 (!mpp->hwe || (mpp->hwe && mpp->selector != mpp->hwe->selector))) {
131 mpp->selector = NULL;
135 mpp->features != conf->features &&
136 (!mpp->hwe || (mpp->hwe && mpp->features != mpp->hwe->features))) {
138 mpp->features = NULL;
141 if (mpp->hwhandler &&
142 mpp->hwhandler != conf->default_hwhandler &&
143 (!mpp->hwe || (mpp->hwe && mpp->hwhandler != mpp->hwe->hwhandler))) {
144 FREE(mpp->hwhandler);
145 mpp->hwhandler = NULL;
150 free_multipath (struct multipath * mpp, int free_paths)
155 free_multipath_attributes(mpp);
158 (!mpp->mpe || (mpp->mpe && mpp->alias != mpp->mpe->alias)) &&
159 (mpp->wwid && mpp->alias != mpp->wwid)) {
167 free_pathvec(mpp->paths, free_paths);
168 free_pgvec(mpp->pg, free_paths);
173 drop_multipath (vector mpvec, char * wwid, int free_paths)
176 struct multipath * mpp;
181 vector_foreach_slot (mpvec, mpp, i) {
182 if (!strncmp(mpp->wwid, wwid, WWID_SIZE)) {
183 free_multipath(mpp, free_paths);
184 vector_del_slot(mpvec, i);
191 free_multipathvec (vector mpvec, int free_paths)
194 struct multipath * mpp;
199 vector_foreach_slot (mpvec, mpp, i)
200 free_multipath(mpp, free_paths);
206 store_path (vector pathvec, struct path * pp)
208 if (!vector_alloc_slot(pathvec))
211 vector_set_slot(pathvec, pp);
217 store_pathgroup (vector pgvec, struct pathgroup * pgp)
219 if (!vector_alloc_slot(pgvec))
222 vector_set_slot(pgvec, pgp);
228 find_mp_by_minor (vector mp, int minor)
231 struct multipath * mpp;
233 vector_foreach_slot (mp, mpp, i) {
237 if (mpp->dmi->minor == minor)
244 find_mp_by_wwid (vector mp, char * wwid)
247 struct multipath * mpp;
249 vector_foreach_slot (mp, mpp, i)
250 if (!strncmp(mpp->wwid, wwid, WWID_SIZE))
257 find_mp_by_alias (vector mp, char * alias)
261 struct multipath * mpp;
268 vector_foreach_slot (mp, mpp, i) {
269 if (strlen(mpp->alias) == len &&
270 !strncmp(mpp->alias, alias, len))
277 find_path_by_dev (vector pathvec, char * dev)
282 vector_foreach_slot (pathvec, pp, i)
283 if (!strcmp_chomp(pp->dev, dev))
286 condlog(3, "path %s not found in pathvec\n", dev);
291 find_path_by_devt (vector pathvec, char * dev_t)
296 vector_foreach_slot (pathvec, pp, i)
297 if (!strcmp_chomp(pp->dev_t, dev_t))
300 condlog(3, "path %s not found in pathvec\n", dev_t);
305 pathcount (struct multipath * mpp, int state)
307 struct pathgroup *pgp;
312 vector_foreach_slot (mpp->pg, pgp, i)
313 vector_foreach_slot (pgp->paths, pp, j)
314 if ((pp->state == state) || (state == PATH_WILD))