Imported Upstream version 0.8.9
[platform/upstream/multipath-tools.git] / libmultipath / structs.c
index 464596f..4b62da5 100644 (file)
@@ -8,7 +8,6 @@
 #include <libudev.h>
 
 #include "checkers.h"
-#include "memory.h"
 #include "vector.h"
 #include "util.h"
 #include "structs.h"
 #include "prio.h"
 #include "prioritizers/alua_spc3.h"
 #include "dm-generic.h"
+#include "devmapper.h"
 
 struct adapter_group *
 alloc_adaptergroup(void)
 {
        struct adapter_group *agp;
 
-       agp = (struct adapter_group *)MALLOC(sizeof(struct adapter_group));
+       agp = (struct adapter_group *)calloc(1, sizeof(struct adapter_group));
 
        if (!agp)
                return NULL;
 
        agp->host_groups = vector_alloc();
        if (!agp->host_groups) {
-               FREE(agp);
+               free(agp);
                agp = NULL;
        }
        return agp;
@@ -45,7 +45,7 @@ void free_adaptergroup(vector adapters)
 
        vector_foreach_slot(adapters, agp, i) {
                free_hostgroup(agp->host_groups);
-               FREE(agp);
+               free(agp);
        }
        vector_free(adapters);
 }
@@ -60,7 +60,7 @@ void free_hostgroup(vector hostgroups)
 
        vector_foreach_slot(hostgroups, hgp, i) {
                vector_free(hgp->paths);
-               FREE(hgp);
+               free(hgp);
        }
        vector_free(hostgroups);
 }
