Whamcloud - gitweb
b=20970 need add an additional barrier for write_disjoint
[fs/lustre-release.git] / lnet / utils / gmlndnid.c
index 7fbe8ef..340c8b9 100644 (file)
@@ -1,23 +1,40 @@
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
-  * vim:expandtab:shiftwidth=8:tabstop=8:
-  *
-  *  Copyright (c) 2003 Los Alamos National Laboratory (LANL)
-  *
-  *   This file is part of Lustre, http://www.lustre.org/
-  *
-  *   This file is free software; you can redistribute it and/or
-  *   modify it under the terms of version 2.1 of the GNU Lesser General
-  *   Public License as published by the Free Software Foundation.
-  *
-  *   Lustre is distributed in the hope that it will be useful,
-  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
-  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  *   GNU Lesser General Public License for more details.
-  *
-  *   You should have received a copy of the GNU Lesser General Public
-  *   License along with Portals; if not, write to the Free Software
-  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-  */
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ * GPL HEADER START
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 only,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License version 2 for more details (a copy is included
+ * in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ * GPL HEADER END
+ */
+/*
+ * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Use is subject to license terms.
+ *
+ * Copyright (c) 2003 Los Alamos National Laboratory (LANL)
+ */
+/*
+ * This file is part of Lustre, http://www.lustre.org/
+ * Lustre is a trademark of Sun Microsystems, Inc.
+ */
 
 #include <stdio.h>
 #include <sys/types.h>
 #include <syslog.h>
 #include <errno.h>
 
-#include <portals/api-support.h>
-#include <portals/lib-types.h>
+#include <lnet/api-support.h>
+#include <lnet/lib-types.h>
 
 #include <gm.h>
 
-#define GMNAL_IOC_GET_GNID 1
 /*
  *      portals always uses unit 0
  *      Can this be configurable?
 void
 usage(char *prg, int h)
 {
-        fprintf(stderr, "usage %s -n hostname | -l | -h\n", prg);
-        if (h) {
-                printf("\nGet Myrinet Global network ids for specified host\n"
-                       "-l gets network id for local host\n");
-        }
+        fprintf(stderr,
+                "usage %s -h\n"
+                "      %s [-l] [-n hostname] [-L] [hostnames]\n", prg);
+
+        if (h)
+                printf("Print Myrinet Global network ids for specified hosts\n"
+                       "-l                    print local host's ID\n"
+                       "-n hostname           print given host's ID\n"
+                       "-L                    print Myringet local net ID too\n"
+                       "[hostnames]           print ids of given hosts (local if none)\n");
 }
 
-unsigned
-u_getgmnid(char *name, int get_local_id)
+gm_status_t
+print_gmid(char *name, int name_fieldlen, int show_local_id)
 {
         struct gm_port *gm_port;
-        int             gm_port_id = 2;
-        gm_status_t     gm_status = GM_SUCCESS;
-        unsigned        global_nid = 0, local_nid = 0; /* gm ids never 0 */
+        int             gm_port_id;
+        gm_status_t     gm_status;
+        unsigned int    local_id;
+        unsigned int    global_id;
 
         gm_status = gm_init();
         if (gm_status != GM_SUCCESS) {
                 fprintf(stderr, "gm_init: %s\n", gm_strerror(gm_status));
-                return(0);
+                return gm_status;
         }
 
+        gm_port_id = 2;
         gm_status = gm_open(&gm_port, GM_UNIT, gm_port_id, "gmnalnid",
                             GM_API_VERSION);
         if (gm_status != GM_SUCCESS) {
-                /* Couldn't open port 2, try 4 5 6 7 */
-                for (gm_port_id = 4; gm_port_id < 8; gm_port_id++) {
+                int num_ports = gm_num_ports(gm_port);
+
+                /* Couldn't open port 2, try 4 ... num_ports */
+                for (gm_port_id = 4; gm_port_id < num_ports; gm_port_id++) {
                         gm_status = gm_open(&gm_port, GM_UNIT, gm_port_id,
                                             "gmnalnid", GM_API_VERSION);
                         if (gm_status == GM_SUCCESS)
                                 break;
+                }
 
+                if (gm_status != GM_SUCCESS) {
                         fprintf(stderr, "gm_open: %s\n",gm_strerror(gm_status));
-                        gm_finalize();
-                        return(0);
+                        goto out_0;
                 }
         }
 
-        if (get_local_id) {
-                local_nid = 1;
+        if (name == NULL) {
+                local_id = 1;
+                name = "<local>";
         } else {
                 gm_status = gm_host_name_to_node_id_ex(gm_port, 1000000, name,
-                                                       &local_nid);
+                                                       &local_id);
                 if (gm_status != GM_SUCCESS) {
-                        fprintf(stderr, "gm_host_name_to_node_id_ex: %s\n",
-                                gm_strerror(gm_status));
-                        gm_close(gm_port);
-                        gm_finalize();
-                        return(0);
+                        fprintf(stderr, "gm_host_name_to_node_id_ex(%s): %s\n",
+                                name, gm_strerror(gm_status));
+                        goto out_1;
                 }
         }
 
-        gm_status = gm_node_id_to_global_id(gm_port, local_nid, &global_nid) ;
+        gm_status = gm_node_id_to_global_id(gm_port, local_id, &global_id) ;
         if (gm_status != GM_SUCCESS) {
-                fprintf(stderr, "gm_node_id_to_global_id: %s\n",
-                        gm_strerror(gm_status));
-                gm_close(gm_port);
-                gm_finalize();
-                return(0);
+                fprintf(stderr, "gm_node_id_to_global_id(%s:%d): %s\n",
+                        name, local_id, gm_strerror(gm_status));
+                goto out_1;
         }
+
+        if (name_fieldlen > 0)
+                printf ("%*s ", name_fieldlen, name);
+
+        if (!show_local_id)
+                printf("0x%x\n", global_id);
+        else
+                printf("local 0x%x global 0x%x\n", local_id, global_id);
+
+ out_1:
         gm_close(gm_port);
+ out_0:
         gm_finalize();
-        return(global_nid);
+
+        return gm_status;
 }
 
-int main(int argc, char **argv)
+int
+main (int argc, char **argv)
 {
-        unsigned int        nid = 0;
-        char               *name = NULL;
         int                 c;
-        int                 get_local_id = 0;
+        gm_status_t         gmrc;
+        int                 rc;
+        int                 max_namelen = 0;
+        int                 show_local_id = 0;
 
-        while ((c = getopt(argc, argv, "n:lh")) != -1) {
+        while ((c = getopt(argc, argv, "n:lLh")) != -1)
                 switch(c) {
-                case('n'):
-                        if (get_local_id) {
-                                usage(argv[0], 0);
-                                exit(-1);
-                        }
-                        name = optarg;
-                        break;
-                case('h'):
+                case 'h':
                         usage(argv[0], 1);
-                        exit(-1);
-                        break;
-                case('l'):
-                        if (name) {
-                                usage(argv[0], 0);
-                                exit(-1);
-                        }
-                        get_local_id = 1;
+                        return 0;
+
+                case 'L':
+                        show_local_id = 1;
                         break;
+
+                case 'n':
+                        gmrc = print_gmid(optarg, 0, show_local_id);
+                        return (gmrc == GM_SUCCESS) ? 0 : 1;
+
+                case 'l':
+                        gmrc = print_gmid(NULL, 0, show_local_id);
+                        return (gmrc == GM_SUCCESS) ? 0 : 1;
+
                 default:
                         usage(argv[0], 0);
-                        exit(-1);
+                        return 2;
                 }
+
+        if (optind == argc) {
+                gmrc = print_gmid(NULL, 0, show_local_id);
+                return (gmrc == GM_SUCCESS) ? 0 : 1;
         }
 
-        if (!name && !get_local_id) {
-                usage(argv[0], 0);
-                exit(-1);
+        if (optind != argc - 1)
+                for (c = optind; c < argc; c++)
+                        if (strlen(argv[c]) > max_namelen)
+                                max_namelen = strlen(argv[c]);
+
+        rc = 0;
+
+        for (c = optind; c < argc; c++) {
+                gmrc = print_gmid(argv[c], max_namelen, show_local_id);
+
+                if (gmrc != GM_SUCCESS)
+                        rc = 1;
         }
 
-        nid = u_getgmnid(name, get_local_id);
-        printf("%u\n", nid);
-        exit(0);
+        return rc;
 }