Since these macros exit, now need to call mad_rpc_close_port
prior to invoking them

Also, some cosmetic formatting changes

Signed-off-by: Hal Rosenstock <[email protected]>

---
diff --git a/infiniband-diags/src/grouping.c b/infiniband-diags/src/grouping.c
index 0c30726..24c33ad 100644
--- a/infiniband-diags/src/grouping.c
+++ b/infiniband-diags/src/grouping.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2004-2007 Voltaire Inc.  All rights reserved.
  * Copyright (c) 2007 Xsigo Systems Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -55,6 +56,7 @@ extern Node *nodesdist[MAXHOPS+1];    /* last is CA list */
 extern Node *mynode;
 extern Port *myport;
 extern int maxhops_discovered;
+extern struct ibmad_port *srcport;
 
 AllChassisList mylist;
 
@@ -302,7 +304,9 @@ static void get_sfb_slot(Node *node, Port *lineport)
                ch->slotnum = spine4_slot_2_slb[lineport->portnum];
                ch->anafanum = anafa_spine4_slot_2_slb[lineport->portnum];
        } else {
-               IBPANIC("Unexpected node found: guid 0x%016" PRIx64, 
node->nodeguid);
+               mad_rpc_close_port(srcport);
+               IBPANIC("Unexpected node found: guid 0x%016" PRIx64,
+                       node->nodeguid);
        }
 }
 
@@ -312,8 +316,10 @@ static void get_router_slot(Node *node, Port *spineport)
        uint64_t guessnum = 0;
 
        if (!ch) {
-               if (!(node->chrecord = calloc(1, sizeof(ChassisRecord))))
+               if (!(node->chrecord = calloc(1, sizeof(ChassisRecord)))) {
+                       mad_rpc_close_port(srcport);
                        IBPANIC("out of mem");
+               }
                ch = node->chrecord;
        }
 
@@ -345,7 +351,9 @@ static void get_router_slot(Node *node, Port *spineport)
                ch->slotnum = line_slot_2_sfb4[spineport->portnum];
                ch->anafanum = ipr_slot_2_sfb4_port[spineport->portnum];
        } else {
-               IBPANIC("Unexpected node found: guid 0x%016" PRIx64, 
spineport->node->nodeguid);
+               mad_rpc_close_port(srcport);
+               IBPANIC("Unexpected node found: guid 0x%016" PRIx64,
+                       spineport->node->nodeguid);
        }
 }
 
@@ -369,7 +377,9 @@ static void get_slb_slot(ChassisRecord *ch, Port *spineport)
                ch->slotnum = line_slot_2_sfb4[spineport->portnum];
                ch->anafanum = anafa_line_slot_2_sfb4[spineport->portnum];
        } else {
-               IBPANIC("Unexpected node found: guid 0x%016" PRIx64, 
spineport->node->nodeguid);
+               mad_rpc_close_port(srcport);
+               IBPANIC("Unexpected node found: guid 0x%016" PRIx64,
+                       spineport->node->nodeguid);
        }
 }
 
@@ -387,8 +397,10 @@ static void fill_chassis_record(Node *node)
        if (node->chrecord) /* somehow this node has already been passed */
                return;
 
-       if (!(node->chrecord = calloc(1, sizeof(ChassisRecord))))
+       if (!(node->chrecord = calloc(1, sizeof(ChassisRecord)))) {
+               mad_rpc_close_port(srcport);
                IBPANIC("out of mem");
+       }
 
        ch = node->chrecord;
 
@@ -433,8 +445,10 @@ static int get_line_index(Node *node)
 {
        int retval = 3 * (node->chrecord->slotnum - 1) + 
node->chrecord->anafanum;
 
-       if (retval > LINES_MAX_NUM || retval < 1)
+       if (retval > LINES_MAX_NUM || retval < 1) {
+               mad_rpc_close_port(srcport);
                IBPANIC("Internal error");
+       }
        return retval;
 }
 
@@ -447,8 +461,10 @@ static int get_spine_index(Node *node)
        else
                retval = node->chrecord->slotnum;
 
-       if (retval > SPINES_MAX_NUM || retval < 1)
+       if (retval > SPINES_MAX_NUM || retval < 1) {
+               mad_rpc_close_port(srcport);
                IBPANIC("Internal error");
+       }
        return retval;
 }
 
@@ -677,8 +693,10 @@ char *portmapstring(Port *port)
 
 static void add_chassislist()
 {
-       if (!(mylist.current = calloc(1, sizeof(ChassisList))))
+       if (!(mylist.current = calloc(1, sizeof(ChassisList)))) {
+               mad_rpc_close_port(srcport);
                IBPANIC("out of mem");
+       }
 
        if (mylist.first == NULL) {
                mylist.first = mylist.current;
@@ -768,8 +786,10 @@ ChassisList *group_nodes()
                                        if (!chassis->chassisnum)
                                                chassis->chassisnum = 
++chassisnum;
                                        if (!node->chrecord) {
-                                               if (!(node->chrecord = 
calloc(1, sizeof(ChassisRecord))))
+                                               if (!(node->chrecord = 
calloc(1, sizeof(ChassisRecord)))) {
+                                                       
mad_rpc_close_port(srcport);
                                                        IBPANIC("out of mem");
+                                               }
                                                node->chrecord->chassisnum = 
chassis->chassisnum;
                                        }
                                }
diff --git a/infiniband-diags/src/ibaddr.c b/infiniband-diags/src/ibaddr.c
index bb22be9..99bd33f 100644
--- a/infiniband-diags/src/ibaddr.c
+++ b/infiniband-diags/src/ibaddr.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -145,15 +146,21 @@ int main(int argc, char **argv)
 
        if (argc) {
                if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                                               ibd_sm_id, srcport) < 0)
+                                               ibd_sm_id, srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't resolve destination port %s", argv[0]);
+               }
        } else {
-               if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0)
+               if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't resolve self port %s", argv[0]);
+               }
        }
 
-       if (ib_resolve_addr(&portid, port, show_lid, show_gid) < 0)
+       if (ib_resolve_addr(&portid, port, show_lid, show_gid) < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't resolve requested address");
+       }
 
        mad_rpc_close_port(srcport);
        exit(0);
