Received: by 2002:a05:6358:4e97:b0:b3:742d:4702 with SMTP id ce23csp3125267rwb; Mon, 15 Aug 2022 18:45:30 -0700 (PDT) X-Google-Smtp-Source: AA6agR5ocSI3ycATT1pjUDatSDx0wbdhymn2RcFvP08kJBQX5HpWbR0ncUk4WNKT2pjs+/2wy6Fi X-Received: by 2002:a05:6402:25c6:b0:43b:7797:d953 with SMTP id x6-20020a05640225c600b0043b7797d953mr16757634edb.254.1660614330275; Mon, 15 Aug 2022 18:45:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660614330; cv=none; d=google.com; s=arc-20160816; b=r6JADOJ+ZUOGxWhf56gc8Qvgms6WKpIDnOxZo2bYvTUCuhVs9e9fbjZTgSlVEcbSR3 JZID5rLQn17NWi6qWwcwnsbVnRtA8Xx4x0qCpPQG3tbYcS+D9Y1Vao5ag2NDCwykZHbK q4BaqqyzCf4IV0x8Npq/tEWEfI97DwGpvRVeHfuQtX1h2fC0pYn4xsZKXDYcLfDnghPa rhkfTFMT9IVbkT5QTi7uE2P+jWp+T3k1fONKCR+t6kmWGVRj+QJTqDWzIneUcxLl+OkJ aSw50zzo9X5d1MoCoPAyJ94U0zWf5ZkYQJDAo94vCBu5bUgqyhLY3VB5L8tfJOqvMPk/ yjeg== 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:message-id:date:subject:cc:to :from:dkim-signature; bh=imtWnV9xg1jW6xtofx82BmwccPDKxmiKkdB+rErjRAA=; b=QfufOnzKgSHNphW45VvRMKCh0qCOGc/FlsLzBuBXa3U27IkhreczMp4FSiPEv2tHH/ rWHz/gUU2dJk8Tevpf1h2PfrqDXmez7QAE3KlQ7Db/kK54Lk1R38HCoqT6sQMC1w/jZH 5uHd5c0I5SVrKfeYqMbWcpMkbjuwLuRaNx2ZAbQFpMwr/jP9otFfzYf1e0X/V7RmDpmV nnRtn4zlnemtUBvIRbNoK0q9AeEEjDQj10wOgLI79xj2LswA8pP7CJKm6OhPUe2Uai+Y 4x+jTx1GT8SVmTEIuUFjdaJ5KmEWJutGzgpzriHdJDZd0bfAIGETbvM0apeFUpWrxwsN q+eg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=gl8aVdF3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id go16-20020a1709070d9000b0072f1f3ec581si11120019ejc.264.2022.08.15.18.45.05; Mon, 15 Aug 2022 18:45:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=gl8aVdF3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353864AbiHOXi5 (ORCPT + 99 others); Mon, 15 Aug 2022 19:38:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50864 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353617AbiHOXfo (ORCPT ); Mon, 15 Aug 2022 19:35:44 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B716672ED5; Mon, 15 Aug 2022 13:09:08 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 30D95B80EAD; Mon, 15 Aug 2022 20:09:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 736B0C433D6; Mon, 15 Aug 2022 20:09:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1660594145; bh=cNi4JLBqXW0guprOQqIvlJggX6vKfUgM0ghIRDf5R5U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gl8aVdF3Ym9cvWWEY0/1Y9pTq/a10x+7H6dnyOwwFfCCuAOokRigCVsD1kSCWgiwV 1gXXtjwxv2/U53Zh1mjPNDJKAzD5rE8JpwsfoV3d7ADtLNzUYZMRY6VVOg1dQcrrg3 nOS9guILcJCa1x+xfel3uDtoO4IZepFxq0nlm8Us= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jan Kara , Theodore Tso , Sasha Levin Subject: [PATCH 5.18 1063/1095] ext4: remove EA inode entry from mbcache on inode eviction Date: Mon, 15 Aug 2022 20:07:42 +0200 Message-Id: <20220815180513.007694070@linuxfoundation.org> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220815180429.240518113@linuxfoundation.org> References: <20220815180429.240518113@linuxfoundation.org> User-Agent: quilt/0.67 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jan Kara [ Upstream commit 6bc0d63dad7f9f54d381925ee855b402f652fa39 ] Currently we remove EA inode from mbcache as soon as its xattr refcount drops to zero. However there can be pending attempts to reuse the inode and thus refcount handling code has to handle the situation when refcount increases from zero anyway. So save some work and just keep EA inode in mbcache until it is getting evicted. At that moment we are sure following iget() of EA inode will fail anyway (or wait for eviction to finish and load things from the disk again) and so removing mbcache entry at that moment is fine and simplifies the code a bit. CC: stable@vger.kernel.org Fixes: 82939d7999df ("ext4: convert to mbcache2") Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20220712105436.32204-3-jack@suse.cz Signed-off-by: Theodore Ts'o Signed-off-by: Sasha Levin --- fs/ext4/inode.c | 2 ++ fs/ext4/xattr.c | 24 ++++++++---------------- fs/ext4/xattr.h | 1 + 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 9ef6f41a5250..e94ec798dce1 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -178,6 +178,8 @@ void ext4_evict_inode(struct inode *inode) trace_ext4_evict_inode(inode); + if (EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL) + ext4_evict_ea_inode(inode); if (inode->i_nlink) { /* * When journalling data dirty buffers are tracked only in the diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index c3c3194f3ee1..b57fd07fbdba 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c @@ -436,6 +436,14 @@ static int ext4_xattr_inode_iget(struct inode *parent, unsigned long ea_ino, return err; } +/* Remove entry from mbcache when EA inode is getting evicted */ +void ext4_evict_ea_inode(struct inode *inode) +{ + if (EA_INODE_CACHE(inode)) + mb_cache_entry_delete(EA_INODE_CACHE(inode), + ext4_xattr_inode_get_hash(inode), inode->i_ino); +} + static int ext4_xattr_inode_verify_hashes(struct inode *ea_inode, struct ext4_xattr_entry *entry, void *buffer, @@ -976,10 +984,8 @@ int __ext4_xattr_set_credits(struct super_block *sb, struct inode *inode, static int ext4_xattr_inode_update_ref(handle_t *handle, struct inode *ea_inode, int ref_change) { - struct mb_cache *ea_inode_cache = EA_INODE_CACHE(ea_inode); struct ext4_iloc iloc; s64 ref_count; - u32 hash; int ret; inode_lock(ea_inode); @@ -1002,14 +1008,6 @@ static int ext4_xattr_inode_update_ref(handle_t *handle, struct inode *ea_inode, set_nlink(ea_inode, 1); ext4_orphan_del(handle, ea_inode); - - if (ea_inode_cache) { - hash = ext4_xattr_inode_get_hash(ea_inode); - mb_cache_entry_create(ea_inode_cache, - GFP_NOFS, hash, - ea_inode->i_ino, - true /* reusable */); - } } } else { WARN_ONCE(ref_count < 0, "EA inode %lu ref_count=%lld", @@ -1022,12 +1020,6 @@ static int ext4_xattr_inode_update_ref(handle_t *handle, struct inode *ea_inode, clear_nlink(ea_inode); ext4_orphan_add(handle, ea_inode); - - if (ea_inode_cache) { - hash = ext4_xattr_inode_get_hash(ea_inode); - mb_cache_entry_delete(ea_inode_cache, hash, - ea_inode->i_ino); - } } } diff --git a/fs/ext4/xattr.h b/fs/ext4/xattr.h index f885f362add4..e5e36bd11f05 100644 --- a/fs/ext4/xattr.h +++ b/fs/ext4/xattr.h @@ -191,6 +191,7 @@ extern void ext4_xattr_inode_array_free(struct ext4_xattr_inode_array *array); extern int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize, struct ext4_inode *raw_inode, handle_t *handle); +extern void ext4_evict_ea_inode(struct inode *inode); extern const struct xattr_handler *ext4_xattr_handlers[]; -- 2.35.1