Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932702AbdCIRfc (ORCPT ); Thu, 9 Mar 2017 12:35:32 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:33551 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932093AbdCIRfa (ORCPT ); Thu, 9 Mar 2017 12:35:30 -0500 MIME-Version: 1.0 In-Reply-To: <20170222000629.7995-1-tuomas@tuxera.com> References: <20170222000629.7995-1-tuomas@tuxera.com> From: Latchesar Ionkov Date: Thu, 9 Mar 2017 11:26:18 -0600 X-Google-Sender-Auth: 57z5Rdd1qg6h8PelWyFkdLpCWEQ Message-ID: Subject: Re: [PATCH] fs/9p: Compare qid.path in v9fs_test_inode To: Tuomas Tynkkynen Cc: Alexander Viro , linux-fsdevel@vger.kernel.org, Eric Van Hensbergen , V9FS Developers , Linux Kernel , "Aneesh Kumar K . V" , stable@vger.kernel.org Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1932 Lines: 54 Reviewed-by: Latchesar Ionkov On Tue, Feb 21, 2017 at 6:06 PM, Tuomas Tynkkynen wrote: > Commit fd2421f54423 ("fs/9p: When doing inode lookup compare qid details > and inode mode bits.") transformed v9fs_qid_iget() to use iget5_locked() > instead of iget_locked(). However, the test() callback is not checking > fid.path at all, which means that a lookup in the inode cache can now > accidentally locate a completely wrong inode from the same inode hash > bucket if the other fields (qid.type and qid.version) match. > > Fixes: fd2421f54423 ("fs/9p: When doing inode lookup compare qid details and inode mode bits.") > Cc: stable@vger.kernel.org > Signed-off-by: Tuomas Tynkkynen > --- > Does this sound sensible? I have never reproduced the problem myself but > reportedly this patch solves some really weird problems where the > symptoms match (wrong files being opened unpredictably). > --- > fs/9p/vfs_inode.c | 3 +++ > fs/9p/vfs_inode_dotl.c | 3 +++ > 2 files changed, 6 insertions(+) > > diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c > index 30ca770c5e0b..f8ab4a66acaf 100644 > --- a/fs/9p/vfs_inode.c > +++ b/fs/9p/vfs_inode.c > @@ -483,6 +483,9 @@ static int v9fs_test_inode(struct inode *inode, void *data) > > if (v9inode->qid.type != st->qid.type) > return 0; > + > + if (v9inode->qid.path != st->qid.path) > + return 0; > return 1; > } > > diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c > index afaa4b6de801..c3dd0d42bb3a 100644 > --- a/fs/9p/vfs_inode_dotl.c > +++ b/fs/9p/vfs_inode_dotl.c > @@ -87,6 +87,9 @@ static int v9fs_test_inode_dotl(struct inode *inode, void *data) > > if (v9inode->qid.type != st->qid.type) > return 0; > + > + if (v9inode->qid.path != st->qid.path) > + return 0; > return 1; > } > > -- > 2.11.1 >