diff --git a/infiniband-diags/src/ibnetdiscover.c 
b/infiniband-diags/src/ibnetdiscover.c
index 25c1f7f..ecb2956 100644
--- a/infiniband-diags/src/ibnetdiscover.c
+++ b/infiniband-diags/src/ibnetdiscover.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
  * Copyright (c) 2007 Xsigo Systems Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -136,7 +137,6 @@ decode_port_info(void *pi, Port *port)
        mad_decode_field(pi, IB_PORT_LINK_SPEED_ACTIVE_F, &port->linkspeed);
 }
 
-
 int
 get_port(Port *port, int portnum, ib_portid_t *portid)
 {
@@ -146,12 +146,14 @@ get_port(Port *port, int portnum, ib_portid_t *portid)
        port->portnum = portnum;
 
        if (!smp_query_via(pi, portid, IB_ATTR_PORT_INFO, portnum, timeout,
-                       srcport))
+                          srcport))
                return -1;
        decode_port_info(pi, port);
 
        DEBUG("portid %s portnum %d: lid %d state %d physstate %d %s %s",
-               portid2str(portid), portnum, port->lid, port->state, 
port->physstate, get_linkwidth_str(port->linkwidth), 
get_linkspeed_str(port->linkspeed));
+             portid2str(portid), portnum, port->lid, port->state,
+             port->physstate, get_linkwidth_str(port->linkwidth),
+             get_linkspeed_str(port->linkspeed));
        return 1;
 }
 /*
@@ -314,8 +316,8 @@ static void
 link_ports(Node *node, Port *port, Node *remotenode, Port *remoteport)
 {
        DEBUG("linking: 0x%" PRIx64 " %p->%p:%u and 0x%" PRIx64 " %p->%p:%u",
-               node->nodeguid, node, port, port->portnum,
-               remotenode->nodeguid, remotenode, remoteport, 
remoteport->portnum);
+             node->nodeguid, node, port, port->portnum,
+             remotenode->nodeguid, remotenode, remoteport, 
remoteport->portnum);
        if (port->remoteport)
                port->remoteport->remoteport = NULL;
        if (remoteport->remoteport)
@@ -352,16 +354,20 @@ handle_port(Node *node, Port *port, ib_portid_t *path, 
int portnum, int dist)
        oldnode = find_node(&node_buf);
        if (oldnode)
                remotenode = oldnode;
-       else if (!(remotenode = create_node(&node_buf, path, dist + 1)))
+       else if (!(remotenode = create_node(&node_buf, path, dist + 1))) {
+               mad_rpc_close_port(srcport);
                IBERROR("no memory");
+       }
 
        oldport = find_port(remotenode, &port_buf);
        if (oldport) {
                remoteport = oldport;
                if (node != remotenode || port != remoteport)
                        IBWARN("port moving...");
-       } else if (!(remoteport = create_port(remotenode, &port_buf)))
+       } else if (!(remoteport = create_port(remotenode, &port_buf))) {
+               mad_rpc_close_port(srcport);
                IBERROR("no memory");
+       }
 
        dump_endnode(path, oldnode ? "known remote" : "new remote",
                     remotenode, remoteport);
@@ -397,14 +403,18 @@ discover(ib_portid_t *from)
        }
 
        node = create_node(&node_buf, from, 0);
-       if (!node)
+       if (!node) {
+               mad_rpc_close_port(srcport);
                IBERROR("out of memory");
+       }
 
        mynode = node;
 
        port = create_port(node, &port_buf);
-       if (!port)
+       if (!port) {
+               mad_rpc_close_port(srcport);
                IBERROR("out of memory");
+       }
 
        if (node->type != SWITCH_NODE &&
            handle_port(node, port, from, node->localport, 0) < 0)
@@ -424,7 +434,8 @@ discover(ib_portid_t *from)
                                        continue;
 
                                if (get_port(&port_buf, i, path) < 0) {
-                                       IBWARN("can't reach node %s port %d", 
portid2str(path), i);
+                                       IBWARN("can't reach node %s port %d",
+                                              portid2str(path), i);
                                        continue;
                                }
 
@@ -433,8 +444,10 @@ discover(ib_portid_t *from)
                                        continue;
 
                                port = create_port(node, &port_buf);
-                               if (!port)
+                               if (!port) {
+                                       mad_rpc_close_port(srcport);
                                        IBERROR("out of memory");
+                               }
 
                                /* If switch, set port GUID to node GUID */
                                if (node->type == SWITCH_NODE)
@@ -477,7 +490,7 @@ list_node(Node *node)
 {
        char *node_type;
        char *nodename = remap_node_name(node_name_map, node->nodeguid,
-                                             node->nodedesc);
+                                        node->nodedesc);
 
        switch(node->type) {
        case SWITCH_NODE:
@@ -494,9 +507,8 @@ list_node(Node *node)
                break;
        }
        fprintf(f, "%s\t : 0x%016" PRIx64 " ports %d devid 0x%x vendid 0x%x 
\"%s\"\n",
-               node_type,
-               node->nodeguid, node->numports, node->devid, node->vendid,
-               nodename);
+               node_type, node->nodeguid, node->numports, node->devid,
+               node->vendid, nodename);
 
        free(nodename);
 }
@@ -550,15 +562,15 @@ out_switch(Node *node, int group, char *chname)
                str = get_chassis_slot(node->chrecord->chassisslot);
                if (str)
                        fprintf(f, "%s ", str);
-               fprintf(f, "%d Chip %d", node->chrecord->slotnum, 
node->chrecord->anafanum);
+               fprintf(f, "%d Chip %d", node->chrecord->slotnum,
+                       node->chrecord->anafanum);
        }
 
        nodename = remap_node_name(node_name_map, node->nodeguid,
-                               node->nodedesc);
+                                  node->nodedesc);
 
        fprintf(f, "\nSwitch\t%d %s\t\t# \"%s\" %s port 0 lid %d lmc %d\n",
-               node->numports, node_name(node),
-               nodename,
+               node->numports, node_name(node), nodename,
                node->smaenhsp0 ? "enhanced" : "base",
                node->smalid, node->smalmc);
 
