Hi, > diff --git a/mm/mmap.c b/mm/mmap.c > index 680506faceae..2649c00581a0 100644 > --- a/mm/mmap.c > +++ b/mm/mmap.c > @@ -1389,6 +1389,18 @@ unsigned long do_mmap(struct file *file, unsigned long addr, > struct inode *inode = file_inode(file); > > switch (flags & MAP_TYPE) { > + case MAP_SHARED_VALIDATE: > + if ((flags & ~LEGACY_MAP_MASK) == 0) { > + /* > + * If all legacy mmap flags, downgrade > + * to MAP_SHARED, i.e. invoke ->mmap() > + * instead of ->mmap_validate() > + */ > + flags &= ~MAP_TYPE; > + flags |= MAP_SHARED; > + } else if (!file->f_op->mmap_validate) > + return -EOPNOTSUPP; > + /* fall through */ > case MAP_SHARED: > if ((prot&PROT_WRITE) && !(file->f_mode&FMODE_WRITE)) > return -EACCES; When thinking a bit more about this I've realized one problem: Currently user can call mmap() with MAP_SHARED type and MAP_SYNC or MAP_DIRECT flags and he will get the new semantics (if the kernel happens to support it). I think that is undesirable and we should force usage of MAP_SHARED_VALIDATE when you want to use flags outside of LEGACY_MAP_MASK. So I'd just mask off non-legacy flags for MAP_SHARED mappings (so they would be silently ignored as they used to be until now). Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR