On Fri, Oct 16, 2020 at 7:38 PM Chengguang Xu <cgxu519@xxxxxxxxxxxx> wrote: > > Currently only mmap does not behave as stacked file operation, > although in practice there is less change to open a file in > RDONLY mode and take long time to do mmap but the fix looks > reasonable. I suppose you do not have a real life use case where this fix is relevant? The thing is that this change is not without consequence. It could result in 2 overlapping mmaps on the same RDONLY fd mapping a different file and it can be even more confusing than different fd mapping different files. It is not clear which non-standard behavior is preferred, so without any evidence that one strange behavior is preferred over the other I don't think we should change anything. Thanks, Amir. > > Signed-off-by: Chengguang Xu <cgxu519@xxxxxxxxxxxx> > --- > Hi Miklos, > > I'm sorry that I did a mistake about signed-off-by tag in previous > email, so I resend this patch. > > fs/overlayfs/file.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c > index 3582c3ae819c..f98b1c0c975b 100644 > --- a/fs/overlayfs/file.c > +++ b/fs/overlayfs/file.c > @@ -461,6 +461,7 @@ static int ovl_mmap(struct file *file, struct vm_area_struct *vma) > { > struct file *realfile = file->private_data; > const struct cred *old_cred; > + struct fd real; > int ret; > > if (!realfile->f_op->mmap) > @@ -469,7 +470,11 @@ static int ovl_mmap(struct file *file, struct vm_area_struct *vma) > if (WARN_ON(file != vma->vm_file)) > return -EIO; > > - vma->vm_file = get_file(realfile); > + ret = ovl_real_fdget(file, &real); > + if (ret) > + return ret; > + > + vma->vm_file = get_file(real.file); > > old_cred = ovl_override_creds(file_inode(file)->i_sb); > ret = call_mmap(vma->vm_file, vma); > @@ -477,13 +482,14 @@ static int ovl_mmap(struct file *file, struct vm_area_struct *vma) > > if (ret) { > /* Drop reference count from new vm_file value */ > - fput(realfile); > + fput(real.file); > } else { > /* Drop reference count from previous vm_file value */ > fput(file); > } > > ovl_file_accessed(file); > + fdput(real); > > return ret; > } > -- > 2.26.2 > >