From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751403AbdBXSod (ORCPT ); Fri, 24 Feb 2017 13:44:33 -0500 Received: from merlin.infradead.org ([205.233.59.134]:59430 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751273AbdBXSoD (ORCPT ); Fri, 24 Feb 2017 13:44:03 -0500 Message-Id: <20170224162043.988779074@infradead.org> User-Agent: quilt/0.63-1 Date: Fri, 24 Feb 2017 16:43:31 +0100 From: Peter Zijlstra To: Al Viro , Linus Torvalds , Chris Mason Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, David Howells , elena.reshetova@intel.com, ishkamiel@gmail.com, dwindsor@gmail.com, gregkh@linuxfoundation.org, peterz@infradead.org Subject: [RFC][PATCH 02/10] fs: Avoid looking at i_count without i_lock held References: <20170224154329.478276481@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline; filename=peterz-fs-inode-2.patch Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In general i_count will only stay 0 if we have i_lock held. I realize this is evict, so having MS_ACTIVE cleared might avoid the race against find_inode_fast() in other ways. Signed-off-by: Peter Zijlstra (Intel) --- fs/inode.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) --- a/fs/inode.c +++ b/fs/inode.c @@ -604,10 +604,12 @@ void evict_inodes(struct super_block *sb again: spin_lock(&sb->s_inode_list_lock); list_for_each_entry_safe(inode, next, &sb->s_inodes, i_sb_list) { - if (atomic_read(&inode->i_count)) + spin_lock(&inode->i_lock); + if (atomic_read(&inode->i_count)) { + spin_unlock(&inode->i_lock); continue; + } - spin_lock(&inode->i_lock); if (inode->i_state & (I_NEW | I_FREEING | I_WILL_FREE)) { spin_unlock(&inode->i_lock); continue;