[Bug 225586] ftruncate+mmap+fsync fails for small maps

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Wed Jan 31 13:40:50 UTC 2018


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=225586

            Bug ID: 225586
           Summary: ftruncate+mmap+fsync fails for small maps
           Product: Base System
           Version: 11.1-STABLE
          Hardware: amd64
                OS: Any
            Status: New
          Severity: Affects Many People
          Priority: ---
         Component: misc
          Assignee: freebsd-bugs at FreeBSD.org
          Reporter: tris_vern at hotmail.com

Created attachment 190220
  --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=190220&action=edit
test on tmp filesystem that can be unmounted

When doing an ftruncate+mmap+fsync to a size less than 512 bytes the data never
seems to be sync'd properly to disk.

This work fine on the latest 11.1-RELEASE but not the latest 11.1-STABLE. It is
also ok if the ftruncate is to the existing file size.

While the mapped changes are visible in the file before an umount, after even a
failed umount, the changes are no longer present.


(non-error checked) C code below.

After running the binary, check the contents of the file (eg hd) and it will be
all 0xFF. Then, umount the filesystem you are on*. Then check the contents of
the file again. It will now be 0x01.

Running extra sync's or fsync's from the command line before the umount doesn't
seem to help.

* The umount should fail but still shows the problem. However note it doesn't
seem to work with the error given for the root filesystem "/".

I've also attached a script that creates a filesystem to umount

---

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>

int
main (int argc, char *argv[])
{
   int fd;
   size_t i, size1, size2;
   char *data;
   char *filename;
   char pattern = 0x01;

   if (argc < 2) {
      fprintf(stderr, "Usage: %s filename size1 size2\n", argv[0]);
      exit(1);
   }

   filename = argv[1];
   size1 = atoi(argv[2]);
   size2 = atoi(argv[3]);

   fd = open(filename, O_RDWR | O_TRUNC | O_CREAT, 0644);
   for (i = 0; i < size1; i++)
      write(fd, &pattern, 1);
   close(fd);

   fd = open(filename, O_RDWR, 0644);
   ftruncate(fd, size2);
   data = mmap(NULL, size2, PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
   memset(data, 0xFF, size2);
   fsync(fd);

   munmap(data, size2);
   close(fd);
}

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-bugs mailing list