When a path is added through a uevent, set the pp->mpp ownership.
A little infrastructure added to help :
o store_pathinfo() now returns the path pointer
o add find_mp_by_wwid()
#define readattr(a,b) \
sysfs_read_attribute_value(a, b, sizeof(b))
-int
+struct path *
store_pathinfo (vector pathvec, vector hwtable, char * devname, int flag)
{
struct path * pp;
pp = alloc_path();
if (!pp)
- return 1;
+ return NULL;
if(safe_sprintf(pp->dev, "%s", devname)) {
fprintf(stderr, "pp->dev too small\n");
pathinfo(pp, hwtable, flag);
- return 0;
+ return pp;
out:
free_path(pp);
- return 1;
+ return NULL;
}
int
path_discovery (vector pathvec, struct config * conf, int flag)
* new path : alloc, store and fetch info
* the caller wants
*/
- if (store_pathinfo(pathvec, conf->hwtable,
+ if (!store_pathinfo(pathvec, conf->hwtable,
devp->name, flag))
goto out;
} else {
int do_tur (char *);
int devt2devname (char *, char *);
int pathinfo (struct path *, vector hwtable, int mask);
-int store_pathinfo (vector pathvec, vector hwtable, char * devname, int flag);
+struct path * store_pathinfo (vector pathvec, vector hwtable,
+ char * devname, int flag);
#if 0
}
struct multipath *
+find_mp_by_wwid (vector mp, char * wwid)
+{
+ int i;
+ struct multipath * mpp;
+
+ vector_foreach_slot (mp, mpp, i)
+ if (!strncmp(mpp->wwid, wwid, WWID_SIZE))
+ return mpp;
+
+ return NULL;
+}
+
+struct multipath *
find_mp (vector mp, char * alias)
{
int i;
int store_pathgroup (vector pgvec, struct pathgroup * pgp);
struct multipath * find_mp (vector mp, char * alias);
+struct multipath * find_mp_by_wwid (vector mp, char * wwid);
+
struct path * find_path_by_devt (vector pathvec, char * devt);
struct path * find_path_by_dev (vector pathvec, char * dev);
r = 1;
if (pp && !strncmp(uev->action, "remove", 6)) {
- condlog(2, "remove %s path checker", devname);
+ log_safe(LOG_NOTICE, "remove %s path checker", devname);
i = find_slot(allpaths->pathvec, (void *)pp);
vector_del_slot(allpaths->pathvec, i);
free_path(pp);
}
if (!pp && !strncmp(uev->action, "add", 3)) {
- condlog(2, "add %s path checker", devname);
- store_pathinfo(allpaths->pathvec, conf->hwtable,
+ log_safe(LOG_NOTICE, "add %s path checker", devname);
+ pp = store_pathinfo(allpaths->pathvec, conf->hwtable,
devname, DI_SYSFS | DI_WWID);
+
+ if (!pp)
+ goto out;
+
+ pp->mpp = find_mp_by_wwid(allpaths->mpvec, pp->wwid);
+ log_safe(LOG_DEBUG, "%s: ownership set to %s",
+ pp->dev_t, pp->mpp->alias);
}
unlock(allpaths->lock);