@@ -571,7 +583,7 @@ out_ca(Node *node, int group, char *chname)
        char *node_type;
        char *node_type2;
        char *nodename = remap_node_name(node_name_map, node->nodeguid,
-                                             node->nodedesc);
+                                        node->nodedesc);
 
        out_ids(node, group, chname);
        switch(node->type) {
@@ -591,8 +603,7 @@ out_ca(Node *node, int group, char *chname)
 
        fprintf(f, "%sguid=0x%" PRIx64 "\n", node_type, node->nodeguid);
        fprintf(f, "%s\t%d %s\t\t# \"%s\"",
-               node_type2, node->numports, node_name(node),
-               nodename);
+               node_type2, node->numports, node_name(node), nodename);
        if (group && is_xsigo_hca(node->nodeguid))
                fprintf(f, " (scp)");
        fprintf(f, "\n");
@@ -627,8 +638,8 @@ out_switch_port(Port *port, int group)
                fprintf(f, "%s", ext_port_str);
 
        rem_nodename = remap_node_name(node_name_map,
-                               port->remoteport->node->nodeguid,
-                               port->remoteport->node->nodedesc);
+                                      port->remoteport->node->nodeguid,
+                                      port->remoteport->node->nodedesc);
 
        ext_port_str = out_ext_port(port->remoteport, group);
        fprintf(f, "\t%s[%d]%s",
@@ -671,8 +682,8 @@ out_ca_port(Port *port, int group)
                fprintf(f, " (%" PRIx64 ") ", port->remoteport->portguid);
 
        rem_nodename = remap_node_name(node_name_map,
-                               port->remoteport->node->nodeguid,
-                               port->remoteport->node->nodedesc);
+                                      port->remoteport->node->nodeguid,
+                                      port->remoteport->node->nodedesc);
 
        fprintf(f, "\t\t# lid %d lmc %d \"%s\" lid %d %s%s\n",
                port->lid, port->lmc, rem_nodename,
@@ -696,7 +707,8 @@ dump_topology(int listtype, int group)
        if (!listtype) {
                fprintf(f, "#\n# Topology file: generated on %s#\n", ctime(&t));
                fprintf(f, "# Max of %d hops discovered\n", maxhops_discovered);
-               fprintf(f, "# Initiated from node %016" PRIx64 " port %016" 
PRIx64 "\n", mynode->nodeguid, mynode->portguid);
+               fprintf(f, "# Initiated from node %016" PRIx64 " port %016" 
PRIx64 "\n",
+                       mynode->nodeguid, mynode->portguid);
        }
 
        /* Make pass on switches */
@@ -1007,8 +1019,10 @@ int main(int argc, char **argv)
 
        node_name_map = open_node_name_map(node_name_map_file);
 
-       if (discover(&my_portid) < 0)
+       if (discover(&my_portid) < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("discover");
+       }
 
        if (group)
                chassis = group_nodes();
diff --git a/infiniband-diags/src/ibping.c b/infiniband-diags/src/ibping.c
index 901079f..fb9772c 100644
--- a/infiniband-diags/src/ibping.c
+++ b/infiniband-diags/src/ibping.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -215,22 +216,31 @@ int main(int argc, char **argv)
                IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port);
 
        if (server) {
-               if (mad_register_server_via(ping_class, 0, 0, oui, srcport) < 0)
+               if (mad_register_server_via(ping_class, 0, 0, oui, srcport) < 
0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't serve class %d on this port", 
ping_class);
+               }
 
                get_host_and_domain(host_and_domain, sizeof host_and_domain);
 
-               if ((err = ibping_serv()))
+               if ((err = ibping_serv())) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("ibping to %s: %s", portid2str(&portid), err);
+               }
+               mad_rpc_close_port(srcport);
                exit(0);
        }
 
-       if (mad_register_client_via(ping_class, 0, srcport) < 0)
+       if (mad_register_client_via(ping_class, 0, srcport) < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't register ping class %d on this port", 
ping_class);
+       }
 
        if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                                       ibd_sm_id, srcport) < 0)
+                                       ibd_sm_id, srcport) < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't resolve destination port %s", argv[0]);
+       }
 
        signal(SIGINT, report);
        signal(SIGTERM, report);
diff --git a/infiniband-diags/src/ibportstate.c 
b/infiniband-diags/src/ibportstate.c
index 65c9ca1..c23ce84 100644
--- a/infiniband-diags/src/ibportstate.c
+++ b/infiniband-diags/src/ibportstate.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -230,8 +231,10 @@ int main(int argc, char **argv)
                IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port);
 
        if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                               ibd_sm_id, srcport) < 0)
