From mboxrd@z Thu Jan 1 00:00:00 1970 From: Al Viro Subject: Re: [PATCH v17 10/13] namei: LOOKUP_{IN_ROOT,BENEATH}: permit limited ".." resolution Date: Mon, 25 Nov 2019 00:35:01 +0000 Message-ID: <20191125003501.GF4203@ZenIV.linux.org.uk> References: <20191117011713.13032-1-cyphar@cyphar.com> <20191117011713.13032-11-cyphar@cyphar.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline In-Reply-To: <20191117011713.13032-11-cyphar@cyphar.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+glppe-linuxppc-embedded-2=m.gmane.org@lists.ozlabs.org Sender: "Linuxppc-dev" To: Aleksa Sarai Cc: Song Liu , linux-ia64@vger.kernel.org, linux-doc@vger.kernel.org, Peter Zijlstra , Rasmus Villemoes , Alexei Starovoitov , linux-kernel@vger.kernel.org, David Howells , linux-kselftest@vger.kernel.org, sparclinux@vger.kernel.org, containers@lists.linux-foundation.org, Christian Brauner , linux-api@vger.kernel.org, Shuah Khan , linux-arch@vger.kernel.org, linux-s390@vger.kernel.org, Tycho Andersen , Daniel Borkmann , Jonathan Corbet , Jiri Olsa , linux-sh@vger.kernel.org, Alexander Shishkin , Ingo Molnar , linux-arm-kernel@lists.infradead.org, Yonghong Song , linux-mips@vger.kernel.o List-Id: linux-api@vger.kernel.org On Sun, Nov 17, 2019 at 12:17:10PM +1100, Aleksa Sarai wrote: > + if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) { > + /* > + * If there was a racing rename or mount along our > + * path, then we can't be sure that ".." hasn't jumped > + * above nd->root (and so userspace should retry or use > + * some fallback). > + */ > + if (unlikely(read_seqretry(&mount_lock, nd->m_seq))) > + return -EAGAIN; > + if (unlikely(read_seqretry(&rename_lock, nd->r_seq))) > + return -EAGAIN; > + } Looks like excessive barriers to me - it's rmb check mount_lock.sequence rmb check rename_lock.sequence > @@ -2266,6 +2274,10 @@ static const char *path_init(struct nameidata *nd, unsigned flags) > nd->last_type = LAST_ROOT; /* if there are only slashes... */ > nd->flags = flags | LOOKUP_JUMPED | LOOKUP_PARENT; > nd->depth = 0; > + > + nd->m_seq = read_seqbegin(&mount_lock); > + nd->r_seq = read_seqbegin(&rename_lock); Same here, pretty much (fetch/rmb/fetch/rmb)