On Tue, Sep 02, 2025 at 11:45:33AM +0100, Lorenzo Stoakes wrote: > In commit bb666b7c2707 ("mm: add mmap_prepare() compatibility layer for > nested file systems") we introduced the ability for 'nested' drivers and > file systems to correctly invoke the f_op->mmap_prepare() handler from an > f_op->mmap() handler via a compatibility layer implemented in > compat_vma_mmap_prepare(). > > This invokes vma_to_desc() to populate vm_area_desc fields according to > those found in the (not yet fully initialised) VMA passed to f_op->mmap(). > > However this function implicitly assumes that the struct file which we are > operating upon is equal to vma->vm_file. This is not a safe assumption in > all cases. > > This is not an issue currently, as so far we have only implemented > f_op->mmap_prepare() handlers for some file systems and internal mm uses, > and the only nested f_op->mmap() operations that can be performed upon > these are those in backing_file_mmap() and coda_file_mmap(), both of which > use vma->vm_file. > > However, moving forward, as we convert drivers to using > f_op->mmap_prepare(), this will become a problem. > > Resolve this issue by explicitly setting desc->file to the provided file > parameter and update callers accordingly. > > We also need to adjust set_vma_from_desc() to account for this fact, and > only update the vma->vm_file field if the f_op->mmap_prepare() caller > reassigns it. > > We may in future wish to add a new field to struct vm_area_desc to account > for this 'nested mmap invocation' case, but for now it seems unnecessary. > > While we are here, also provide a variant of compat_vma_mmap_prepare() that > operates against a pointer to any file_operations struct and does not > assume that the file_operations struct we are interested in is file->f_op. > > This function is __compat_vma_mmap_prepare() and we invoke it from > compat_vma_mmap_prepare() so that we share code between the two functions. > > This is important, because some drivers provide hooks in a separate struct, > for instance struct drm_device provides an fops field for this purpose. > > Also update the VMA selftests accordingly. > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> Reviewed-by: Pedro Falcato <pfalcato@xxxxxxx> LGTM, thanks! -- Pedro