@@ -70,7 +70,7 @@ alloc_hostgroup(void)
 {
        struct host_group *hgp;
 
-       hgp = (struct host_group *)MALLOC(sizeof(struct host_group));
+       hgp = (struct host_group *)calloc(1, sizeof(struct host_group));
 
        if (!hgp)
                return NULL;
@@ -78,7 +78,7 @@ alloc_hostgroup(void)
        hgp->paths = vector_alloc();
 
        if (!hgp->paths) {
-               FREE(hgp);
+               free(hgp);
                hgp = NULL;
        }
        return hgp;
@@ -89,14 +89,14 @@ alloc_path (void)
 {
        struct path * pp;
 
-       pp = (struct path *)MALLOC(sizeof(struct path));
+       pp = (struct path *)calloc(1, sizeof(struct path));
 
        if (pp) {
                pp->initialized = INIT_NEW;
                pp->sg_id.host_no = -1;
                pp->sg_id.channel = -1;
                pp->sg_id.scsi_id = -1;
-               pp->sg_id.lun = -1;
+               pp->sg_id.lun = SCSI_INVALID_LUN;
                pp->sg_id.proto_id = SCSI_PROTOCOL_UNSPEC;
                pp->fd = -1;
                pp->tpgs = TPGS_UNDEF;
@@ -152,7 +152,7 @@ free_path (struct path * pp)
 
        vector_free(pp->hwe);
 
-       FREE(pp);
+       free(pp);
 }
 
 void
@@ -176,7 +176,7 @@ alloc_pathgroup (void)
 {
        struct pathgroup * pgp;
 
-       pgp = (struct pathgroup *)MALLOC(sizeof(struct pathgroup));
+       pgp = (struct pathgroup *)calloc(1, sizeof(struct pathgroup));
 
        if (!pgp)
                return NULL;
@@ -184,7 +184,7 @@ alloc_pathgroup (void)
        pgp->paths = vector_alloc();
 
        if (!pgp->paths) {
-               FREE(pgp);
+               free(pgp);
                return NULL;
        }
 
@@ -199,7 +199,7 @@ free_pathgroup (struct pathgroup * pgp, enum free_path_mode free_paths)
                return;
 
        free_pathvec(pgp->paths, free_paths);
-       FREE(pgp);
+       free(pgp);
 }
 
 void
@@ -222,7 +222,7 @@ alloc_multipath (void)
 {
        struct multipath * mpp;
 
-       mpp = (struct multipath *)MALLOC(sizeof(struct multipath));
+       mpp = (struct multipath *)calloc(1, sizeof(struct multipath));
 
        if (mpp) {
                mpp->bestpg = 1;
@@ -234,23 +234,34 @@ alloc_multipath (void)
        return mpp;
 }
 
+void *set_mpp_hwe(struct multipath *mpp, const struct path *pp)
+{
+       if (!mpp || !pp || !pp->hwe)
+               return NULL;
+       if (mpp->hwe)
+               return mpp->hwe;
+       mpp->hwe = vector_convert(NULL, pp->hwe,
+                                 struct hwentry, identity);
+       return mpp->hwe;
+}
+
 void free_multipath_attributes(struct multipath *mpp)
 {
        if (!mpp)
                return;
 
        if (mpp->selector) {
-               FREE(mpp->selector);
+               free(mpp->selector);
                mpp->selector = NULL;
        }
 
        if (mpp->features) {
-               FREE(mpp->features);
+               free(mpp->features);
                mpp->features = NULL;
        }
 
        if (mpp->hwhandler) {
-               FREE(mpp->hwhandler);
+               free(mpp->hwhandler);
                mpp->hwhandler = NULL;
        }
 }
@@ -264,15 +275,10 @@ free_multipath (struct multipath * mpp, enum free_path_mode free_paths)
        free_multipath_attributes(mpp);
 
        if (mpp->alias) {
-               FREE(mpp->alias);
+               free(mpp->alias);
                mpp->alias = NULL;
        }
 
-       if (mpp->dmi) {
-               FREE(mpp->dmi);
-               mpp->dmi = NULL;
-       }
-
        if (!free_paths && mpp->pg) {
                struct pathgroup *pgp;
                struct path *pp;
@@ -290,8 +296,12 @@ free_multipath (struct multipath * mpp, enum free_path_mode free_paths)
 
        free_pathvec(mpp->paths, free_paths);
        free_pgvec(mpp->pg, free_paths);
-       FREE_PTR(mpp->mpcontext);
-       FREE(mpp);
+       if (mpp->hwe) {
+               vector_free(mpp->hwe);
+               mpp->hwe = NULL;
+       }
+       free(mpp->mpcontext);
+       free(mpp);
 }
 
 void
@@ -393,10 +403,10 @@ find_mp_by_minor (const struct _vector *mpvec, unsigned int minor)
                return NULL;
 
        vector_foreach_slot (mpvec, mpp, i) {
-               if (!mpp->dmi)
+               if (!has_dm_info(mpp))
                        continue;
 
-               if (mpp->dmi->minor == minor)
+               if (mpp->dmi.minor == minor)
                        return mpp;
        }
        return NULL;
@@ -453,12 +463,12 @@ find_mp_by_str (const struct _vector *mpvec, const char * str)
 }
 
 struct path *
-find_path_by_dev (const struct _vector *pathvec, const char * dev)
+find_path_by_dev (const struct _vector *pathvec, const char *dev)
 {
        int i;
        struct path * pp;
 
-       if (!pathvec)
+       if (!pathvec || !dev)
                return NULL;
 
        vector_foreach_slot (pathvec, pp, i)
@@ -618,7 +628,7 @@ int add_feature(char **f, const char *n)
        for (d = c; d >= 10; d /= 10)
                l++;
 
-       t = MALLOC(l + 1);
+       t = calloc(1, l + 1);
        if (!t)
                return 1;
 
@@ -629,7 +639,7 @@ int add_feature(char **f, const char *n)
 
        snprintf(t, l + 1, "%0d%s %s", c, e, n);
 
-       FREE(*f);
+       free(*f);
        *f = t;
 
        return 0;
@@ -681,7 +691,7 @@ int remove_feature(char **f, const char *o)
 
        /* Quick exit if all features have been removed */
        if (c == 0) {
-               n = MALLOC(2);
+               n = malloc(2);
                if (!n)
                        return 1;
                strcpy(n, "0");
@@ -696,7 +706,7 @@ int remove_feature(char **f, const char *o)
 
        /* Update feature count space */
        l = strlen(*f) - d;
-       n =  MALLOC(l + 1);
+       n =  malloc(l + 1);
        if (!n)
                return 1;
 
@@ -709,7 +719,7 @@ int remove_feature(char **f, const char *o)
        p = strchr(*f, ' ');
        if (!p) {
                /* Internal error, feature string inconsistent */
-               FREE(n);
+               free(n);
                return 1;
        }
        while (*p == ' ')
@@ -738,8 +748,18 @@ int remove_feature(char **f, const char *o)
        }
 
 out:
-       FREE(*f);
+       free(*f);
        *f = n;
 
        return 0;
 }
+
+unsigned int bus_protocol_id(const struct path *pp) {
+       if (!pp || pp->bus < 0 || pp->bus > SYSFS_BUS_SCSI)
+               return SYSFS_BUS_UNDEF;
+       if (pp->bus != SYSFS_BUS_SCSI)
+               return pp->bus;
+       if ((int)pp->sg_id.proto_id < 0 || pp->sg_id.proto_id > SCSI_PROTOCOL_UNSPEC)
+               return SYSFS_BUS_UNDEF;
+       return SYSFS_BUS_SCSI + pp->sg_id.proto_id;
+}