mount_lustre.c

来自「lustre 1.6.5 source code」· C语言 代码 · 共 627 行 · 第 1/2 页

C
627
字号
        if (strncmp(real_path, "/dev/loop", 9) == 0)                return 0;        if ((real_path[0] != '/') && ((s2 = strpbrk(real_path, ",:")) != NULL))                return 0;        dev = real_path + src_len - 1;        while (dev > real_path && (*dev != '/')) {                if (isdigit(*dev))                        *dev = 0;                dev--;        }        snprintf(path, sizeof(path), "/sys/block%s/%s", dev,                 MAX_HW_SECTORS_KB_PATH);        rc = read_file(path, buf, sizeof(buf));        if (rc == 0 && (strlen(buf) - 1) > 0) {                snprintf(path, sizeof(path), "/sys/block%s/%s", dev,                         MAX_SECTORS_KB_PATH);                rc = write_file(path, buf);                if (rc && verbose)                        fprintf(stderr, "warning: opening %s: %s\n",                                path, strerror(errno));                return rc;        }        if (rc != ENOENT)                return rc;        /* The name of the device say 'X' specified in /dev/X may not         * match any entry under /sys/block/. In that case we need to         * match the major/minor number to find the entry under         * sys/block corresponding to /dev/X */        dev = real_path + src_len - 1;        while (dev > real_path) {                if (isdigit(*dev))                        *dev = 0;                dev--;        }        rc = stat(dev, &stat_buf);        if (rc) {                if (verbose)                        fprintf(stderr, "warning: %s, device %s stat failed\n",                                strerror(errno), dev);                return rc;        }        major = major(stat_buf.st_rdev);        minor = minor(stat_buf.st_rdev);        rc = glob("/sys/block/*", GLOB_NOSORT, NULL, &glob_info);        if (rc) {                if (verbose)                        fprintf(stderr, "warning: failed to read entries under "                                "/sys/block\n");                return rc;        }        for (i = 0; i < glob_info.gl_pathc; i++){                snprintf(path, sizeof(path), "%s/dev", glob_info.gl_pathv[i]);                rc = read_file(path, buf, sizeof(buf));                if (rc)                        continue;                if (buf[strlen(buf) - 1] == '\n')                        buf[strlen(buf) - 1] = '\0';                chk_major = strtok_r(buf, ":", &savept);                chk_minor = savept;                if (major == atoi(chk_major) &&minor == atoi(chk_minor))                        break;        }        if (i == glob_info.gl_pathc) {                if (verbose)                        fprintf(stderr,"warning: device %s does not match any "                                "entry under /sys/block\n", real_path);                rc = -EINVAL;                goto out;        }        snprintf(path, sizeof(path), "%s/%s", glob_info.gl_pathv[i],                 MAX_HW_SECTORS_KB_PATH);        rc = read_file(path, buf, sizeof(buf));        if (rc) {                if (verbose)                        fprintf(stderr, "warning: opening %s: %s\n",                                path, strerror(errno));                goto out;        }        if (strlen(buf) - 1 > 0) {                snprintf(path, sizeof(path), "%s/%s",                         glob_info.gl_pathv[i], MAX_SECTORS_KB_PATH);                rc = write_file(path, buf);                if (rc && verbose)                        fprintf(stderr, "warning: writing to %s: %s\n",                                path, strerror(errno));        }out:        globfree(&glob_info);        return rc;}int main(int argc, char *const argv[]){        char default_options[] = "";        char *usource, *source, *target, *ptr;        char *options, *optcopy, *orig_options = default_options;        int i, nargs = 3, opt, rc, flags, optlen;        static struct option long_opt[] = {                {"fake", 0, 0, 'f'},                {"force", 0, 0, 1},                {"help", 0, 0, 'h'},                {"nomtab", 0, 0, 'n'},                {"options", 1, 0, 'o'},                {"verbose", 0, 0, 'v'},                {0, 0, 0, 0}        };        progname = strrchr(argv[0], '/');        progname = progname ? progname + 1 : argv[0];        while ((opt = getopt_long(argc, argv, "fhno:v",                                  long_opt, NULL)) != EOF){                switch (opt) {                case 1:                        ++force;                        printf("force: %d\n", force);                        nargs++;                        break;                case 'f':                        ++fake;                        printf("fake: %d\n", fake);                        nargs++;                        break;                case 'h':                        usage(stdout);                        break;                case 'n':                        ++nomtab;                        printf("nomtab: %d\n", nomtab);                        nargs++;                        break;                case 'o':                        orig_options = optarg;                        nargs++;                        break;                case 'v':                        ++verbose;                        nargs++;                        break;                default:                        fprintf(stderr, "%s: unknown option '%c'\n",                                progname, opt);                        usage(stderr);                        break;                }        }        if (optind + 2 > argc) {                fprintf(stderr, "%s: too few arguments\n", progname);                usage(stderr);        }        usource = argv[optind];        source = convert_hostnames(usource);        target = argv[optind + 1];        ptr = target + strlen(target) - 1;        while ((ptr > target) && (*ptr == '/')) {                *ptr = 0;                ptr--;        }        if (!usource || !source) {                usage(stderr);        }        if (verbose) {                for (i = 0; i < argc; i++)                        printf("arg[%d] = %s\n", i, argv[i]);                printf("source = %s (%s), target = %s\n", usource, source, target);                printf("options = %s\n", orig_options);        }        options = malloc(strlen(orig_options) + 1);        strcpy(options, orig_options);        rc = parse_options(options, &flags);        if (rc) {                fprintf(stderr, "%s: can't parse options: %s\n",                        progname, options);                return(EINVAL);        }        if (!force) {                rc = check_mtab_entry(usource, target, "lustre");                if (rc && !(flags & MS_REMOUNT)) {                        fprintf(stderr, "%s: according to %s %s is "                                "already mounted on %s\n",                                progname, MOUNTED, usource, target);                        return(EEXIST);                }                if (!rc && (flags & MS_REMOUNT)) {                        fprintf(stderr, "%s: according to %s %s is "                                "not already mounted on %s\n",                                progname, MOUNTED, usource, target);                        return(ENOENT);                }        }        if (flags & MS_REMOUNT)                nomtab++;        rc = access(target, F_OK);        if (rc) {                rc = errno;                fprintf(stderr, "%s: %s inaccessible: %s\n", progname, target,                        strerror(errno));                return rc;        }        /* In Linux 2.4, the target device doesn't get passed to any of our           functions.  So we'll stick it on the end of the options. */        optlen = strlen(options) + strlen(",device=") + strlen(source) + 1;        optcopy = malloc(optlen);        strcpy(optcopy, options);        if (*optcopy)                strcat(optcopy, ",");        strcat(optcopy, "device=");        strcat(optcopy, source);        if (verbose)                printf("mounting device %s at %s, flags=%#x options=%s\n",                       source, target, flags, optcopy);        if (set_tunables(source, strlen(source)) && verbose)                fprintf(stderr, "%s: unable to set tunables for %s"                                " (may cause reduced IO performance)",                                argv[0], source);        if (!fake)                /* flags and target get to lustre_get_sb, but not                   lustre_fill_super.  Lustre ignores the flags, but mount                   does not. */                rc = mount(source, target, "lustre", flags, (void *)optcopy);        if (rc) {                char *cli;                rc = errno;                cli = strrchr(usource, ':');                if (cli && (strlen(cli) > 2))                        cli += 2;                else                        cli = NULL;                fprintf(stderr, "%s: mount %s at %s failed: %s\n", progname,                        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");                if (errno == ENOTBLK)                        fprintf(stderr, "Do you need -o loop?\n");                if (errno == ENOMEDIUM)                        fprintf(stderr,                                "This filesystem needs at least 1 OST\n");                if (errno == ENOENT) {                        fprintf(stderr, "Is the MGS specification correct?\n");                        fprintf(stderr, "Is the filesystem name correct?\n");                        fprintf(stderr, "If upgrading, is the copied client log"                                " valid? (see upgrade docs)\n");                }                if (errno == EALREADY)                        fprintf(stderr, "The target service is already running."                                " (%s)\n", usource);                if (errno == ENXIO)                        fprintf(stderr, "The target service failed to start "                                "(bad config log?) (%s).  "                                "See /var/log/messages.\n", usource);                if (errno == EIO)                        fprintf(stderr, "Is the MGS running?\n");                if (errno == EADDRINUSE)                        fprintf(stderr, "The target service's index is already "                                "in use. (%s)\n", usource);                if (errno == EINVAL) {                        fprintf(stderr, "This may have multiple causes.\n");                        if (cli)                                fprintf(stderr, "Is '%s' the correct filesystem"                                        " name?\n", cli);                        fprintf(stderr, "Are the mount options correct?\n");                        fprintf(stderr, "Check the syslog for more info.\n");                }                /* May as well try to clean up loop devs */                if (strncmp(usource, "/dev/loop", 9) == 0) {                        char cmd[256];                        sprintf(cmd, "/sbin/losetup -d %s", usource);                        system(cmd);                }        } else if (!nomtab) {                rc = update_mtab_entry(usource, target, "lustre", orig_options,                                       0,0,0);        }        free(optcopy);        free(source);        return rc;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?