Whamcloud - gitweb
No bugzilla for this. One of the test failing was config-sanity.sh
[fs/lustre-release.git] / lustre / utils / mount_lustre.c
index 24b042c..d1b9f61 100644 (file)
@@ -49,6 +49,7 @@
 #include <errno.h>
 #include <string.h>
 #include <sys/mount.h>
+#include <linux/fs.h>
 #include <mntent.h>
 #include <getopt.h>
 #include "obdctl.h"
@@ -233,6 +234,9 @@ static const struct opt_map opt_map[] = {
   { "relatime", 0, MS_RELATIME },  /* set file access time on read */
   { "norelatime",1,MS_RELATIME },  /* do not set file access time on read */
 #endif
+#ifdef MS_STRICTATIME
+  { "strictatime",0,MS_STRICTATIME },  /* update access time strictly */
+#endif
   { "auto",     0, 0         },      /* Can be mounted using -a */
   { "noauto",   0, 0         },      /* Can only be mounted explicitly */
   { "nousers",  1, 0         },      /* Forbid ordinary user to mount */
@@ -304,7 +308,7 @@ int parse_options(char *orig_options, int *flagp)
                                 retry = 0;
                 } else if (val && strncmp(arg, "mgssec", 6) == 0) {
                         append_option(options, opt);
-                } else if (strncmp(opt, "force", 5) == 0) {
+                } else if (strcmp(opt, "force") == 0) {
                         //XXX special check for 'force' option
                         ++force;
                         printf("force: %d\n", force);
@@ -313,6 +317,12 @@ int parse_options(char *orig_options, int *flagp)
                         append_option(options, opt);
                 }
         }
+#ifdef MS_STRICTATIME
+                /* set strictatime to default if NOATIME or RELATIME
+                   not given explicit */
+        if (!(*flagp & (MS_NOATIME | MS_RELATIME)))
+                *flagp |= MS_STRICTATIME;
+#endif
         strcpy(orig_options, options);
         free(options);
         return 0;
@@ -453,7 +463,7 @@ set_params:
                         if (verbose)
                                 fprintf(stderr, "warning: opening %s: %s\n",
                                         real_path, strerror(errno));
-                        return rc;
+                        return 0;
                 }
 
                 if (atoi(buf) >= md_stripe_cache_size)
@@ -494,7 +504,12 @@ set_params:
 int main(int argc, char *const argv[])
 {
         char default_options[] = "";
-        char *usource, *source, *target, *ptr;
+        char *usource, *source, *ptr;
+        char target[PATH_MAX] = {'\0'};
+        char real_path[PATH_MAX] = {'\0'};
+        char path[256], name[256];
+        FILE *f;
+        size_t sz;
         char *options, *optcopy, *orig_options = default_options;
         int i, nargs = 3, opt, rc, flags, optlen;
         static struct option long_opt[] = {
@@ -557,16 +572,37 @@ int main(int argc, char *const argv[])
                 usage(stderr);
         }
 
+        /**
+         * Try to get the real path to the device, in case it is a
+         * symbolic link for instance
+         */
+        if (realpath(usource, real_path) != NULL) {
+                usource = real_path;
+
+                ptr = strrchr(real_path, '/');
+                if (ptr && strncmp(ptr, "/dm-", 4) == 0 && isdigit(*(ptr + 4))) {
+                        snprintf(path, sizeof(path), "/sys/block/%s/dm/name", ptr+1);
+                        if ((f = fopen(path, "r"))) {
+                                /* read "<name>\n" from sysfs */
+                                if (fgets(name, sizeof(name), f) && (sz = strlen(name)) > 1) {
+                                        name[sz - 1] = '\0';
+                                        snprintf(real_path, sizeof(real_path), "/dev/mapper/%s", name);
+                                }
+                                fclose(f);
+                        }
+                }
+        }
+
         source = convert_hostnames(usource);
         if (!source) {
                 usage(stderr);
         }
 
-        target = argv[optind + 1];
-        ptr = target + strlen(target) - 1;
-        while ((ptr > target) && (*ptr == '/')) {
-                *ptr = 0;
-                ptr--;
+        if (realpath(argv[optind + 1], target) == NULL) {
+                rc = errno;
+                fprintf(stderr, "warning: %s: cannot resolve: %s\n",
+                        argv[optind + 1], strerror(errno));
+                return rc;
         }
 
         if (verbose) {
@@ -684,9 +720,8 @@ int main(int argc, char *const argv[])
                         usource, target, strerror(errno));
                 if (errno == ENODEV)
                         fprintf(stderr, "Are the lustre modules loaded?\n"
-                                "Check /etc/modprobe.conf and /proc/filesystems"
-                                "\nNote 'alias lustre llite' should be removed"
-                                " from modprobe.conf\n");
+                                "Check /etc/modprobe.conf and "
+                                "/proc/filesystems\n");
                 if (errno == ENOTBLK)
                         fprintf(stderr, "Do you need -o loop?\n");
                 if (errno == ENOMEDIUM)