* 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/
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;
};
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)