Whamcloud - gitweb
- ptlrpc_ping_interpret is needless:
[fs/lustre-release.git] / lustre / utils / llmount.c
index 8ab5705..e50df3a 100644 (file)
 #define _GNU_SOURCE
 #include <getopt.h>
 #include <sys/utsname.h>
+#include <pwd.h>
+#include <grp.h>
 
 #include "obdctl.h"
 #include <portals/ptlctl.h>
+#include <linux/lustre_idl.h>
 
 int debug;
 int verbose;
@@ -117,6 +120,11 @@ init_options(struct lustre_mount_data *lmd)
         lmd->lmd_local_nid = PTL_NID_ANY;
         lmd->lmd_port = 988;    /* XXX define LUSTRE_DEFAULT_PORT */
         lmd->lmd_nal = SOCKNAL;
+        lmd->lmd_async = 0;
+        lmd->lmd_remote_flag = 0;
+        lmd->lmd_nllu = NOBODY_UID;
+        lmd->lmd_nllg = NOBODY_GID;
+        strncpy(lmd->lmd_security, "null", sizeof(lmd->lmd_security));
         return 0;
 }
 
@@ -127,11 +135,24 @@ print_options(struct lustre_mount_data *lmd)
 
         printf("mds:             %s\n", lmd->lmd_mds);
         printf("profile:         %s\n", lmd->lmd_profile);
+        printf("sec_flavor:      %s\n", lmd->lmd_security);
         printf("server_nid:      "LPX64"\n", lmd->lmd_server_nid);
-        printf("local_nid:       "LPX64"\n", lmd->lmd_local_nid);
-        printf("nal:             %d\n", lmd->lmd_nal);
-        printf("server_ipaddr:   0x%x\n", lmd->lmd_server_ipaddr);
-        printf("port:            %d\n", lmd->lmd_port);
+#ifdef CRAY_PORTALS
+        if (lmd->lmd_nal != CRAY_KB_SSNAL) {
+#endif
+                printf("local_nid:       "LPX64"\n", lmd->lmd_local_nid);
+#ifdef CRAY_PORTALS
+        }
+#endif
+        printf("nal:             %x\n", lmd->lmd_nal);
+#ifdef CRAY_PORTALS
+        if (lmd->lmd_nal != CRAY_KB_SSNAL) {
+#endif
+                printf("server_ipaddr:   0x%x\n", lmd->lmd_server_ipaddr);
+                printf("port:            %d\n", lmd->lmd_port);
+#ifdef CRAY_PORTALS
+        }
+#endif
 
         for (i = 0; i < route_index; i++)
                 printf("route:           "LPX64" : "LPX64" - "LPX64"\n",
@@ -199,6 +220,60 @@ static int parse_route(char *opteq, char *opttgts)
         return(0);
 }
 
