Received: by 10.192.165.148 with SMTP id m20csp2246499imm; Thu, 26 Apr 2018 08:03:21 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+Dwes7yKbekGyhLe2ZStrHpQR0K2EfUd8MvTl96vvXofnyeygAgvHwmW08iGKi0fCMUSsP X-Received: by 10.98.66.143 with SMTP id h15mr21347818pfd.156.1524755001811; Thu, 26 Apr 2018 08:03:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524755001; cv=none; d=google.com; s=arc-20160816; b=zP/s2jtF03EqMSKV7pPzggKdHdgxZsl3DrELJSs48dw+vXiLHGAHlJ8BR20cy6/QN0 HnNnb9vJymwy1q/DOUebu1ZAQqcpOirqBNGGOmJopP4W07T/hW3AyST8XCgmfdB/kmIe WiVj+xb8X6GjZentYIwO9tusJV0puQRwyNK9Bm7IAVIeEwRdYzUrbHE2sYXhDYLjV3Iw LYxGrB43r2UZXd0BX7+mXUiu/FSQ7XwkB0cCu/AL3FVU+i6hf0KRRoa27tDATtKtSjay 8fYILm9XK0pJWkcG+Im5zmGkof01TOoe+SBKe/94SCmPYRC0V8bvIYWXY/UCbKN2hYdS q2Dg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=nhkZHMuwNKZqrdGaSoqFphrvMe5CZG4P2MvYKlTi1Js=; b=smzIHOan5iyWwNTKPeOBwtf7d29niUdUuqiEqHipMW29Buvp/CZn44WvF9Yp1KJu3n p17qy8fCklYCYEv/Jk3ukbwyl9sX4YZRO8u0bMnFOjM1cvUStCPRMhpfWe+6i2TXK27N DHiUTZ0+GIJCC6y4Xesfb3VbPwiEk6D2PvH/amtFNviNnPNLLlpT0z+kzyBXlLAAlyT2 qFVXGPcQ1s6C4IzmP7OAa+9GONpBc/5b+N+ORk8+lyrjG1IjFp8Zfu7+TXhzBGU4B7GS z3pasIuMC32gWl3DyPM+lw9mHW3jOB8NLyeawh30i+H0Bl4wKp0HweBxO3yfCofd0Ozt hx2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=temperror (no key for signature) header.i=@szeredi.hu header.s=google header.b=UAwe6WsU; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e6si16049611pgn.473.2018.04.26.08.03.03; Thu, 26 Apr 2018 08:03:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=temperror (no key for signature) header.i=@szeredi.hu header.s=google header.b=UAwe6WsU; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756691AbeDZPBn (ORCPT + 99 others); Thu, 26 Apr 2018 11:01:43 -0400 Received: from mail-oi0-f68.google.com ([209.85.218.68]:41205 "EHLO mail-oi0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756611AbeDZPBj (ORCPT ); Thu, 26 Apr 2018 11:01:39 -0400 Received: by mail-oi0-f68.google.com with SMTP id 11-v6so8830512ois.8 for ; Thu, 26 Apr 2018 08:01:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=szeredi.hu; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=nhkZHMuwNKZqrdGaSoqFphrvMe5CZG4P2MvYKlTi1Js=; b=UAwe6WsUuRXaeEGSMvFVE+mRdBy+CDxYOMmr8j6RLMqzzD9hEadMOTwKq8jZX01zrq ri6YXXIn3yS/u8nZCw0zZmLt61WZrhKrh5OktiWxD+H5GtBJL7h5gdio8Jn/tJ1Mm98x c9zL/nAyoPMF9YVzxxhimHKBT0Y4XNfvEEyXY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=nhkZHMuwNKZqrdGaSoqFphrvMe5CZG4P2MvYKlTi1Js=; b=n42YDAN3EZl9uzsO3NK7SmCSrjstSe2m32sCbxKqveaEOTX9ZWyXMsdLmugdH0ubzb MCvDAZ9nbSUmxTboMlNVadYF1+zX0z/MV37VTBKVrGme/9q9V4PxFPgvBOiGwq2UsNtJ lDXtyE+VAU3Be1aSOHaHqx3TnTMnEOBuBtNFpm0oF4gERkG1IJ3ntnYcoiX7qyg1QWFS fbXhZNGwDCQ9qdvzX5gEHP4hyo2pDwXn/L+H4ihAIIUrg3G6Ma+KdzPFNMSGiQjVcRZb cWhUyHfzGU9fyQjJr1IS2T8XUiOTF4CEDsh1+W658xzcgkMG4wAA0GV/ndcI5NQ6K3Kx rmsw== X-Gm-Message-State: ALQs6tCH4lpuOw1TgPypdZw2N5FAarzO0Pbs67gJIGyeafBCbFgsN1FJ 8JBMGuBMfQwRrllgvZPHdASlS1/77icjpXpYF8024w== X-Received: by 2002:aca:a93:: with SMTP id k19-v6mr22020356oiy.250.1524754898465; Thu, 26 Apr 2018 08:01:38 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a9d:5303:0:0:0:0:0 with HTTP; Thu, 26 Apr 2018 08:01:37 -0700 (PDT) X-Originating-IP: [176.63.54.97] In-Reply-To: <20180426145641.GB4308@redhat.com> References: <20180412150826.20988-1-mszeredi@redhat.com> <20180412150826.20988-10-mszeredi@redhat.com> <20180426141337.GA4308@redhat.com> <20180426145641.GB4308@redhat.com> From: Miklos Szeredi Date: Thu, 26 Apr 2018 17:01:37 +0200 Message-ID: Subject: Re: [RFC PATCH 09/35] ovl: stack file ops To: Vivek Goyal Cc: Miklos Szeredi , overlayfs , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Apr 26, 2018 at 4:56 PM, Vivek Goyal wrote: > On Thu, Apr 26, 2018 at 04:43:53PM +0200, Miklos Szeredi wrote: >> On Thu, Apr 26, 2018 at 4:13 PM, Vivek Goyal wrote: >> > On Thu, Apr 12, 2018 at 05:08:00PM +0200, Miklos Szeredi wrote: >> > >> > [..] >> >> diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c >> >> new file mode 100644 >> >> index 000000000000..a0b606885c41 >> >> --- /dev/null >> >> +++ b/fs/overlayfs/file.c >> >> @@ -0,0 +1,76 @@ >> >> +/* >> >> + * Copyright (C) 2017 Red Hat, Inc. >> >> + * >> >> + * This program is free software; you can redistribute it and/or modify it >> >> + * under the terms of the GNU General Public License version 2 as published by >> >> + * the Free Software Foundation. >> >> + */ >> >> + >> >> +#include >> >> +#include >> >> +#include >> >> +#include "overlayfs.h" >> >> + >> >> +static struct file *ovl_open_realfile(const struct file *file) >> >> +{ >> >> + struct inode *inode = file_inode(file); >> >> + struct inode *upperinode = ovl_inode_upper(inode); >> >> + struct inode *realinode = upperinode ?: ovl_inode_lower(inode); >> >> + struct file *realfile; >> >> + const struct cred *old_cred; >> >> + >> >> + old_cred = ovl_override_creds(inode->i_sb); >> >> + realfile = path_open(&file->f_path, file->f_flags | O_NOATIME, >> >> + realinode, current_cred(), false); >> >> + revert_creds(old_cred); >> >> + >> >> + pr_debug("open(%p[%pD2/%c], 0%o) -> (%p, 0%o)\n", >> >> + file, file, upperinode ? 'u' : 'l', file->f_flags, >> >> + realfile, IS_ERR(realfile) ? 0 : realfile->f_flags); >> >> + >> >> + return realfile; >> >> +} >> >> + >> >> +static int ovl_open(struct inode *inode, struct file *file) >> >> +{ >> >> + struct dentry *dentry = file_dentry(file); >> > >> > Hi Miklos, >> > >> > There is one thing I can't wrap my head around, so I better ask. >> > >> > file_dentry() will call ovl_d_real() and try to find dentry based on >> > inode installed in f->f_inode. If ovl_d_real() can't find inode dentry >> > matching the passed in inode, it warns. >> > >> > Assume, I have a stacked overlay configuration. Let me call top level >> > overlay layer ovl1 and lower level overlay layer ovl2. Say I open a >> > file foo.txt. Now ovl_open() in ovl1 decides that realinode is a lower >> > inode and installs that inode f->f_inode of realfile. (This should be >> > ovl2 layer inode, let me call it ovl2_inode). Now ovl_open() of ovl2 layer >> > will be called and it will call file_dentry() and will look for dentry >> > corresponding to ovl2_inode. I am wondering what if a copy up of foo.txt >> > was triggered in ovl1 and by the time we called ovl_d_real(dentry, >> > ovl2_inode), it will start comparing with inode of ovl1_upper and never >> > find ovl2_inode. >> >> Okay, so we've modified ovl_d_real() to allow returning the overlay >> dentry itself. This is important: when we fail to match ovl1_upper >> with ovl2_inode, well go on to get ovl2_dentry and call d_real() >> recursively. That recursive call should match the inode, return it to >> outer ovl_d_real(), which again will match the inode and return >> without warning. > > So current code does following. > > ovl_d_real() { > ... > ... > > real = ovl_dentry_real(dentry); > if (inode == d_inode(real)) > return real; > > /* Handle recursion */ > if (unlikely(real->d_flags & DCACHE_OP_REAL)) > return real->d_op->d_real(real, inode); > } > > If file got copied up in ovl1, then "real" will be ovl1_upper dentry. And > upper is regular fs (only ovl1 lower is overlay), then it should not have > DCACHE_OP_REAL set and that means we will not recurse further and not > find ovl2 dentry matching ovl2_inode and print warning and return > ovl1 dentry. > > What am I missing. Ah, that's indeed buggy. The bug is in "[RFC PATCH 34/35] vfs: simplify d_op->d_real()". I've already reverted that (due to d_real_inode() acquiring a new user) and the old code should be good (AFAICS). Thanks, Miklos