Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2371900pxj; Sun, 13 Jun 2021 18:36:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxyOzhRlNk/tLUd6J+m3dWNMs32X2tDo8NgbvobsyD+mtb8imCVDYq+RpcDzN6kjSr9wkJY X-Received: by 2002:a17:906:27d3:: with SMTP id k19mr12603246ejc.368.1623634590736; Sun, 13 Jun 2021 18:36:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623634590; cv=none; d=google.com; s=arc-20160816; b=kb/5a5zouUXYFXocMIYs7xMLkp5kCJEfgsFOpJ9o8xq9fS6cqaWex0mLy0dAwyHZwA JVG0eHCT5I5sCNe/hBSQv+uzwxo36rS3xq95G4APRDHYmWbhXUpA5pD3oz3drekH2/nA Fl61N95gWn+xSX4hJVv7qgYuoCrBo5gLDMQWQ/KKfdW2G9XGMlFTncNmtspXX8Bgsri/ g8hUyT2STwSXQYCzpQBnD0mUt6sr/5mPI0ooxBiR24+jTUR4xSpIIyZ39WLEehNGmFOB 3ySIoXh8JVzqhTMXOLSpVIf5ocyuSOrUgEqVUnJ0ZYYnxk3qGtnNmqo9GotEYS2aB5lb NmrA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:date:cc:to:from:subject :message-id:dkim-signature:dkim-signature; bh=qGkGzluDZKwa6XNj5xwftgaTKUt7kFu8R2chJvRiqtA=; b=Xc0oLKCAcCRAmVUTK+oj5IoLS7PVNoGBqjUft2Q0mA255YQnI5k6CpihnMrq9O/r5g TXDUf42jtjnQFrwQbe/ypPQ8eWimI83icxyqnWTk7tCmDGAKjfmGvBq0qNkIewQ7CpNj Ds1ex5WPXPuRQz3bfcYFUk+WckBTuFhd4mN2H8z/7pNx0oB4oSQmdvQe0JEGKwZ8EDOd mqOhFyi/QwE2GstKjCDqJSNi9MR4xU/DXvPpcEyoigZ7GYcp7qjLk5N5xjyCQJSDU5DX P0lnnknf4E+QCxCuoCMIEANwho1lBVXtGW16vbW+LmD9VkLBvxaHmhVXC3E54ih+4mV+ Tl3g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@themaw.net header.s=fm3 header.b=kSEVafMl; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b=dsoboGMS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ce20si9601890ejc.618.2021.06.13.18.35.57; Sun, 13 Jun 2021 18:36:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@themaw.net header.s=fm3 header.b=kSEVafMl; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b=dsoboGMS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232273AbhFNBeg (ORCPT + 99 others); Sun, 13 Jun 2021 21:34:36 -0400 Received: from wnew1-smtp.messagingengine.com ([64.147.123.26]:60161 "EHLO wnew1-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232076AbhFNBef (ORCPT ); Sun, 13 Jun 2021 21:34:35 -0400 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailnew.west.internal (Postfix) with ESMTP id 9EF2719F0; Sun, 13 Jun 2021 21:32:32 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Sun, 13 Jun 2021 21:32:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=themaw.net; h= message-id:subject:from:to:cc:date:in-reply-to:references :content-type:mime-version:content-transfer-encoding; s=fm3; bh= qGkGzluDZKwa6XNj5xwftgaTKUt7kFu8R2chJvRiqtA=; b=kSEVafMle+mzaEWA E+shbM5uq2ESPTlJ4jVr37M2oOiAFvmb6c3sObYI+/CUj5kqebj6RDWOynPMOFlQ 0zK6s2Bqw4UNeRsEIeWvHQMqiknV7+Zelvju2OZ+/emhbmmKqREe50LCkDJJMG97 0Sge0X5NSY4aknqkJdpUCdHvQh9qLmOnq4KCbGQHAxNETkJHqCMhuwtsK/EDTU5Q aE/xlI9PBA9EDqk9J8WK8Z2R5NBY6mZJUbY8DxOkEZ3EZCEVzDdOdnlTtGqw5nQZ /OwJE4Vh8FumCAbGL7uQtnmLPXWte/IxYO+GqHSZKz5sUIGaWeyIGMtl39LjtNOw 2JRwvw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm3; bh=qGkGzluDZKwa6XNj5xwftgaTKUt7kFu8R2chJvRiq tA=; b=dsoboGMSUo9hLvBGc5pxH9hvyrpgzV88QtaPavpkt2NQPJUJ+gHpooUrB XqvPV3YTMEt6mUtflbJ9XgV1YXP4INjgAHbKbrIF5779azRRYEOb5w6rzv+maIlA nUo8JB3CkBD3SAg3ve0ycsS0HmDJqQd7efE9dl0FdW+dN0sz1jhfykXRU70Ohq5d ldthLqDxH0u0+o8fcJDBUwnzBMSFfyz371uT1vbKAHit6W13P53HBVIY08uzqL6j z2wT3JE/B16VjHdkKua+d2oGfXsdOQRIcLVx5O7Vt09CKM5eWI7ZxSKbd7pJIgUX XqmAuBsRdGxWrllymYtrtImxQp0CQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrfedvgedggeehucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepkffuhffvffgjfhgtfggggfesthekredttderjeenucfhrhhomhepkfgrnhcu mfgvnhhtuceorhgrvhgvnhesthhhvghmrgifrdhnvghtqeenucggtffrrghtthgvrhhnpe fgleelkeetheelgeehueejueduhfeufffgleehgfevtdehhffhhffhtddugfefheenucev lhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehrrghvvghnse hthhgvmhgrfidrnhgvth X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 13 Jun 2021 21:32:26 -0400 (EDT) Message-ID: <43fe46a18bdc2e46f62a07f1e4a9b3d042ef3c01.camel@themaw.net> Subject: Re: [PATCH v6 5/7] kernfs: use i_lock to protect concurrent inode updates From: Ian Kent To: Al Viro Cc: Greg Kroah-Hartman , Tejun Heo , Eric Sandeen , Fox Chen , Brice Goglin , Rick Lindsley , David Howells , Miklos Szeredi , Marcelo Tosatti , "Eric W. Biederman" , Carlos Maiolino , linux-fsdevel , Kernel Mailing List Date: Mon, 14 Jun 2021 09:32:22 +0800 In-Reply-To: References: <162322846765.361452.17051755721944717990.stgit@web.messagingengine.com> <162322868275.361452.17585267026652222121.stgit@web.messagingengine.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, 2021-06-12 at 01:45 +0000, Al Viro wrote: > On Wed, Jun 09, 2021 at 04:51:22PM +0800, Ian Kent wrote: > > The inode operations .permission() and .getattr() use the kernfs > > node > > write lock but all that's needed is to keep the rb tree stable > > while > > updating the inode attributes as well as protecting the update > > itself > > against concurrent changes. > > Huh?  Where does it access the rbtree at all?  Confused... > > > diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c > > index 3b01e9e61f14e..6728ecd81eb37 100644 > > --- a/fs/kernfs/inode.c > > +++ b/fs/kernfs/inode.c > > @@ -172,6 +172,7 @@ static void kernfs_refresh_inode(struct > > kernfs_node *kn, struct inode *inode) > >  { > >         struct kernfs_iattrs *attrs = kn->iattr; > >   > > +       spin_lock(&inode->i_lock); > >         inode->i_mode = kn->mode; > >         if (attrs) > >                 /* > > @@ -182,6 +183,7 @@ static void kernfs_refresh_inode(struct > > kernfs_node *kn, struct inode *inode) > >   > >         if (kernfs_type(kn) == KERNFS_DIR) > >                 set_nlink(inode, kn->dir.subdirs + 2); > > +       spin_unlock(&inode->i_lock); > >  } > > Even more so - just what are you serializing here?  That code > synchronizes inode > metadata with those in kernfs_node.  Suppose you've got two threads > doing > ->permission(); the first one gets through kernfs_refresh_inode() and > goes into > generic_permission().  No locks are held, so kernfs_refresh_inode() > from another > thread can run in parallel with generic_permission(). > > If that's not a problem, why two kernfs_refresh_inode() done in > parallel would > be a problem? > > Thread 1: >         permission >                 done refresh, all locks released now > Thread 2: >         change metadata in kernfs_node > Thread 2: >         permission >                 goes into refresh, copying metadata into inode > Thread 1: >                 generic_permission() > No locks in common between the last two operations, so > we generic_permission() might see partially updated metadata. > Either we don't give a fuck (in which case I don't understand > what purpose does that ->i_lock serve) *or* we need the exclusion > to cover a wider area. This didn't occur to me, obviously. It seems to me this can happen with the original code too although using a mutex might reduce the likelihood of it happening. Still ->permission() is meant to be a read-only function so the VFS shouldn't need to care about it. Do you have any suggestions on how to handle this. Perhaps the only way is to ensure the inode is updated only in functions that are expected to do this. Ian