- 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;
- }
+ 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;
+ }
+ if (ftruncate(fd, page_size) < 0) {
+ perror("ftruncate()");
+ rc = -errno;
+ goto out;
+ }
+
+ fd2 = open(mmap_file2, O_RDWR, 0600);
+ if (fd2 < 0) {
+ perror(mmap_file2);
+ rc = -errno;
+ 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 mmap_tst7_func(char *mnt, int rw)
+{
+ char fname[256];
+ char *buf = MAP_FAILED;
+ ssize_t bytes;
+ int fd = -1;
+ int rc = 0;
+
+ if (snprintf(fname, 256, "%s/mmap_tst7.%s", mnt,
+ (rw == 0) ? "read" : "write") >= 256) {
+ fprintf(stderr, "dir name too long\n");
+ rc = -ENAMETOOLONG;
+ goto out;
+ }
+ fd = open(fname, O_RDWR | O_DIRECT | O_CREAT, 0644);
+ if (fd == -1) {
+ perror("open");
+ rc = -errno;
+ goto out;
+ }
+ if (ftruncate(fd, 2 * page_size) == -1) {
+ perror("truncate");
+ rc = -errno;
+ goto out;
+ }
+ buf = mmap(NULL, page_size * 2,
+ PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (buf == MAP_FAILED) {
+ perror("mmap");
+ rc = -errno;
+ goto out;
+ }
+ /* ensure the second page isn't mapped */
+ munmap(buf + page_size, page_size);
+ bytes = (rw == 0) ? read(fd, buf, 2 * page_size) :
+ write(fd, buf, 2 * page_size);
+ /* Expected behavior */
+ if (bytes == page_size)
+ goto out;
+
+ fprintf(stderr, "%s returned %zd, errno = %d\n",
+ (rw == 0) ? "read" : "write", bytes, errno);
+ rc = -EIO;