On Wed, Apr 30, 2025 at 9:54 PM Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> wrote: > Provide a means by which drivers can specify which fields of those > permitted to be changed should be altered to prior to mmap()'ing a > range (which may either result from a merge or from mapping an entirely new > VMA). > > Doing so is substantially safer than the existing .mmap() calback which > provides unrestricted access to the part-constructed VMA and permits > drivers and file systems to do 'creative' things which makes it hard to > reason about the state of the VMA after the function returns. > > The existing .mmap() callback's freedom has caused a great deal of issues, > especially in error handling, as unwinding the mmap() state has proven to > be non-trivial and caused significant issues in the past, for instance > those addressed in commit 5de195060b2e ("mm: resolve faulty mmap_region() > error path behaviour"). > > It also necessitates a second attempt at merge once the .mmap() callback > has completed, which has caused issues in the past, is awkward, adds > overhead and is difficult to reason about. > > The .mmap_proto() callback eliminates this requirement, as we can update > fields prior to even attempting the first merge. It is safer, as we heavily > restrict what can actually be modified, and being invoked very early in the > mmap() process, error handling can be performed safely with very little > unwinding of state required. I wonder if this requires adjustments to the existing users of call_mmap() that use call_mmap() for forwarding mmap operations to some kind of backing file. In particular fuse_passthrough_mmap(), which I think can operate on fairly arbitrary user-supplied backing files (for context, I think fuse_backing_open() allows root to just provide an fd to be used as backing file). I guess the easiest approach would be to add bailouts to those if an ->mmap_proto handler exists for now, and revisit this if we ever want to use ->mmap_proto for more normal types of files?