From nobody Sun Feb 8 17:37:41 2026 Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E6B9D22B8B6 for ; Sun, 11 Jan 2026 08:38:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768120736; cv=none; b=GWvSwDTPvnrgiaURsuKW3nu0GPygArVNtSQYFQzvEpZdhLHSXjagtbCq6TEMzBiXJZDNf9OXrVl6+biaMGS13c6AzhGpr04aFw+5n31HPVoFTsXErNKH2N1XkII7dZwCsQOzIt59U3MmhNOP3WD94FyK0MWKhERhd1iM8UvT3+w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768120736; c=relaxed/simple; bh=jE9/CgoTlUgc2lv2zb/ctgAkQ+7hnK5bGyYGmGDMyS8=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=T3r7q8LAUnzCo3v7d6AcWHxbqNFwnc7ZiXF2qGNJV/39KstbVhdHRq2NS1xlFYEQcF2EmZUlWNDOPNiPbYrrKzBd82ZlSEHV50sKCLRY4k7XZ60royKupcNAtae6sKvp3UtkzkJNIUJcXWds8fsRvkU8d/PZPOF6stuPnVhXSpY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=MJItWBTn; arc=none smtp.client-ip=209.85.208.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="MJItWBTn" Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-64ba9a00b5aso7949464a12.2 for ; Sun, 11 Jan 2026 00:38:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768120733; x=1768725533; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=8Hqfr4217uXPrOb4EkX5rARQEf/pV9M4LN/KyODRFok=; b=MJItWBTnO2YI2s48Hq63NrndDSrb0ggkSwmnPlHPbJ3+QT3x/iM6eZk52UExvAAl7C jsfkve0fg0Zxvo1WzsGJFQTIa+B5c43sLzusS1a5gvmQgoVsH0VGxM821f6DgOKNvGGL HtWyc1hYUd9Is4o6HkM7RqEZJ4DNdy7/hlaRlRISp6sTR+N9Lbo38f0NTORaYA6enaDU Kukg5fMk3lOVGmoqPECEY1G2lDUuURzlFpS9Ar+VIasOo4dvueBTw33FPbPA2bT3siaA KIa8dX+SiHbiy8wFm7MU0PulycBoBp72HHdl2dSKLeQfHCjk9RDS2vAcbgb5ynZQuz4v 7VFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768120733; x=1768725533; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=8Hqfr4217uXPrOb4EkX5rARQEf/pV9M4LN/KyODRFok=; b=mvch9u0FD230ubErTqv/re8r8twiKNzI5UJ0rY6Lbtbh2oeXcory1o0xeVnI7mI+mt 0yg0u/uC+0kcS2WMSkMiGMrYcvUgLFPY46jqAriyzAwH7PK3VrLxpNKBFdo1FvkrBwEo JCW5q4eoy1eFOCg0VBvOAEAelolEiU8fBcQ/wfMx5jSj1IrvL/vimYLb9AlJxeK3N5Zb LGhDy6vjzBQQ7m4qZO9FqP++67I17/BX3iE0ffbnBYxvrgelFIB+o+mG4AeIkZTEsUJR b7EvLcRr/ubewBWS0QwoO/UyfCffy4uYrwuG5kDLsWlzoxvpUWIUqzDDqaiJW0dhyKy8 wNyw== X-Forwarded-Encrypted: i=1; AJvYcCXxQ0XF+5BA5hUmBR1i2H2Cj731/rEWf2ZHVrs+OM5coTcPvedotaYhn/PPema7STMW8Dwhs7TzJ3809mU=@vger.kernel.org X-Gm-Message-State: AOJu0YwDOcuDpDvAR4ksoS9SYNiyKzSz0105fN9Ao9YJASOaitR/j/gs VBpoLe9rLPI3ShK3EwwDvFuusU6xRzHeFuz/gUy9xXFEmiyG+4btIGdM X-Gm-Gg: AY/fxX4byrDpBS84XMuawbn9ZHHKYIraH8VyXLWfAjSlIMiT1cL/QfCIMcF49v3/w5K UN7Y0nZsLol7Arxj+Uw8fJFeeE8jgJVEs5N3uGIyoC0PwGy7DEi3na+XIRPQWZSNmij31HueDhK J+9qRhSruzncn4dkvVx+WYZveUpORp43oUpCJf1dnMsZ244aLcNseMwQRUa8Z29xwBLDsEXjfWB jfOW8JD8GAPtZ3td6NlviYXojG4u4a/vcK9Bd9T+oefvOU4R7oyCRyDYSLjLdIjeilmICjvqMuV DX74+FZ8u6xEhwUWjWFloLxJNZxIQ3XcKmiCVUAfOEt/v3MmgUELHclNyGyWjeR3q62Foj25vZj zvx2hUJyzkE924SZ5ToOeSF5/9hbGKiGs45m0HRDWbE7SkjgD+c5k9fMel7wjsmvZfmMhl9ibWx P/H4Nu547Y1isNcRnijSRk1vF9HWQJxL6Oy10C7+PB0YJ8hqQihcdt6k6yVKg= X-Google-Smtp-Source: AGHT+IEspf3qIohQNkUkRrdzofIMxm51ocQHUoALfJS3sFw+KNqAYJt28Z24+rws7/pAKA50BUtYHA== X-Received: by 2002:a17:907:1909:b0:b86:f0b4:4996 with SMTP id a640c23a62f3a-b86f0b44c84mr298334566b.25.1768120732949; Sun, 11 Jan 2026 00:38:52 -0800 (PST) Received: from f.. (cst-prg-93-36.cust.vodafone.cz. [46.135.93.36]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6507bf667fcsm14304272a12.29.2026.01.11.00.38.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Jan 2026 00:38:52 -0800 (PST) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Mateusz Guzik Subject: [PATCH] fs: make insert_inode_locked() wait for inode destruction Date: Sun, 11 Jan 2026 09:38:42 +0100 Message-ID: <20260111083843.651167-1-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This is the only routine which instead skipped instead of waiting. The current behavior is arguably a bug as it results in a corner case where the inode hash can have *two* matching inodes, one of which is on its way out. Ironing out this difference is an incremental step towards sanitizing the API. Signed-off-by: Mateusz Guzik Reviewed-by: Jan Kara --- fs/inode.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fs/inode.c b/fs/inode.c index f8904f813372..3b838f07cb40 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1832,16 +1832,13 @@ int insert_inode_locked(struct inode *inode) while (1) { struct inode *old =3D NULL; spin_lock(&inode_hash_lock); +repeat: hlist_for_each_entry(old, head, i_hash) { if (old->i_ino !=3D ino) continue; if (old->i_sb !=3D sb) continue; spin_lock(&old->i_lock); - if (inode_state_read(old) & (I_FREEING | I_WILL_FREE)) { - spin_unlock(&old->i_lock); - continue; - } break; } if (likely(!old)) { @@ -1852,6 +1849,11 @@ int insert_inode_locked(struct inode *inode) spin_unlock(&inode_hash_lock); return 0; } + if (inode_state_read(old) & (I_FREEING | I_WILL_FREE)) { + __wait_on_freeing_inode(old, true); + old =3D NULL; + goto repeat; + } if (unlikely(inode_state_read(old) & I_CREATING)) { spin_unlock(&old->i_lock); spin_unlock(&inode_hash_lock); --=20 2.48.1