+                               ibd_sm_id, srcport) < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't resolve destination port %s", argv[0]);
+       }
 
        /* First, make sure it is a switch port if it is a "set" */
        if (argc >= 3) {
@@ -242,24 +245,32 @@ int main(int argc, char **argv)
                else if (!strcmp(argv[2], "reset"))
                        port_op = 3;
                else if (!strcmp(argv[2], "speed")) {
-                       if (argc < 4)
+                       if (argc < 4) {
+                               mad_rpc_close_port(srcport);
                                IBERROR("speed requires an additional 
parameter");
+                       }
                        port_op = 4;
                        /* Parse speed value */
                        speed = strtoul(argv[3], 0, 0);
-                       if (speed > 15)
+                       if (speed > 15) {
+                               mad_rpc_close_port(srcport);
                                IBERROR("invalid speed value %d", speed);
+                       }
                }
        }
 
        err = get_node_info(&portid, data);
-       if (err < 0)
+       if (err < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("smp query nodeinfo failed");
+       }
        if (err) {              /* not switch */
                if (port_op == 0)       /* query op */
                        is_switch = 0;
-               else if (port_op != 4)  /* other than speed op */
+               else if (port_op != 4) {        /* other than speed op */
+                       mad_rpc_close_port(srcport);
                        IBERROR("smp query nodeinfo: Node type not switch");
+               }
        }
 
        if (argc-1 > 0)
@@ -270,8 +281,10 @@ int main(int argc, char **argv)
        else
                printf("PortInfo:\n");
        err = get_port_info(&portid, data, portnum, port_op);
-       if (err < 0)
+       if (err < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("smp query portinfo failed");
+       }
 
        /* Only if one of the "set" options is chosen */
        if (port_op) {
@@ -287,14 +300,18 @@ int main(int argc, char **argv)
                }
 
                err = set_port_info(&portid, data, portnum, port_op);
-               if (err < 0)
+               if (err < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("smp set portinfo failed");
+               }
 
                if (port_op == 3) {     /* Reset port - so also enable */
                        mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 2);        
/* Polling */
                        err = set_port_info(&portid, data, portnum, port_op);
-                       if (err < 0)
+                       if (err < 0) {
+                               mad_rpc_close_port(srcport);
                                IBERROR("smp set portinfo failed");
+                       }
                }
        } else {        /* query op */
                /* only compare peer port if switch port */
@@ -320,23 +337,29 @@ int main(int argc, char **argv)
 
                                        /* Set DrSLID to local lid */
                                        if (ib_resolve_self_via(&selfportid,
-                                                       &selfport, 0, srcport) 
< 0)
+                                                       &selfport, 0, srcport) 
< 0) {
+                                               mad_rpc_close_port(srcport);
                                                IBERROR("could not resolve 
self");
+                                       }
                                        peerportid.drpath.drslid = (uint16_t) 
selfportid.lid;
                                        peerportid.drpath.drdlid = 0xffff;
 
                                        /* Get peer port NodeInfo to obtain 
peer port number */
                                        err = get_node_info(&peerportid, data);
-                                       if (err < 0)
+                                       if (err < 0) {
+                                               mad_rpc_close_port(srcport);
                                                IBERROR("smp query nodeinfo 
failed");
+                                       }
 
                                        mad_decode_field(data, 
IB_NODE_LOCAL_PORT_F, &peerlocalportnum);
 
                                        printf("Peer PortInfo:\n");
                                        /* Get peer port characteristics */
                                        err = get_port_info(&peerportid, data, 
peerlocalportnum, port_op);
-                                       if (err < 0)
+                                       if (err < 0) {
+                                               mad_rpc_close_port(srcport);
                                                IBERROR("smp query peer 
portinfofailed");
+                                       }
 
                                        mad_decode_field(data, 
IB_PORT_LINK_WIDTH_ENABLED_F, &peerlwe );
                                        mad_decode_field(data, 
IB_PORT_LINK_WIDTH_SUPPORTED_F, &peerlws);
diff --git a/infiniband-diags/src/ibroute.c b/infiniband-diags/src/ibroute.c
index 31b8e4c..feab823 100644
--- a/infiniband-diags/src/ibroute.c
+++ b/infiniband-diags/src/ibroute.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -413,19 +414,25 @@ int main(int argc, char **argv)
                IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port);
 
        if (!argc) {
-               if (ib_resolve_self_via(&portid, 0, 0, srcport) < 0)
+               if (ib_resolve_self_via(&portid, 0, 0, srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't resolve self addr");
+               }
        } else if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                       ibd_sm_id, srcport) < 0)
+                       ibd_sm_id, srcport) < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't resolve destination port %s", argv[1]);
+       }
 
        if (multicast)
                err = dump_multicast_tables(&portid, startlid, endlid);
        else
                err = dump_unicast_tables(&portid, startlid, endlid);
 
-       if (err)
+       if (err) {
+               mad_rpc_close_port(srcport);
                IBERROR("dump tables: %s", err);
+       }
 
        mad_rpc_close_port(srcport);
        exit(0);
diff --git a/infiniband-diags/src/ibsendtrap.c 
b/infiniband-diags/src/ibsendtrap.c
index f2b3e67..72aa3f4 100644
--- a/infiniband-diags/src/ibsendtrap.c
+++ b/infiniband-diags/src/ibsendtrap.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2008 Lawrence Livermore National Security
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * Produced at Lawrence Livermore National Laboratory.
  * Written by Ira Weiny <[email protected]>.
@@ -57,11 +58,15 @@ static int send_144_node_desc_update(void)
        ib_rpc_t trap_rpc;
        ib_mad_notice_attr_t notice;
 
-       if (ib_resolve_self_via(&selfportid, &selfport, NULL, srcport))
+       if (ib_resolve_self_via(&selfportid, &selfport, NULL, srcport)) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't resolve self");
+       }
 
-       if (ib_resolve_smlid_via(&sm_port, 0, srcport))
+       if (ib_resolve_smlid_via(&sm_port, 0, srcport)) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't resolve SM destination port");
+       }
 
        memset(&trap_rpc, 0, sizeof(trap_rpc));
        trap_rpc.mgtclass = IB_SMI_CLASS;
diff --git a/infiniband-diags/src/ibsysstat.c b/infiniband-diags/src/ibsysstat.c
index 03c0515..738b1ab 100644
--- a/infiniband-diags/src/ibsysstat.c
+++ b/infiniband-diags/src/ibsysstat.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -230,19 +231,25 @@ static char *ibsystat(ib_portid_t *portid, int attr)
        if (!portid->qkey)
                portid->qkey = IB_DEFAULT_QP1_QKEY;
 
-       if ((len = mad_build_pkt(buf, &rpc, portid, NULL, NULL)) < 0)
+       if ((len = mad_build_pkt(buf, &rpc, portid, NULL, NULL)) < 0) {
+               mad_rpc_close_port(srcport);
                IBPANIC("cannot build packet.");
+       }
 
        fd = mad_rpc_portid(srcport);
        agent = mad_rpc_class_agent(srcport, rpc.mgtclass);
        timeout = ibd_timeout ? ibd_timeout : MAD_DEF_TIMEOUT_MS;
 
-       if (umad_send(fd, agent, buf, len, timeout, 0) < 0)
+       if (umad_send(fd, agent, buf, len, timeout, 0) < 0) {
+               mad_rpc_close_port(srcport);
                IBPANIC("umad_send failed.");
+       }
 
        len = sizeof(buf) - umad_size();
-       if (umad_recv(fd, buf, &len, timeout) < 0)
+       if (umad_recv(fd, buf, &len, timeout) < 0) {
+               mad_rpc_close_port(srcport);
                IBPANIC("umad_recv failed.");
+       }
 
        if (umad_status(buf))
                return strerror(umad_status(buf));
