On Mon, Feb 11, 2019 at 01:02:37PM -0800, Dan Williams wrote: > On Mon, Feb 11, 2019 at 12:49 PM Jason Gunthorpe <jgg@xxxxxxxx> wrote: > > > > On Mon, Feb 11, 2019 at 11:58:47AM -0800, Dan Williams wrote: > > > On Mon, Feb 11, 2019 at 10:40 AM Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote: > > > > > > > > On Mon, Feb 11, 2019 at 11:26:49AM -0700, Jason Gunthorpe wrote: > > > > > On Mon, Feb 11, 2019 at 10:19:22AM -0800, Ira Weiny wrote: > > > > > > What if user space then writes to the end of the file with a regular write? > > > > > > Does that write end up at the point they truncated to or off the end of the > > > > > > mmaped area (old length)? > > > > > > > > > > IIRC it depends how the user does the write.. > > > > > > > > > > pwrite() with a given offset will write to that offset, re-extending > > > > > the file if needed > > > > > > > > > > A file opened with O_APPEND and a write done with write() should > > > > > append to the new end > > > > > > > > > > A normal file with a normal write should write to the FD's current > > > > > seek pointer. > > > > > > > > > > I'm not sure what happens if you write via mmap/msync. > > > > > > > > > > RDMA is similar to pwrite() and mmap. > > > > > > > > A pertinent point that you didn't mention is that ftruncate() does not change > > > > the file offset. So there's no user-visible change in behaviour. > > > > > > ...but there is. The blocks you thought you freed, especially if the > > > system was under -ENOSPC pressure, won't actually be free after the > > > successful ftruncate(). > > > > They won't be free after something dirties the existing mmap either. > > > > Blocks also won't be free if you unlink a file that is currently still > > open. > > > > This isn't really new behavior for a FS. > > An mmap write after a fault due to a hole punch is free to trigger > SIGBUS if the subsequent page allocation fails. Isn't that already racy? If the mmap user is fast enough can't it prevent the page from becoming freed in the first place today? Jason