X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fmmap_sanity.c;h=b432435a8695491151dab195b822d0c48a998284;hb=4f40429775c49468d9ec1fec34d5e7500ac01116;hp=dffdea511aed162e457b37b8db745f0090ee82a6;hpb=69f76e8f1da3b3ba27853c4d98cfa82ccf09f1f9;p=fs%2Flustre-release.git diff --git a/lustre/tests/mmap_sanity.c b/lustre/tests/mmap_sanity.c index dffdea5..b432435 100644 --- a/lustre/tests/mmap_sanity.c +++ b/lustre/tests/mmap_sanity.c @@ -15,11 +15,7 @@ * * 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. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ @@ -27,27 +23,28 @@ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, Whamcloud, Inc. + * Copyright (c) 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ * Lustre is a trademark of Sun Microsystems, Inc. */ +#include +#include +#include +#include +#include +#include #include #include #include -#include -#include -#include -#include #include -#include -#include -#include +#include #include -#include -#include +#include + +#include char *dir = NULL, *dir2 = NULL; long page_size; @@ -439,62 +436,56 @@ out_close: return rc; } -static int cancel_lru_locks(char *prefix) +static int cancel_lru_locks(char *filter) { - 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/*-%s-*/lru_size", - 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); + glob_t paths; + pid_t child; + int rc, i; + + 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 (filter != NULL) + rc = cfs_get_param_paths(&paths, + "ldlm/namespaces/*-%s-*/lru_size", + filter); + else + rc = cfs_get_param_paths(&paths, + "ldlm/namespaces/*/lru_size"); + if (rc != 0) + return -EINVAL; + + for (i = 0; i < paths.gl_pathc; i++) { + FILE *f = fopen(paths.gl_pathv[i], "r"); + if (f == NULL) { + rc = -errno; + fprintf(stderr, "cannot open '%s': %s\n", + paths.gl_pathv[i], strerror(errno)); + break; + } + + rc = fwrite("clear", strlen("clear") + 1, 1, f); + if (rc < 1) { + rc = -errno; + fprintf(stderr, "fwrite failed for '%s': %s\n", + paths.gl_pathv[i], strerror(errno)); + fclose(f); + break; + } + fclose(f); + } + + cfs_free_param_data(&paths); + _exit(rc); } /* don't dead lock while read/write file to/from the buffer which @@ -784,18 +775,62 @@ struct test_case { }; 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 }, - { 7, "mmap test7: file i/o with an unmapped buffer", mmap_tst7, 1}, - { 8, "mmap test8: SIGBUS for beyond file size", mmap_tst8, 1 }, - { 0, NULL, 0, 0 } + { + .tc = 1, + .desc = "mmap test1: basic mmap operation", + .test_fn = mmap_tst1, + .node_cnt = 1 + }, + { + .tc = 2, + .desc = "mmap test2: MAP_PRIVATE not write back", + .test_fn = mmap_tst2, + .node_cnt = 1 + }, + { + .tc = 3, + .desc = "mmap test3: concurrent mmap ops on " + "two nodes", + .test_fn = mmap_tst3, + .node_cnt = 2 + }, + { + .tc = 4, + .desc = "mmap test4: c1 write to f1 from mmapped f2, " + "c2 write to f1 from mmapped f1", + .test_fn = mmap_tst4, + .node_cnt = 2 + }, + { + .tc = 5, + .desc = "mmap test5: read/write file to/from the " + "buffer which mmapped to just this file", + .test_fn = mmap_tst5, + .node_cnt = 1 + }, + { + .tc = 6, + .desc = "mmap test6: check mmap write/read content " + "on two nodes", + .test_fn = mmap_tst6, + .node_cnt = 2 + }, + { + .tc = 7, + .desc = "mmap test7: file i/o with an unmapped " + "buffer", + .test_fn = mmap_tst7, + .node_cnt = 1 + }, + { + .tc = 8, + .desc = "mmap test8: SIGBUS for beyond file size", + .test_fn = mmap_tst8, + .node_cnt = 1 + }, + { + .tc = 0 + } }; int main(int argc, char **argv)