@@ -342,25 +349,36 @@ int main(int argc, char **argv)
                IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port);
 
        if (server) {
-               if (mad_register_server_via(sysstat_class, 1, 0, oui, srcport) 
< 0)
+               if (mad_register_server_via(sysstat_class, 1, 0, oui, srcport) 
< 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't serve class %d", sysstat_class);
+               }
 
                host_ncpu = build_cpuinfo();
 
-               if ((err = ibsystat_serv()))
+               if ((err = ibsystat_serv())) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("ibssystat to %s: %s", portid2str(&portid), 
err);
+               }
+               mad_rpc_close_port(srcport);
                exit(0);
        }
 
-       if (mad_register_client_via(sysstat_class, 1, srcport) < 0)
+       if (mad_register_client_via(sysstat_class, 1, srcport) < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't register to sysstat class %d", sysstat_class);
+       }
 
        if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                       ibd_sm_id, srcport) < 0)
+                                     ibd_sm_id, srcport) < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't resolve destination port %s", argv[0]);
+       }
 
-       if ((err = ibsystat(&portid, attr)))
+       if ((err = ibsystat(&portid, attr))) {
+               mad_rpc_close_port(srcport);
                IBERROR("ibsystat to %s: %s", portid2str(&portid), err);
+       }
 
        mad_rpc_close_port(srcport);
        exit(0);
diff --git a/infiniband-diags/src/ibtracert.c b/infiniband-diags/src/ibtracert.c
index a887157..ba0c1e6 100644
--- a/infiniband-diags/src/ibtracert.c
+++ b/infiniband-diags/src/ibtracert.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -490,11 +491,15 @@ find_mcpath(ib_portid_t *from, int mlid)
 
        DEBUG("from %s", portid2str(from));
 
-       if (!(node = calloc(1, sizeof(Node))))
+       if (!(node = calloc(1, sizeof(Node)))) {
+               mad_rpc_close_port(srcport);
                IBERROR("out of memory");
+       }
 
-       if (!(port = calloc(1, sizeof(Port))))
+       if (!(port = calloc(1, sizeof(Port)))) {
+               mad_rpc_close_port(srcport);
                IBERROR("out of memory");
+       }
 
        if (get_node(node, port, from) < 0) {
                IBWARN("can't reach node %s", portid2str(from));
@@ -554,8 +559,10 @@ find_mcpath(ib_portid_t *from, int mlid)
                                        if (from->drpath.cnt > 0)
                                                path->drpath.cnt--;
                                } else {
-                                       if (!(port = calloc(1, sizeof(Port))))
+                                       if (!(port = calloc(1, sizeof(Port)))) {
+                                               mad_rpc_close_port(srcport);
                                                IBERROR("out of memory");
+                                       }
 
                                        if (get_port(port, i, path) < 0) {
                                                IBWARN("can't reach node %s 
port %d", portid2str(path), i);
@@ -575,11 +582,15 @@ find_mcpath(ib_portid_t *from, int mlid)
                                                return 0;
                                }
 
-                               if (!(remotenode = calloc(1, sizeof(Node))))
+                               if (!(remotenode = calloc(1, sizeof(Node)))) {
+                                       mad_rpc_close_port(srcport);
                                        IBERROR("out of memory");
+                               }
 
-                               if (!(remoteport = calloc(1, sizeof(Port))))
+                               if (!(remoteport = calloc(1, sizeof(Port)))) {
+                                       mad_rpc_close_port(srcport);
                                        IBERROR("out of memory");
+                               }
 
                                if (get_node(remotenode, remoteport, path) < 0) 
{
                                        IBWARN("NodeInfo on %s port %d failed, 
skipping port",
@@ -757,20 +768,28 @@ int main(int argc, char **argv)
        node_name_map = open_node_name_map(node_name_map_file);
 
        if (ib_resolve_portid_str_via(&src_portid, argv[0], ibd_dest_type,
-                       ibd_sm_id, srcport) < 0)
+                                     ibd_sm_id, srcport) < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't resolve source port %s", argv[0]);
+       }
 
        if (ib_resolve_portid_str_via(&dest_portid, argv[1], ibd_dest_type,
-                       ibd_sm_id, srcport) < 0)
+                                     ibd_sm_id, srcport) < 0) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't resolve destination port %s", argv[1]);
+       }
 
        if (ibd_dest_type == IB_DEST_DRPATH) {
-               if (resolve_lid(&src_portid, NULL) < 0)
+               if (resolve_lid(&src_portid, NULL) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("cannot resolve lid for port \'%s\'",
                                portid2str(&src_portid));
-               if (resolve_lid(&dest_portid, NULL) < 0)
+               }
+               if (resolve_lid(&dest_portid, NULL) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("cannot resolve lid for port \'%s\'",
                                portid2str(&dest_portid));
+               }
        }
 
        if (dest_portid.lid == 0 || src_portid.lid == 0) {
@@ -780,26 +799,35 @@ int main(int argc, char **argv)
 
        if (ibd_dest_type != IB_DEST_DRPATH) {
                /* first find a direct path to the src port */
-               if (find_route(&my_portid, &src_portid, 0) < 0)
+               if (find_route(&my_portid, &src_portid, 0) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't find a route to the src port");
+               }
 
                src_portid = my_portid;
        }
 
        if (!multicast) {
-               if (find_route(&src_portid, &dest_portid, dumplevel) < 0)
+               if (find_route(&src_portid, &dest_portid, dumplevel) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't find a route from src to dest");
+               }
+               mad_rpc_close_port(srcport);
                exit(0);
        } else {
                if (mlid < 0xc000)
                        IBWARN("invalid MLID; must be 0xc000 or larger");
        }
 
-       if (!(target_portguid = find_target_portguid(&dest_portid)))
+       if (!(target_portguid = find_target_portguid(&dest_portid))) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't reach target lid %d", dest_portid.lid);
+       }
 
-       if (!(endnode = find_mcpath(&src_portid, mlid)))
+       if (!(endnode = find_mcpath(&src_portid, mlid))) {
+               mad_rpc_close_port(srcport);
                IBERROR("can't find a multicast route from src to dest");
+       }
 
        /* dump multicast path */
        dump_mcpath(endnode, dumplevel);
diff --git a/infiniband-diags/src/perfquery.c b/infiniband-diags/src/perfquery.c
index d35e995..98b7642 100644
--- a/infiniband-diags/src/perfquery.c
+++ b/infiniband-diags/src/perfquery.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
  * Copyright (c) 2007 Xsigo Systems Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -262,7 +263,7 @@ static void output_aggregate_perfcounters_ext(ib_portid_t 
*portid)
 
        mad_dump_perfcounters_ext(buf, sizeof buf, pc, sizeof pc);
 
