From 112d48ac17647879fffa5275dd31dca8bfb3223b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 3 May 2011 14:36:36 +0200 Subject: [PATCH] (Merge 3.1) Issue #11277: mmap.mmap() calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get around a mmap bug with sparse files. Patch written by Steffen Daode Nurpmeso. --- Doc/library/mmap.rst | 4 ++++ Misc/NEWS | 3 +++ Modules/mmapmodule.c | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst index 125b34f3c7f..f036a60ce08 100644 --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -94,6 +94,10 @@ memory but does not update the underlying file. defaults to 0. *offset* must be a multiple of the PAGESIZE or ALLOCATIONGRANULARITY. + To ensure validity of the created memory mapping the file specified + by the descriptor *fileno* is internally automatically synchronized + with physical backing store on Mac OS X and OpenVMS. + This example shows a simple way of using :class:`mmap`:: import mmap diff --git a/Misc/NEWS b/Misc/NEWS index 0030bab1a30..50f6aaf5261 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -70,6 +70,9 @@ Core and Builtins Library ------- +- Issue #11277: mmap.mmap() calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get + around a mmap bug with sparse files. Patch written by Steffen Daode Nurpmeso. + - Issue #10761: Fix tarfile.extractall failure when symlinked files are present. Initial patch by Scott Leerssen. diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index e93acda19f4..3078279f223 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -23,6 +23,9 @@ #ifndef MS_WINDOWS #define UNIX +# ifdef __APPLE__ +# include +# endif #endif #ifdef MS_WINDOWS @@ -1170,6 +1173,12 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) "mmap invalid access parameter."); } +#ifdef __APPLE__ + /* Issue #11277: fsync(2) is not enough on OS X - a special, OS X specific + fcntl(2) is necessary to force DISKSYNC and get around mmap(2) bug */ + if (fd != -1) + (void)fcntl(fd, F_FULLFSYNC); +#endif #ifdef HAVE_FSTAT # ifdef __VMS /* on OpenVMS we must ensure that all bytes are written to the file */