From nobody Wed Dec 17 17:40:45 2025 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (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 CF1F13112B7 for ; Thu, 2 Oct 2025 12:55:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759409743; cv=none; b=MjPDqhdPs92679tPf5ZN2REvluhnfwJWAMvObYm/W52yJYyon0Wzm2G2IigkQvT9Mt0GQxVAXVOtdE25avHhsYELiQnla7VMhmJRzpMlQ++fxOziJKvwW7DMzO8Rv4xzXZIFtq9qrOtWVsmA4e9UL7QWSrq2s0RxxbffcCsQRQc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759409743; c=relaxed/simple; bh=wYXddcwvRcQeKAEy9A1oIWjRBhIg8md5Wu6+CeCI49E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dgNzK5lrKKRV22t/oHr9GwRoBUUJ18z/BmHx06p+wYClFh7CKAvbhhb7So9TxVRMV7+eCg9DKrUD0hKnwqEOupMRphduyH19hYeAStBoGbVYhIIvqGOKyXZ5SHWi3yesAtnvAqKD9MzhS9Qbku4t8Ud3uMe2ePucc/qu5GhVI6Q= 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=NGQMcLus; arc=none smtp.client-ip=209.85.210.176 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="NGQMcLus" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-7833765433cso1519068b3a.0 for ; Thu, 02 Oct 2025 05:55:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759409741; x=1760014541; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EJxtmpcoXc4yrgHs5WtTE6sBIdXe4Bd5IXbrrNjT5jw=; b=NGQMcLusDd/Trjo4v/ZCJyD5L6xV8SQsCX3YmeSXaTk8TgIbI0cDmxoda2ObY4av2o O0XocLzHvtPpRa2Ff5Go4t61EUDF+QbwQ1OL3/SrWJDq/eAd7wmO5IrJUALFkE2lWIq2 FLL8XSeLYKlKOqyKgMTCAeE4VSU1SdJXt+7ZbL1BeM6d76bF5fQ97dLd17gi3nYi826A bRseLqLBxScAOV6+JG5cD04DDnX+8e4k2iQYUO3qN8gXPFKYhLWk3Omi4gn9CFYnQjSZ nbr4zf7WZ3D/fK5P3KNn+J5MFtsnLIS4Jzdib6ZuQVgrehDyKPxNYhgZNHfwwJ7q/m60 2qRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759409741; x=1760014541; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EJxtmpcoXc4yrgHs5WtTE6sBIdXe4Bd5IXbrrNjT5jw=; b=b8rIqTwjXcSJjr/G3dQaBRYXwCgnY0uQenFN4lioZYE1/dmCQuo7DgPRo0+k/5STuS 42Tw05PGcx3DG/yvLIKIO7BkODRggfcY0nAy3N6F/+b04H0+KPAGC6ses2wWYoKlPIEJ Tm/yqbmQZXRz50eQbUvKK8z1zdj4NU2NnvlADlC1zH/rQD1ASJ59mr0z0uJAF/cHeka2 tCumi9GuVph6zuifvDGe6qyqaE3QcCgb+kbv86ciWQsjZ4VM5+05PY7TAKsEsfLMAtjG OtwGhP0KN26wFVJC9mPHsDno84hbTXbmT/0909GYRlNJpDPaGJ3TDaSizHQNwc5pAJwZ dwkw== X-Forwarded-Encrypted: i=1; AJvYcCVkIP3c6Z5pKYdwlYIK5wipwhispm1A476Rs9e4vuL9/7eO/9ETtmcNxPjE9zsNrZUBrZwztoonYE6HMdc=@vger.kernel.org X-Gm-Message-State: AOJu0YyKzAtYixhlCcoG6OiBdmfypeEQMcire/NugdY2Oq5EzsJdnKwm ixYZTxXRp1GGTgba9rNyPJhUFPMzxriau0+kuYrdOkVncuoH+b7a0Lf/ X-Gm-Gg: ASbGncusJftAPNZwAOXCyB2KnAp1Ft0cuWzGYnemYAsDtyYelJMtfIU42w9QGbKNImY PtqVC2srxEPNhtkCekij8NaOzTJ/B8jfo7fdqYrVLHQ3Xq+JP8hweLh9fLJWgqwVn13iOw+zUyk AqBcgYXhsGn0GWEELmoOpW9XE3UFVN+axM41+fMuqVWjAbRSIvl+eSTAQHpNP6AGns4zBEwKPM1 rT+Yv+YuCnBr8bbFZPT+K/lN1N3kbUvbYwJ6pzqKioRa1LSfoXLCobgGiK8gKiljO4CBjXGV8z2 kSRy3+Ati4726YfZFRAaOgNkRL4wzxRJK6k0pZysYZzf0DOlp/dC0z6k0FALT1y4HbS73HAPf/c C0WivgI9rHk6Nuzvd+cI1aV5KTg4KQ4cqNbq0+OE7C4CeY7s= X-Google-Smtp-Source: AGHT+IHFaqJGan1kbBL1yPFJipQm5sq8pkjRSeMRc0bigutWIseqQVBU2KqOXs5f++yqM/U9uhcYVQ== X-Received: by 2002:a05:6a00:1884:b0:776:20c2:d58b with SMTP id d2e1a72fcca58-78af4209966mr9210619b3a.24.1759409740920; Thu, 02 Oct 2025 05:55:40 -0700 (PDT) Received: from fedora ([2405:201:3017:a80:9e5c:2c74:b73f:890a]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-78b01f9a2b9sm2165556b3a.19.2025.10.02.05.55.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Oct 2025 05:55:40 -0700 (PDT) From: Bhavik Sachdev To: Alexander Viro , Christian Brauner Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Aleksa Sarai , Bhavik Sachdev , Pavel Tikhomirov , Jan Kara , John Garry , Arnaldo Carvalho de Melo , "Darrick J . Wong" , Namhyung Kim , Ingo Molnar , Andrei Vagin , Alexander Mikhalitsyn Subject: [PATCH 2/4] fs/namespace: add umounted mounts to umount_mnt_ns Date: Thu, 2 Oct 2025 18:18:38 +0530 Message-ID: <20251002125422.203598-3-b.sachdev1904@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251002125422.203598-1-b.sachdev1904@gmail.com> References: <20251002125422.203598-1-b.sachdev1904@gmail.com> 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" From: Pavel Tikhomirov This patch add "unmounted" mounts to umount_mnt_ns instead of mount namespace being NULL for such mounts. This will allow us to later use statmount to get mount info about these mounts. We also introduce proper checks so that "unmounted" mounts are still detected correctly. We delete mounts from umount_mnt_ns when no references to them exist. Signed-off-by: Pavel Tikhomirov --- fs/d_path.c | 2 +- fs/mount.h | 10 +++++++++- fs/namespace.c | 23 ++++++++++++++++++++--- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/fs/d_path.c b/fs/d_path.c index bb365511066b..c6a4118899e1 100644 --- a/fs/d_path.c +++ b/fs/d_path.c @@ -119,7 +119,7 @@ static int __prepend_path(const struct dentry *dentry, = const struct mount *mnt, /* Global root */ mnt_ns =3D READ_ONCE(mnt->mnt_ns); /* open-coded is_mounted() to use local mnt_ns */ - if (!IS_ERR_OR_NULL(mnt_ns) && !is_anon_ns(mnt_ns)) + if (!IS_ERR_OR_NULL(mnt_ns) && !is_anon_ns(mnt_ns) && !is_umount_ns(mnt= _ns)) return 1; // absolute root else return 2; // detached or not attached yet diff --git a/fs/mount.h b/fs/mount.h index 97737051a8b9..03f8165939b4 100644 --- a/fs/mount.h +++ b/fs/mount.h @@ -122,10 +122,18 @@ static inline int mnt_has_parent(const struct mount *= mnt) return mnt !=3D mnt->mnt_parent; } =20 +extern struct mnt_namespace *umount_mnt_ns; + +static inline bool is_umount_ns(struct mnt_namespace *ns) +{ + return ns =3D=3D umount_mnt_ns; +} + static inline int is_mounted(struct vfsmount *mnt) { + struct mnt_namespace *ns =3D READ_ONCE(real_mount(mnt)->mnt_ns); /* neither detached nor internal? */ - return !IS_ERR_OR_NULL(real_mount(mnt)->mnt_ns); + return !IS_ERR_OR_NULL(ns) && !is_umount_ns(ns); } =20 extern struct mount *__lookup_mnt(struct vfsmount *, struct dentry *); diff --git a/fs/namespace.c b/fs/namespace.c index 70fe01d810df..0b4be12c02de 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -1016,7 +1016,7 @@ static inline bool check_anonymous_mnt(struct mount *= mnt) { u64 seq; =20 - if (!is_anon_ns(mnt->mnt_ns)) + if (!is_anon_ns(mnt->mnt_ns) || is_umount_ns(mnt->mnt_ns)) return false; =20 seq =3D mnt->mnt_ns->seq_origin; @@ -1400,9 +1400,11 @@ static void mntput_no_expire(struct mount *mnt) { LIST_HEAD(list); int count; + struct mnt_namespace *ns; =20 rcu_read_lock(); - if (likely(READ_ONCE(mnt->mnt_ns))) { + ns =3D READ_ONCE(mnt->mnt_ns); + if (likely(ns && !is_umount_ns(ns))) { /* * Since we don't do lock_mount_hash() here, * ->mnt_ns can change under us. However, if it's @@ -1438,6 +1440,18 @@ static void mntput_no_expire(struct mount *mnt) mnt->mnt.mnt_flags |=3D MNT_DOOMED; rcu_read_unlock(); =20 + if (mnt_ns_attached(mnt)) { + struct mnt_namespace *ns; + + move_from_ns(mnt); + ns =3D mnt->mnt_ns; + if (ns) { + ns->nr_mounts--; + __touch_mnt_namespace(ns); + } + mnt->mnt_ns =3D NULL; + } + list_del(&mnt->mnt_instance); if (unlikely(!list_empty(&mnt->mnt_expire))) list_del(&mnt->mnt_expire); @@ -1885,6 +1899,9 @@ static void umount_tree(struct mount *mnt, enum umoun= t_tree_flags how) * namespace, etc. */ mnt_notify_add(p); + + mnt_add_to_ns(umount_mnt_ns, p); + umount_mnt_ns->nr_mounts++; } } =20 @@ -4804,7 +4821,7 @@ static int can_idmap_mount(const struct mount_kattr *= kattr, struct mount *mnt) return -EPERM; =20 /* Mount has already been visible in the filesystem hierarchy. */ - if (!is_anon_ns(mnt->mnt_ns)) + if (!is_anon_ns(mnt->mnt_ns) || is_umount_ns(mnt->mnt_ns)) return -EINVAL; =20 return 0; --=20 2.51.0