-       printf("# Port counters: %s port %d\n%s", portid2str(portid), 
ALL_PORTS, buf);
+       printf("# Port extended counters: %s port %d\n%s", portid2str(portid), 
ALL_PORTS, buf);
 }
 
 static void dump_perfcounters(int extended, int timeout, uint16_t cap_mask,
@@ -272,10 +273,13 @@ static void dump_perfcounters(int extended, int timeout, 
uint16_t cap_mask,
 
        if (extended != 1) {
                if (!pma_query_via(pc, portid, port, timeout,
-                                  IB_GSI_PORT_COUNTERS, srcport))
+                                  IB_GSI_PORT_COUNTERS, srcport)) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("perfquery");
+               }
                if (!(cap_mask & 0x1000)) {
                        /* if PortCounters:PortXmitWait not suppported clear 
this counter */
+                       IBWARN("PortXmitWait not indicated so ignore this 
counter");
                        perf_count.xmtwait = 0;
                        mad_encode_field(pc, IB_PC_XMT_WAIT_F, 
&perf_count.xmtwait);
                }
@@ -285,31 +289,44 @@ static void dump_perfcounters(int extended, int timeout, 
uint16_t cap_mask,
                        mad_dump_perfcounters(buf, sizeof buf, pc, sizeof pc);
        } else {
                if (!(cap_mask & 0x200)) /* 1.2 errata: bit 9 is extended 
counter support */
-                       IBWARN("PerfMgt ClassPortInfo 0x%x extended counters 
not indicated\n", cap_mask);
+                       IBWARN("PerfMgt ClassPortInfo 0x%x extended counters 
not indicated", cap_mask);
 
                if (!pma_query_via(pc, portid, port, timeout,
-                                  IB_GSI_PORT_COUNTERS_EXT, srcport))
+                                  IB_GSI_PORT_COUNTERS_EXT, srcport)) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("perfextquery");
+               }
                if (aggregate)
                        aggregate_perfcounters_ext();
                else
                        mad_dump_perfcounters_ext(buf, sizeof buf, pc, sizeof 
pc);
        }
 
-       if (!aggregate)
-               printf("# Port counters: %s port %d\n%s", portid2str(portid), 
port, buf);
+       if (!aggregate) {
+               if (extended)
+                       printf("# Port extended counters: %s port %d\n%s",
+                              portid2str(portid), port, buf);
+               else
+                       printf("# Port counters: %s port %d\n%s",
+                              portid2str(portid), port, buf);
+       }
 }
 
-static void reset_counters(int extended, int timeout, int mask, ib_portid_t 
*portid, int port)
+static void reset_counters(int extended, int timeout, int mask,
+                          ib_portid_t *portid, int port)
 {
        if (extended != 1) {
                if (!performance_reset_via(pc, portid, port, mask, timeout,
-                                          IB_GSI_PORT_COUNTERS, srcport))
+                                          IB_GSI_PORT_COUNTERS, srcport)) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("perf reset");
+               }
        } else {
                if (!performance_reset_via(pc, portid, port, mask, timeout,
-                                          IB_GSI_PORT_COUNTERS_EXT, srcport))
+                                          IB_GSI_PORT_COUNTERS_EXT, srcport)) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("perf ext reset");
+               }
        }
 }
 
@@ -321,22 +338,28 @@ void xmt_sl_query(ib_portid_t *portid, int port, int mask)
 
        if (reset_only) {
                if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
-                                               IB_GSI_PORT_XMIT_DATA_SL, 
srcport))
+                                          IB_GSI_PORT_XMIT_DATA_SL, srcport)) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("perfslreset");
+               }
                return;
        }
 
        if (!pma_query_via(pc, portid, port, ibd_timeout,
-                               IB_GSI_PORT_XMIT_DATA_SL, srcport))
+                          IB_GSI_PORT_XMIT_DATA_SL, srcport)) {
+               mad_rpc_close_port(srcport);
                IBERROR("perfslquery");
+       }
 
        mad_dump_perfcounters_xmt_sl(buf, sizeof buf, pc, sizeof pc);
        printf("# Port counters: %s port %d\n%s", portid2str(portid), port, 
buf);
 
        if(reset)
                if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
-                                               IB_GSI_PORT_XMIT_DATA_SL, 
srcport))
+                                          IB_GSI_PORT_XMIT_DATA_SL, srcport)) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("perfslreset");
+               }
 }
 
 void rcv_sl_query(ib_portid_t *portid, int port, int mask)
@@ -345,22 +368,28 @@ void rcv_sl_query(ib_portid_t *portid, int port, int mask)
 
        if (reset_only) {
                if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
-                                               IB_GSI_PORT_RCV_DATA_SL, 
srcport))
+                                          IB_GSI_PORT_RCV_DATA_SL, srcport)) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("perfslreset");
+               }
                return;
        }
 
        if (!pma_query_via(pc, portid, port, ibd_timeout,
-                               IB_GSI_PORT_RCV_DATA_SL, srcport))
+                          IB_GSI_PORT_RCV_DATA_SL, srcport)) {
+               mad_rpc_close_port(srcport);
                IBERROR("perfslquery");
+       }
 
        mad_dump_perfcounters_rcv_sl(buf, sizeof buf, pc, sizeof pc);
        printf("# Port counters: %s port %d\n%s", portid2str(portid), port, 
buf);
 
        if(reset)
                if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
-                                               IB_GSI_PORT_RCV_DATA_SL, 
srcport))
+                                          IB_GSI_PORT_RCV_DATA_SL, srcport)) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("perfslreset");
+               }
 }
 
 static int process_opt(void *context, int ch, char *optarg)
@@ -396,7 +425,8 @@ static int process_opt(void *context, int ch, char *optarg)
 
 int main(int argc, char **argv)
 {
-       int mgmt_classes[4] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS, 
IB_PERFORMANCE_CLASS};
+       int mgmt_classes[4] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS,
+                              IB_PERFORMANCE_CLASS};
        ib_portid_t portid = {0};
        int mask = 0xffff;
        uint16_t cap_mask;
