[multipathd]
authorroot <root@xa-s05.(none)>
Mon, 16 May 2005 21:04:53 +0000 (23:04 +0200)
committerroot <root@xa-s05.(none)>
Mon, 16 May 2005 21:04:53 +0000 (23:04 +0200)
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()

libmultipath/discovery.c
libmultipath/discovery.h
libmultipath/structs.c
libmultipath/structs.h
multipathd/main.c

index d2d31a3..0a88f04 100644 (file)
@@ -21,7 +21,7 @@
 #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;
@@ -29,7 +29,7 @@ store_pathinfo (vector pathvec, vector hwtable, char * devname, int flag)
        pp = alloc_path();
 
        if (!pp)
-               return 1;
+               return NULL;
 
        if(safe_sprintf(pp->dev, "%s", devname)) {
                fprintf(stderr, "pp->dev too small\n");
@@ -40,10 +40,10 @@ store_pathinfo (vector pathvec, vector hwtable, char * devname, int flag)
 
        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)
@@ -81,7 +81,7 @@ 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 {
index 14f9573..c43d0ac 100644 (file)
@@ -34,7 +34,8 @@ int get_serial (char * buff, int fd);
 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
index 01fc542..95dcad1 100644 (file)
@@ -182,6 +182,19 @@ store_pathgroup (vector pgvec, struct pathgroup * pgp)
 }
 
 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;
index f368e18..ce2534d 100644 (file)
@@ -128,6 +128,8 @@ int store_path (vector pathvec, struct path * pp);
 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);
 
index ab7f20a..f24d168 100644 (file)
@@ -148,15 +148,22 @@ uev_trigger (struct uevent * uev, void * trigger_data)
        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);