+/*
+ * here all what we do is gurantee the result is exactly
+ * what user intend to get, no ambiguous. maybe there have
+ * simpler library call could do the same job for us?
+ */
+static int parse_u32(char *str, uint32_t *res)
+{
+        unsigned long id;
+        char *endptr = NULL;
+
+        id = strtol(str, &endptr, 0);
+        if (endptr && *endptr != 0)
+                return -1;
+
+        if (id == LONG_MAX || id == LONG_MIN)
+                return -1;
+
+        if ((uint32_t)id != id)
+                return -1;
+
+        *res = (uint32_t) id;
+        return 0;
+}
+
+static int parse_nllu(struct lustre_mount_data *lmd, char *str_nllu)
+{
+        struct passwd *pass;
+
+        if (parse_u32(str_nllu, &lmd->lmd_nllu) == 0)
+                return 0;
+
+        pass = getpwnam(str_nllu);
+        if (pass == NULL)
+                return -1;
+
+        lmd->lmd_nllu = pass->pw_uid;
+        return 0;
+}
+
+static int parse_nllg(struct lustre_mount_data *lmd, char *str_nllg)
+{
+        struct group *grp;
+
+        if (parse_u32(str_nllg, &lmd->lmd_nllg) == 0)
+                return 0;
+
+        grp = getgrnam(str_nllg);
+        if (grp == NULL)
+                return -1;
+
+        lmd->lmd_nllg = grp->gr_gid;
+        return 0;
+}
+
 int parse_options(char * options, struct lustre_mount_data *lmd)
 {
         ptl_nid_t nid = 0, cluster_id = 0;
@@ -212,6 +287,11 @@ int parse_options(char * options, struct lustre_mount_data *lmd)
                         *opteq = '\0';
                         if (!strcmp(opt, "nettype")) {
                                 lmd->lmd_nal = ptl_name2nal(opteq + 1);
+                                if (lmd->lmd_nal < 0) {
+                                        fprintf(stderr, "%s: can't parse NET "
+                                                "%s\n", progname, opteq + 1);
+                                        return (-1);
+                                }
                         } else if(!strcmp(opt, "cluster_id")) {
                                 if (ptl_parse_nid(&cluster_id, opteq+1) != 0) {
                                         fprintf (stderr, "%s: can't parse NID "
@@ -247,15 +327,40 @@ int parse_options(char * options, struct lustre_mount_data *lmd)
                                 lmd->lmd_server_nid = nid;
                         } else if (!strcmp(opt, "port")) {
                                 lmd->lmd_port = val;
+                        } else if (!strcmp(opt, "sec")) {
+                                strncpy(lmd->lmd_security, opteq + 1,
+                                        sizeof(lmd->lmd_security));
+                        } else if (!strcmp(opt, "nllu")) {
+                                if (parse_nllu(lmd, opteq + 1)) {
+                                        fprintf(stderr, "%s: "
+                                                "can't parse user: %s\n",
+                                                progname, opteq + 1);
+                                        return (-1);
+                                }
+                        } else if (!strcmp(opt, "nllg")) {
+                                if (parse_nllg(lmd, opteq + 1)) {
+                                        fprintf(stderr, "%s: "
+                                                "can't parse group: %s\n",
+                                                progname, opteq + 1);
+                                        return (-1);
+                                }
                         }
                 } else {
-                        val = 1;
-                        if (!strncmp(opt, "no", 2)) {
-                                val = 0;
-                                opt += 2;
-                        }
-                        if (!strcmp(opt, "debug")) {
-                                debug = val;
+                        if (!strcmp(opt, "remote")) {
+                                lmd->lmd_remote_flag = OBD_CONNECT_REMOTE;
+                        } else if (!strcmp(opt, "local")) {
+                                lmd->lmd_remote_flag = OBD_CONNECT_LOCAL;
+                        } else if (!strcmp(opt, "async")) {
+                                lmd->lmd_async = 1;
+                        } else {
+                                val = 1;
+                                if (!strncmp(opt, "no", 2)) {
+                                        val = 0;
+                                        opt += 2;
+                                }
+                                if (!strcmp(opt, "debug")) {
+                                        debug = val;
+                                }
                         }
                 }
         }
@@ -293,8 +398,26 @@ set_local(struct lustre_mount_data *lmd)
 
         memset(buf, 0, sizeof(buf));
 
-        if (lmd->lmd_nal == SOCKNAL || lmd->lmd_nal == TCPNAL ||
-            lmd->lmd_nal == OPENIBNAL) {
+        switch (lmd->lmd_nal) {
+        default:
+                fprintf(stderr, "%s: Unknown network type: %d\n",
+                        progname, lmd->lmd_nal);
+                return 1;
+
+#if CRAY_PORTALS
+        case CRAY_KB_SSNAL:
+                return 0;
+
+        case CRAY_KB_ERNAL:
+#else
+        case SOCKNAL:
+        case TCPNAL:
+        case OPENIBNAL:
+        case IIBNAL:
+        case VIBNAL:
+        case RANAL:
+#endif
+        {
                 struct utsname uts;
 
                 rc = gethostname(buf, sizeof(buf) - 1);
@@ -303,6 +426,7 @@ set_local(struct lustre_mount_data *lmd)
                                 progname, strerror(rc));
                         return rc;
                 }
+
                 rc = uname(&uts);
                 /* for 2.6 kernels, reserve at least 8MB free, or we will
                  * go OOM during heavy read load */
@@ -329,8 +453,12 @@ set_local(struct lustre_mount_data *lmd)
                                 write(f, val, strlen(val));
                                 close(f);
                         }
-                 }
-        } else if (lmd->lmd_nal == QSWNAL) {
+                }
+                break;
+        }
+#if !CRAY_PORTALS
+        case QSWNAL:
+        {
                 char *pfiles[] = {"/proc/qsnet/elan3/device0/position",
                                   "/proc/qsnet/elan4/device0/position",
                                   "/proc/elan/device0/position",
@@ -347,6 +475,9 @@ set_local(struct lustre_mount_data *lmd)
 
                         return -1;
                 }
+                break;
+        }
+#endif
         }
 
         if (ptl_parse_nid (&nid, buf) != 0) {
@@ -363,14 +494,42 @@ set_peer(char *hostname, struct lustre_mount_data *lmd)
 {
         ptl_nid_t nid = 0;
         int rc;
-        
-        if (lmd->lmd_nal == SOCKNAL || lmd->lmd_nal == TCPNAL ||
-            lmd->lmd_nal == OPENIBNAL) {
+
+        switch (lmd->lmd_nal) {
+        default:
+                fprintf(stderr, "%s: Unknown network type: %d\n",
+                        progname, lmd->lmd_nal);
+                return 1;
+
+#if CRAY_PORTALS
+       case CRAY_KB_SSNAL:
+               lmd->lmd_server_nid = strtoll(hostname,0,0);
+                return 0;
+
+        case CRAY_KB_ERNAL:
+#else
+        case IIBNAL:
+                if (lmd->lmd_server_nid != PTL_NID_ANY)
+                        break;
+                if (ptl_parse_nid (&nid, hostname) != 0) {
+                        fprintf (stderr, "%s: can't parse NID %s\n",
+                                 progname, hostname);
+                        return (1);
+                }
+                lmd->lmd_server_nid = nid;
+                break;
+
+        case SOCKNAL:
+        case TCPNAL:
+        case OPENIBNAL:
+        case VIBNAL:
+        case RANAL:
+#endif
                 if (lmd->lmd_server_nid == PTL_NID_ANY) {
                         if (ptl_parse_nid (&nid, hostname) != 0) {
                                 fprintf (stderr, "%s: can't parse NID %s\n",
                                          progname, hostname);
-                                return (-1);
+                                return (1);
                         }
                         lmd->lmd_server_nid = nid;
                 }
@@ -380,8 +539,15 @@ set_peer(char *hostname, struct lustre_mount_data *lmd)
                                  progname, hostname);
                         return (-1);
                 }
-        } else if (lmd->lmd_nal == QSWNAL) {
+
+                break;
+
+#if !CRAY_PORTALS
+        case QSWNAL: {
                 char buf[64];
+                if (lmd->lmd_server_nid != PTL_NID_ANY)
+                        break;
+
                 rc = sscanf(hostname, "%*[^0-9]%63[0-9]", buf);
                 if (rc != 1) {
                         fprintf (stderr, "%s: can't get elan id from host %s\n",
@@ -394,9 +560,11 @@ set_peer(char *hostname, struct lustre_mount_data *lmd)
                         return (-1);
                 }
                 lmd->lmd_server_nid = nid;
-        }
-
 
+                break;
+        }
+#endif
+        }
         return 0;
 }
 
@@ -621,10 +789,20 @@ int main(int argc, char *const argv[])
                 exit(0);
         }
 
+        rc = access(target, F_OK);
+        if (rc) {
+                rc = errno;
+                fprintf(stderr, "%s: %s inaccessible: %s\n", progname, target,
+                        strerror(errno));
+                return rc;
+        }
+
         rc = mount(source, target, "lustre", 0, (void *)&lmd);
         if (rc) {
                 rc = errno;
                 perror(argv[0]);
+                fprintf(stderr, "%s: mount(%s, %s) failed: %s\n", source,
+                        target, progname, strerror(errno));
                 if (rc == ENODEV)
                         fprintf(stderr, "Are the lustre modules loaded?\n"
                              "Check /etc/modules.conf and /proc/filesystems\n");