From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BBA4CC433E2 for ; Sun, 30 Aug 2020 11:33:17 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 52BFB207DA for ; Sun, 30 Aug 2020 11:33:17 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="qTI3n78Y" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 52BFB207DA Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id AF6896B000E; Sun, 30 Aug 2020 07:33:16 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AA7196B0010; Sun, 30 Aug 2020 07:33:16 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9BEA38E0003; Sun, 30 Aug 2020 07:33:16 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0142.hostedemail.com [216.40.44.142]) by kanga.kvack.org (Postfix) with ESMTP id 905A96B000E for ; Sun, 30 Aug 2020 07:33:16 -0400 (EDT) Received: from smtpin01.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 5FEBC8248047 for ; Sun, 30 Aug 2020 11:33:16 +0000 (UTC) X-FDA: 77207023992.01.head35_410274927086 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin01.hostedemail.com (Postfix) with ESMTP id 2124910046461 for ; Sun, 30 Aug 2020 11:33:16 +0000 (UTC) X-HE-Tag: head35_410274927086 X-Filterd-Recvd-Size: 7721 Received: from mail-il1-f193.google.com (mail-il1-f193.google.com [209.85.166.193]) by imf25.hostedemail.com (Postfix) with ESMTP for ; Sun, 30 Aug 2020 11:33:15 +0000 (UTC) Received: by mail-il1-f193.google.com with SMTP id t4so4290427iln.1 for ; Sun, 30 Aug 2020 04:33:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=iiFFxC5gMkxwxc2psHpScg1tLsy+yg77+1+dF7n2gmQ=; b=qTI3n78YnhNXnZLw+gaFRBk2FR4zPEaRZZ0DQxI6pE3gbGwgWaYTgbVpcqg/qjl8+a OYwQSxGagsR4XUY/qjtVF/eKaRREJCA+rvyl2qFu7K0947/Hekg9UgKJ9Ntkyzi7n3hh HA9RGK1qt+e4kiQ3vRuicwrb/lnme+NvpvCTJ8+lX4uwOjfKNFeRO65EKsYoNYp+KVUy 2pg0d22eUqL03Qbamb/n4IWNyzo+9I3jGmOJFVcOQuY3t+kJR90t+KKBR2s3lHx+LhbM oZdVNnmwuoe4pB3T0E+yHtyKXKTvWFhiO+ROOaqHWAzdEiOFY3B/5VqKm3W5F9HqT+Gt 8YYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=iiFFxC5gMkxwxc2psHpScg1tLsy+yg77+1+dF7n2gmQ=; b=ukT6fuA1XTXsUaUt7HfPOvvCBKZaL5fQ/kaaqdE6VNcuJKk3retkEX7UEHfSOXnV7Y Ku3gvUdRoQncAGJepRmyi9HZnoTU7z2qIzti+yluuT6zDA4cmr7bKQ3kSbI8jo7qNe61 wR/tjiJcca0Kk/OiExRNrT9QTLHFSoyje08LrEHxrj4jhZcDj+6Hr1Aln5C9ZxzHUWB3 Ej8zRUSff0aMYI4NRpIOfV6IxFaowdSae7C8nuW/LbgPr0DMSJ36uLkj4Cw39pYQHH3Z zZLT1/Lg1qYJG/U6oiHSEd7lynFNGus5iDW7LCyejnCvPuIU2k/nLWOGrGR6vGCMOzW8 Wtgw== X-Gm-Message-State: AOAM533iS4PNeGEqDC3spTlsD1fNHc67ufB/3NHqSMVfw2doKky6EhhI CwFKABBH7aReZAeCchQNy4UGCybWGx3ZoqKvDuE= X-Google-Smtp-Source: ABdhPJwZI+70r45tNENdIy2arTw/QQW8GetUSbK6aH5MWtEHEUQUQH4B4Hngt81DJyXhQa0oeoJXQ7ykQkNlkud8dTo= X-Received: by 2002:a05:6e02:dc3:: with SMTP id l3mr5560446ilj.137.1598787194995; Sun, 30 Aug 2020 04:33:14 -0700 (PDT) MIME-Version: 1.0 References: <20200829095101.25350-1-cgxu519@mykernel.net> <20200829095101.25350-4-cgxu519@mykernel.net> In-Reply-To: <20200829095101.25350-4-cgxu519@mykernel.net> From: Amir Goldstein Date: Sun, 30 Aug 2020 14:33:04 +0300 Message-ID: Subject: Re: [RFC PATCH 3/3] ovl: implement stacked mmap for shared map To: Chengguang Xu Cc: overlayfs , Linux MM , Miklos Szeredi , Andrew Morton , Ritesh Harjani Content-Type: text/plain; charset="UTF-8" X-Rspamd-Queue-Id: 2124910046461 X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam01 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Sat, Aug 29, 2020 at 12:51 PM Chengguang Xu wrote: > > Implement stacked mmap for shared map to keep data > consistency. > > Signed-off-by: Chengguang Xu > --- > fs/overlayfs/file.c | 120 +++++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 114 insertions(+), 6 deletions(-) > > diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c > index 14ab5344a918..db5ab200d984 100644 > --- a/fs/overlayfs/file.c > +++ b/fs/overlayfs/file.c > @@ -21,9 +21,17 @@ struct ovl_aio_req { > struct fd fd; > }; > > +static vm_fault_t ovl_fault(struct vm_fault *vmf); > +static vm_fault_t ovl_page_mkwrite(struct vm_fault *vmf); > + > +static const struct vm_operations_struct ovl_vm_ops = { > + .fault = ovl_fault, > + .page_mkwrite = ovl_page_mkwrite, > +}; > + Interesting direction, not sure if this is workable. I don't know enough about mm to say. But what about the rest of the operations? Did you go over them and decide that overlay doesn't need to implement them? I doubt it, but if you did, please document that. > struct ovl_file_entry { > struct file *realfile; > - void *vm_ops; > + const struct vm_operations_struct *vm_ops; > }; > > struct file *ovl_get_realfile(struct file *file) > @@ -40,14 +48,15 @@ void ovl_set_realfile(struct file *file, struct file *realfile) > ofe->realfile = realfile; > } > > -void *ovl_get_real_vmops(struct file *file) > +const struct vm_operations_struct *ovl_get_real_vmops(struct file *file) > { > struct ovl_file_entry *ofe = file->private_data; > > return ofe->vm_ops; > } > > -void ovl_set_real_vmops(struct file *file, void *vm_ops) > +void ovl_set_real_vmops(struct file *file, > + const struct vm_operations_struct *vm_ops) > { > struct ovl_file_entry *ofe = file->private_data; > > @@ -493,11 +502,104 @@ static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync) > return ret; > } > > +vm_fault_t ovl_fault(struct vm_fault *vmf) > +{ > + struct vm_area_struct *vma = vmf->vma; > + struct file *file = vma->vm_file; > + struct file *realfile; > + struct file *fpin, *tmp; > + struct inode *inode = file_inode(file); > + struct inode *realinode; > + const struct cred *old_cred; > + bool retry_allowed; > + vm_fault_t ret; > + int err = 0; > + > + if (fault_flag_check(vmf, FAULT_FLAG_TRIED)) { > + realfile = ovl_get_realfile(file); > + > + if (!ovl_has_upperdata(inode) || > + realfile->f_inode != ovl_inode_upper(inode) || > + !realfile->f_op->mmap) > + return VM_FAULT_SIGBUS; > + > + if (!ovl_get_real_vmops(file)) { > + old_cred = ovl_override_creds(inode->i_sb); > + err = call_mmap(realfile, vma); > + revert_creds(old_cred); > + > + vma->vm_file = file; > + if (err) { > + vma->vm_ops = &ovl_vm_ops; > + return VM_FAULT_SIGBUS; > + } > + ovl_set_real_vmops(file, vma->vm_ops); > + vma->vm_ops = &ovl_vm_ops; > + } > + > + retry_allowed = fault_flag_check(vmf, FAULT_FLAG_ALLOW_RETRY); > + if (retry_allowed) > + vma->vm_flags &= ~FAULT_FLAG_ALLOW_RETRY; > + vma->vm_file = realfile; > + ret = ovl_get_real_vmops(file)->fault(vmf); > + vma->vm_file = file; > + if (retry_allowed) > + vma->vm_flags |= FAULT_FLAG_ALLOW_RETRY; > + return ret; > + > + } else { > + fpin = maybe_unlock_mmap_for_io(vmf, NULL); > + if (!fpin) > + return VM_FAULT_SIGBUS; > + > + ret = VM_FAULT_RETRY; > + if (!ovl_has_upperdata(inode)) { > + err = ovl_copy_up_with_data(file->f_path.dentry); > + if (err) > + goto out; > + } > + > + realinode = ovl_inode_realdata(inode); > + realfile = ovl_open_realfile(file, realinode); > + if (IS_ERR(realfile)) > + goto out; > + > + tmp = ovl_get_realfile(file); > + ovl_set_realfile(file, realfile); > + fput(tmp); > + > +out: > + fput(fpin); > + return ret; > + } > +} Please add some documentation to explain the method used. Do we need to retry if real_vmops are already set? Thanks, Amir.