X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fmmap_sanity.c;h=90a2edb3f3cae8b316db5f80b025a766eca82eb9;hb=1155c2fee4c197bfc295f761d52f9b748c37ad79;hp=09d35b6a711645a59b5d79f7ea0a7840926aaed1;hpb=72057a3af19ee02d9a686bd7e7d074917e381310;p=fs%2Flustre-release.git diff --git a/lustre/tests/mmap_sanity.c b/lustre/tests/mmap_sanity.c index 09d35b6..90a2edb 100644 --- a/lustre/tests/mmap_sanity.c +++ b/lustre/tests/mmap_sanity.c @@ -23,7 +23,7 @@ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, 2015, Intel Corporation. + * Copyright (c) 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -748,6 +748,56 @@ out: return rc; } +static int mmap_tst9(char *mnt) +{ + char fname[256]; + char *buf = MAP_FAILED; + int fd = -1; + int rc = 0; + + if (snprintf(fname, 256, "%s/mmap_tst9", mnt) >= 256) { + fprintf(stderr, "dir name too long\n"); + rc = -ENAMETOOLONG; + goto out; + } + if (unlink(fname) == -1 && errno != ENOENT) { + perror("unlink"); + rc = -errno; + goto out; + } + fd = open(fname, O_RDWR | O_CREAT, 0644); + if (fd == -1) { + perror("open"); + rc = -errno; + goto out; + } + buf = mmap(NULL, page_size * 2, + PROT_READ , MAP_PRIVATE, fd, (loff_t)(-10 * page_size)); + if (buf == MAP_FAILED) { + perror("mmap"); + rc = -errno; + goto out; + } + rc = write(STDOUT_FILENO, buf, 2 * page_size); + if (rc != -1) { + fprintf(stderr, "write succeded with %d instead of failing\n", rc); + rc = -EINVAL; + goto out; + } else if (errno != EFAULT) { + fprintf(stderr, "write failed with %d instead of EFAULT(%d)\n", + errno, EFAULT); + rc = -errno; + goto out; + } + rc = 0; +out: + if (buf != MAP_FAILED) + munmap(buf, page_size * 2); + if (fd != -1) + close(fd); + return rc; +} + static int remote_tst(int tc, char *mnt) { int rc = 0; @@ -775,18 +825,68 @@ 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 = 9, + .desc = "mmap test9: SIGBUS for negative file offset", + .test_fn = mmap_tst9, + .node_cnt = 1 + }, + { + .tc = 0 + } }; int main(int argc, char **argv)