@@ -450,23 +480,31 @@ int main(int argc, char **argv)
 
        if (argc) {
                if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                               ibd_sm_id, srcport) < 0)
+                                             ibd_sm_id, srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't resolve destination port %s", argv[0]);
+               }
        } else {
-               if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0)
+               if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't resolve self port %s", argv[0]);
+               }
        }
 
        /* PerfMgt ClassPortInfo is a required attribute */
        if (!pma_query_via(pc, &portid, port, ibd_timeout, CLASS_PORT_INFO,
-                          srcport))
+                          srcport)) {
+               mad_rpc_close_port(srcport);
                IBERROR("classportinfo query");
+       }
        /* ClassPortInfo should be supported as part of libibmad */
        memcpy(&cap_mask, pc + 2, sizeof(cap_mask));    /* CapabilityMask */
        cap_mask = ntohs(cap_mask);
        if (!(cap_mask & 0x100)) { /* bit 8 is AllPortSelect */
-               if (!all_ports && port == ALL_PORTS)
+               if (!all_ports && port == ALL_PORTS) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("AllPortSelect not supported");
+               }
                if (all_ports)
                        all_ports_loop = 1;
        }
@@ -483,17 +521,23 @@ int main(int argc, char **argv)
 
        if (all_ports_loop || (loop_ports && (all_ports || port == ALL_PORTS))) 
{
                if (smp_query_via(data, &portid, IB_ATTR_NODE_INFO, 0, 0,
-                               srcport) < 0)
+                                 srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("smp query nodeinfo failed");
+               }
                node_type = mad_get_field(data, 0, IB_NODE_TYPE_F);
                mad_decode_field(data, IB_NODE_NPORTS_F, &num_ports);
-               if (!num_ports)
+               if (!num_ports) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("smp query nodeinfo: num ports invalid");
+               }
 
                if (node_type == IB_NODE_SWITCH) {
                        if (smp_query_via(data, &portid, IB_ATTR_SWITCH_INFO,
-                                       0, 0, srcport) < 0)
+                                         0, 0, srcport) < 0) {
+                               mad_rpc_close_port(srcport);
                                IBERROR("smp query nodeinfo failed");
+                       }
                        enhancedport0 = mad_get_field(data, 0, 
IB_SW_ENHANCED_PORT0_F);
                        if (enhancedport0)
                                start_port = 0;
@@ -523,15 +567,13 @@ int main(int argc, char **argv)
                goto done;
 
 do_reset:
-
        if (argc <= 2 && !extended && (cap_mask & 0x1000))
                mask |= (1<<16); /* reset portxmitwait */
 
        if (all_ports_loop || (loop_ports && (all_ports || port == ALL_PORTS))) 
{
                for (i = start_port; i <= num_ports; i++)
                        reset_counters(extended, ibd_timeout, mask, &portid, i);
-       }
-       else
+       } else
                reset_counters(extended, ibd_timeout, mask, &portid, port);
 
 done:
diff --git a/infiniband-diags/src/saquery.c b/infiniband-diags/src/saquery.c
index dddebc1..e5f1287 100644
--- a/infiniband-diags/src/saquery.c
+++ b/infiniband-diags/src/saquery.c
@@ -3,6 +3,7 @@
  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
  *
  * Produced at Lawrence Livermore National Laboratory.
  * Written by Ira Weiny <[email protected]>.
