On Mon, Feb 11, 2019 at 11:06:54AM -0700, Jason Gunthorpe wrote: > On Mon, Feb 11, 2019 at 09:22:58AM -0800, Dan Williams wrote: > > > I honestly don't like the idea that random subsystems can pin down > > file blocks as a side effect of gup on the result of mmap. Recall that > > it's not just RDMA that wants this guarantee. It seems safer to have > > the file be in an explicit block-allocation-immutable-mode so that the > > fallocate man page can describe this error case. Otherwise how would > > you describe the scenarios under which FALLOC_FL_PUNCH_HOLE fails? > > I rather liked CL's version of this - ftruncate/etc is simply racing > with a parallel pwrite - and it doesn't fail. > > But it also doesnt' trucate/create a hole. Another thread wrote to it > right away and the 'hole' was essentially instantly reallocated. This > is an inherent, pre-existing, race in the ftrucate/etc APIs. I kind of like it as well, except Christopher did not answer my question: 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)? To make this work I think it has to be the later. And as you say the semantic is as if another thread wrote to the file first (but in this case the other thread is the RDMA device). In addition I'm not sure what the overall work is for this case? John's patches will indicate to the FS that the page is gup pinned. But they will not indicate longterm vs not "shorterm". A shortterm pin could be handled as a "real truncate". So, are we back to needing a longterm "bit" in struct page to indicate a longterm pin and allow the FS to perform this "virtual write" after truncate? Or is it safe to consider all gup pinned pages this way? Ira