⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmap_sanity.c

📁 lustre 1.6.5 source code
💻 C
📖 第 1 页 / 共 2 页
字号:
        munmap(ptr, region);out_close:        if (fdr >= 0)                close(fdr);        if (fdw >= 0)                close(fdw);        unlink(filea);        unlink(fileb);        return rc;}static int remote_tst4(char *mnt){        char *ptr, filea[256], fileb[256];        int region, fdr, fdw, rc = 0;        region = page_size * 100;        sprintf(filea, "%s/%s", mnt, "mmap_file_4a");        sprintf(fileb, "%s/%s", mnt, "mmap_file_4b");        fdr = fdw = -1;        fdr = open(filea, O_RDWR, 0600);        if (fdr < 0) {                perror(filea);                return errno;        }        fdw = open(fileb, O_RDWR, 0600);        if (fdw < 0) {                perror(fileb);                rc = errno;                goto out_close;        }        ptr = mmap(NULL, region, PROT_READ|PROT_WRITE, MAP_SHARED, fdr, 0);        if (ptr == MAP_FAILED) {                perror("mmap()");                rc = errno;                goto out_close;        }        memset(ptr, '2', region);        rc = write(fdw, ptr, region);        if (rc <= 0) {                perror("write()");                rc = errno;        } else                rc = 0;             munmap(ptr, region);out_close:        if (fdr >= 0)                close(fdr);        if (fdw >= 0)                close(fdw);        return rc;}static int cancel_lru_locks(char *prefix){        char cmd[256], line[1024];        FILE *file;        pid_t child;        int len = 1024, rc = 0;        child = fork();        if (child < 0)                return errno;        else if (child) {                int status;                rc = waitpid(child, &status, WNOHANG);                if (rc == child)                        rc = 0;                return rc;        }        if (prefix)                sprintf(cmd, "ls /proc/fs/lustre/ldlm/namespaces/*/lru_size | grep -i %s", prefix);        else                sprintf(cmd, "ls /proc/fs/lustre/ldlm/namespaces/*/lru_size");        file = popen(cmd, "r");        if (file == NULL) {                perror("popen()");                return errno;        }        while (fgets(line, len, file)) {                FILE *f;                if (!strlen(line))                        continue;                /* trim newline character */                *(line + strlen(line) - 1) = '\0';                f = fopen(line, "w");                if (f == NULL) {                        perror("fopen()");                        rc = errno;                        break;                }                rc = fwrite("clear", strlen("clear") + 1, 1, f);                if (rc < 1) {                        perror("fwrite()");                        rc = errno;                        fclose(f);                        break;                }                fclose(f);        }        pclose(file);        _exit(rc);}/* don't dead lock while read/write file to/from the buffer which * mmaped to just this file */static int mmap_tst5(char *mnt){        char *ptr, mmap_file[256];        int region, fd, off, rc = 0;        region = page_size * 40;        off = page_size * 10;        sprintf(mmap_file, "%s/%s", mnt, "mmap_file5");        if (unlink(mmap_file) && errno != ENOENT) {                perror("unlink()");                return errno;        }        fd = open(mmap_file, O_CREAT|O_RDWR, 0600);        if (fd < 0) {                perror(mmap_file);                return errno;        }        ftruncate(fd, region);        ptr = mmap(NULL, region, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);        if (ptr == MAP_FAILED) {                perror("mmap()");                rc = errno;                goto out_close;        }        memset(ptr, 'a', region);        /* cancel unused locks */        rc = cancel_lru_locks("osc");        if (rc)                goto out_unmap;        /* read/write region of file and buffer should be overlap */        rc = read(fd, ptr + off, off * 2);        if (rc != off * 2) {                perror("read()");                rc = errno;                goto out_unmap;        }        rc = write(fd, ptr + off, off * 2);        if (rc != off * 2) {                perror("write()");                rc = errno;        }        rc = 0;out_unmap:        munmap(ptr, region);out_close:        close(fd);        unlink(mmap_file);        return rc;}/* mmap write to a file form client1 then mmap read from client2 */static int mmap_tst6(char *mnt){        char mmap_file[256], mmap_file2[256];        char *ptr = NULL, *ptr2 = NULL;        int fd = 0, fd2 = 0, rc = 0;        sprintf(mmap_file, "%s/%s", mnt, "mmap_file6");        sprintf(mmap_file2, "%s/%s", dir2, "mmap_file6");        if (unlink(mmap_file) && errno != ENOENT) {                perror("unlink()");                return errno;        }        fd = open(mmap_file, O_CREAT|O_RDWR, 0600);        if (fd < 0) {                perror(mmap_file);                return errno;        }        ftruncate(fd, page_size);        fd2 = open(mmap_file2, O_RDWR, 0600);        if (fd2 < 0) {                perror(mmap_file2);                goto out;        }        ptr = mmap(NULL, page_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);        if (ptr == MAP_FAILED) {                perror("mmap()");                rc = errno;                goto out;        }                ptr2 = mmap(NULL, page_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);        if (ptr2 == MAP_FAILED) {                perror("mmap()");                rc = errno;                goto out;        }        rc = cancel_lru_locks("osc");        if (rc)                goto out;        memcpy(ptr, "blah", strlen("blah"));        if (strncmp(ptr, ptr2, strlen("blah"))) {                fprintf(stderr, "client2 mmap mismatch!\n");                rc = EFAULT;                goto out;        }        memcpy(ptr2, "foo", strlen("foo"));        if (strncmp(ptr, ptr2, strlen("foo"))) {                fprintf(stderr, "client1 mmap mismatch!\n");                rc = EFAULT;        }out:        if (ptr2)                munmap(ptr2, page_size);        if (ptr)                munmap(ptr, page_size);        if (fd2 > 0)                close(fd2);        if (fd > 0)                close(fd);        unlink(mmap_file);        return rc;}static int remote_tst(int tc, char *mnt){        int rc = 0;        switch(tc) {        case 3:                rc = remote_tst3(mnt);                break;        case 4:                rc = remote_tst4(mnt);                break;        default:                fprintf(stderr, "wrong test case number %d\n", tc);                rc = EINVAL;                break;        }        return rc;}        struct test_case {        int     tc;                     /* test case number */        char    *desc;                  /* test description */        int     (* test_fn)(char *mnt); /* test function */        int     node_cnt;               /* node count */};struct test_case tests[] = {        { 1, "mmap test1: basic mmap operation", mmap_tst1, 1 },        { 2, "mmap test2: MAP_PRIVATE not write back", mmap_tst2, 1 },        { 3, "mmap test3: concurrent mmap ops on two nodes", mmap_tst3, 2 },        { 4, "mmap test4: c1 write to f1 from mmapped f2, "              "c2 write to f1 from mmapped f1", mmap_tst4, 2 },        { 5, "mmap test5: read/write file to/from the buffer "             "which mmapped to just this file", mmap_tst5, 1 },        { 6, "mmap test6: check mmap write/read content on two nodes",                 mmap_tst6, 2 },        { 0, NULL, 0, 0 }};int main(int argc, char **argv){        extern char *optarg;        struct test_case *test;        int c, rc = 0;        for(;;) {                c = getopt(argc, argv, "d:m:");                if ( c == -1 )                        break;                switch(c) {                        case 'd':                                dir = optarg;                                break;                        case 'm':                                dir2 = optarg;                                break;                        default:                        case '?':                                usage();                                break;                }        }        if (dir == NULL)                usage();        if (mmap_initialize(argv[0]) != 0) {                fprintf(stderr, "mmap_initialize failed!\n");                return EINVAL;        }        for (test = tests; test->tc; test++) {                char *rs = "skip";                rc = 0;                if (test->node_cnt == 1 || dir2 != NULL) {                        rc = test->test_fn(dir);                        rs = rc ? "fail" : "pass";                }                fprintf(stderr, "%s (%s)\n", test->desc, rs);                if (rc)                        break;        }        mmap_finalize();        return rc;}

⌨️ 快捷键说明

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