@@ -99,6 +100,7 @@ struct query_cmd {
 static char *node_name_map_file = NULL;
 static nn_map_t *node_name_map = NULL;
 static uint64_t smkey = 1;
+static struct ibmad_port *srcport;
 
 /**
  * Declare some globals because I don't want this to be too complex.
@@ -141,8 +143,10 @@ static int sa_query(struct bind_handle *h, uint8_t method,
        rpc.dataoffs = IB_SA_DATA_OFFS;
 
        umad = calloc(1, len + umad_size());
-       if (!umad)
+       if (!umad) {
+               mad_rpc_close_port(srcport);
                IBPANIC("cannot alloc mem for umad: %s\n", strerror(errno));
+       }
 
        mad_build_pkt(umad, &rpc, &h->dport, NULL, data);
 
@@ -152,9 +156,11 @@ static int sa_query(struct bind_handle *h, uint8_t method,
                xdump(stdout, "SA Request:\n", umad_get_mad(umad), len);
 
        ret = umad_send(h->fd, h->agent, umad, len, ibd_timeout, 0);
-       if (ret < 0)
+       if (ret < 0) {
+               mad_rpc_close_port(srcport);
                IBPANIC("umad_send failed: attr %u: %s\n",
                        attr, strerror(errno));
+       }
 
 recv_mad:
        ret = umad_recv(h->fd, umad, &len, ibd_timeout);
@@ -163,6 +169,7 @@ recv_mad:
                        umad = realloc(umad, umad_size() + len);
                        goto recv_mad;
                }
+               mad_rpc_close_port(srcport);
                IBPANIC("umad_recv failed: attr %u: %s\n", attr,
                        strerror(errno));
        }
@@ -1324,7 +1331,6 @@ static int query_mft_records(const struct query_cmd *q, 
bind_handle_t h,
 
 static bind_handle_t get_bind_handle(void)
 {
-       static struct ibmad_port *srcport;
        static struct bind_handle handle;
        int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS };
 
@@ -1333,8 +1339,10 @@ static bind_handle_t get_bind_handle(void)
                IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port);
 
        ib_resolve_smlid_via(&handle.dport, ibd_timeout, srcport);
-       if (!handle.dport.lid)
+       if (!handle.dport.lid) {
+               mad_rpc_close_port(srcport);
                IBPANIC("No SM found.");
+       }
 
        handle.dport.qp = 1;
        if (!handle.dport.qkey)
diff --git a/infiniband-diags/src/sminfo.c b/infiniband-diags/src/sminfo.c
index ebf6a47..f987445 100644
--- a/infiniband-diags/src/sminfo.c
+++ b/infiniband-diags/src/sminfo.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -121,11 +122,15 @@ int main(int argc, char **argv)
 
        if (argc) {
                if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                               0, srcport) < 0)
+                                             0, srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't resolve destination port %s", argv[0]);
+               }
        } else {
-               if (ib_resolve_smlid_via(&portid, ibd_timeout, srcport) < 0)
+               if (ib_resolve_smlid_via(&portid, ibd_timeout, srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't resolve sm port %s", argv[0]);
+               }
        }
 
        mad_encode_field(sminfo, IB_SMINFO_GUID_F, &guid);
@@ -136,12 +141,15 @@ int main(int argc, char **argv)
 
        if (mod) {
                if (!(p = smp_set_via(sminfo, &portid, IB_ATTR_SMINFO, mod,
-                               ibd_timeout, srcport)))
-                       IBERROR("query");
-       } else
-               if (!(p = smp_query_via(sminfo, &portid, IB_ATTR_SMINFO, 0,
-                               ibd_timeout, srcport)))
+                                     ibd_timeout, srcport))) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("query");
+               }
+       } else if (!(p = smp_query_via(sminfo, &portid, IB_ATTR_SMINFO, 0,
+                                      ibd_timeout, srcport))) {
+               mad_rpc_close_port(srcport);
+               IBERROR("query");
+       }
 
        mad_decode_field(sminfo, IB_SMINFO_GUID_F, &guid);
        mad_decode_field(sminfo, IB_SMINFO_ACT_F, &act);
diff --git a/infiniband-diags/src/smpquery.c b/infiniband-diags/src/smpquery.c
index 2ed1e65..dc6f0fa 100644
--- a/infiniband-diags/src/smpquery.c
+++ b/infiniband-diags/src/smpquery.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -460,20 +461,28 @@ int main(int argc, char **argv)
 
        if (ibd_dest_type != IB_DEST_DRSLID) {
                if (ib_resolve_portid_str_via(&portid, argv[1], ibd_dest_type,
-                               ibd_sm_id, srcport) < 0)
+                                             ibd_sm_id, srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't resolve destination port %s", argv[1]);
-               if ((err = fn(&portid, argv+2, argc-2)))
+               }
+               if ((err = fn(&portid, argv+2, argc-2))) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("operation %s: %s", argv[0], err);
+               }
        } else {
                char concat[64];
 
                memset(concat, 0, 64);
                snprintf(concat, sizeof(concat), "%s %s", argv[1], argv[2]);
                if (ib_resolve_portid_str_via(&portid, concat, ibd_dest_type,
-                               ibd_sm_id, srcport) < 0)
+                                             ibd_sm_id, srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't resolve destination port %s", concat);
-               if ((err = fn(&portid, argv+3, argc-3)))
+               }
+               if ((err = fn(&portid, argv+3, argc-3))) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("operation %s: %s", argv[0], err);
+               }
        }
        close_node_name_map(node_name_map);
        mad_rpc_close_port(srcport);
diff --git a/infiniband-diags/src/vendstat.c b/infiniband-diags/src/vendstat.c
index 0f09039..b4e3825 100644
--- a/infiniband-diags/src/vendstat.c
+++ b/infiniband-diags/src/vendstat.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
+ * Copyright (c) 2009 HNR Consulting.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -160,17 +161,23 @@ int main(int argc, char **argv)
 
        if (argc) {
                if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                               ibd_sm_id, srcport) < 0)
+                                             ibd_sm_id, srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't resolve destination port %s", argv[0]);
+               }
        } else {
-               if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0)
+               if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("can't resolve self port %s", argv[0]);
+               }
        }
 
        /* Only General Info and Port Xmit Wait Counters */
        /* queries are currently supported */
-       if (!general_info && !xmit_wait)
+       if (!general_info && !xmit_wait) {
+               mad_rpc_close_port(srcport);
                IBERROR("at least one of -N and -w must be specified");
+       }
 
        /* These are Mellanox specific vendor MADs */
        /* but vendors change the VendorId so how know for sure ? */
@@ -185,13 +192,18 @@ int main(int argc, char **argv)
        memset(&buf, 0, sizeof(buf));
        /* vendor ClassPortInfo is required attribute if class supported */
        call.attrid = CLASS_PORT_INFO;
-       if (!ib_vendor_call_via(&buf, &portid, &call, srcport))
+       if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) {
+               mad_rpc_close_port(srcport);
                IBERROR("classportinfo query");
+       }
 
        memset(&buf, 0, sizeof(buf));
        call.attrid = IB_MLX_IS3_GENERAL_INFO;
-       if (!ib_vendor_call_via(&buf, &portid, &call, srcport))
+       if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) {
+               mad_rpc_close_port(srcport);
                IBERROR("vendstat");
+       }
+
        gi = (is3_general_info_t *)&buf;
 
        if (general_info) {
@@ -211,8 +223,10 @@ int main(int argc, char **argv)
        }
 
        if (xmit_wait) {
-               if (ntohs(gi->hw_info.device_id) != IS3_DEVICE_ID)
+               if (ntohs(gi->hw_info.device_id) != IS3_DEVICE_ID) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("Unsupported device ID 0x%x", 
ntohs(gi->hw_info.device_id));
+               }
 
                memset(&buf, 0, sizeof(buf));
                call.attrid = IB_MLX_IS3_CONFIG_SPACE_ACCESS;
@@ -222,8 +236,10 @@ int main(int argc, char **argv)
                cs = (is3_config_space_t *)&buf;
                for (i = 0; i < 16; i++)
                        cs->record[i].address = htonl(IB_MLX_IS3_PORT_XMIT_WAIT 
+ ((i + 1) << 12));
-               if (!ib_vendor_call_via(&buf, &portid, &call, srcport))
+               if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("vendstat");
+               }
 
                for (i = 0; i < 16; i++)
                        if (cs->record[i].data) /* PortXmitWait is 32 bit 
counter */
@@ -237,8 +253,10 @@ int main(int argc, char **argv)
                cs = (is3_config_space_t *)&buf;
                for (i = 0; i < 8; i++)
                        cs->record[i].address = htonl(IB_MLX_IS3_PORT_XMIT_WAIT 
+ ((i + 17) << 12));
-               if (!ib_vendor_call_via(&buf, &portid, &call, srcport))
+               if (!ib_vendor_call_via(&buf, &portid, &call, srcport)) {
+                       mad_rpc_close_port(srcport);
                        IBERROR("vendstat");
+               }
 
                for (i = 0; i < 8; i++)
                        if (cs->record[i].data) /* PortXmitWait is 32 bit 
counter */
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to