From nobody Thu Apr 9 13:31:45 2026 Received: from e3i670.smtp2go.com (e3i670.smtp2go.com [158.120.86.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5FB423815F3 for ; Fri, 27 Feb 2026 08:16:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=158.120.86.158 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772180169; cv=none; b=eR6XG1Tf55lVE6B5rQBr1NoMhwkV7zcqJ8XgqQrGynCv6dQqxcL83hWzojQkBrbguhmTAbTuLVZje70vYVsXfxVDEZQXOTWfoIn9BxQ1IaKV+7ziAAR9XBktu4VGEGddou+993ySjcAx8fAZD1XMma+BksRaFdxd+1POyCNweNU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772180169; c=relaxed/simple; bh=vKp8DyJrHHJRXEBHOkpTrRuYv6aTj9ijM38Jy/cJo84=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aFhOna4KuWVlIT2YLd5LOShFam/um2xaBve5gK2smGL8sZksNGU+IZqSGVPjROYM2zYIoNmnX5N457xiOCWiKeqdUmOOUcD8hCoWKBmASkuXz76puOypd1O7s39OltNV82nkTLrEcjbNbVbEDc4ueRORz97Z8uQZuRe4DAUHKCY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=triplefau.lt; spf=pass smtp.mailfrom=em510616.triplefau.lt; dkim=pass (2048-bit key) header.d=triplefau.lt header.i=@triplefau.lt header.b=OIjPPT0h; arc=none smtp.client-ip=158.120.86.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=triplefau.lt Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=em510616.triplefau.lt Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=triplefau.lt header.i=@triplefau.lt header.b="OIjPPT0h" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=triplefau.lt; i=@triplefau.lt; q=dns/txt; s=s510616; t=1772180159; h=from : subject : to : message-id : date; bh=Jwh53lsG+eoctpp0EtTJ1ZXN/F98xvDBeJr90Gtu2ZY=; b=OIjPPT0h+7+KVcpjbmCCE0UYDbpkqoTJmfFCWT6kPMTsXBirz4iUumZ36hyd/eGY7r6sY kWdivSqEquIi+e61Tf+k6pGxTLo7fDZclNL9OYl81KuITH2EMaIDDkaHvEzfEK7L6Yxri81 EROvrUNQKVcT2i/FCRlkhyRYwnoxLJdcCwQNB+YP2/zhtUY46YBT8ZUsxMNfUMCVR0qtkQq k2S/kfjKSeAs4lAhWLNCj8bz6QKp1rTJPhUo7F86wcp9GEOu9Oyx6Rbh1kvBOY7bZr1Ml2W mpx4t57zLaTtYRkkhD13ybpKdfIa/tUTRm1SoM2CG/IXrT1giHInZif6Y8Fw== Received: from [10.12.239.196] (helo=localhost) by smtpcorp.com with esmtpsa (TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.99.1-S2G) (envelope-from ) id 1vvt0v-4o5NDgrhS5C-nmn4; Fri, 27 Feb 2026 08:15:57 +0000 From: Remi Pommarel To: v9fs@lists.linux.dev Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Remi Pommarel Subject: [PATCH v3 2/4] 9p: Add mount option for negative dentry cache retention Date: Fri, 27 Feb 2026 08:56:53 +0100 Message-ID: <7c2a5ba3e229b4e820f0fcd565ca38ab3ca5493f.1772178819.git.repk@triplefau.lt> X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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 X-Report-Abuse: Please forward a copy of this message, including all headers, to Feedback-ID: 510616m:510616apGKSTK:510616sm_Iw7YcyN X-smtpcorp-track: NZ3w4q2laZSk.wmWbslxymoGG.J-jQQQ7Xhkd Content-Type: text/plain; charset="utf-8" Introduce a new mount option, ndentrycache, for v9fs that allows users to specify how long negative dentries are retained in the cache. The retention time can be set in milliseconds (e.g. ndentrycache=3D10000 for a 10secs retention time), or negative entries can be kept until the buffer cache management removes them by using the option without a value (i.e. ndentrycache). For consistency reasons, this option should only be used in exclusive or read-only mount scenarios, aligning with the cache=3Dloose usage. Signed-off-by: Remi Pommarel --- fs/9p/v9fs.c | 73 ++++++++++++++++++++++++++++++++-------------------- fs/9p/v9fs.h | 23 ++++++++++------- 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index c5dca81a553e..a26bd9070786 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c @@ -39,11 +39,12 @@ enum { * source if we rejected it as EINVAL */ Opt_source, /* Options that take integer arguments */ - Opt_debug, Opt_dfltuid, Opt_dfltgid, Opt_afid, + Opt_debug, Opt_dfltuid, Opt_dfltgid, Opt_afid, Opt_ndentrycachetmo, /* String options */ Opt_uname, Opt_remotename, Opt_cache, Opt_cachetag, /* Options that take no arguments */ Opt_nodevmap, Opt_noxattr, Opt_directio, Opt_ignoreqv, + Opt_ndentrycache, /* Access options */ Opt_access, Opt_posixacl, /* Lock timeout option */ @@ -77,41 +78,43 @@ static const struct constant_table p9_versions[] =3D { * the client, and all the transports. */ const struct fs_parameter_spec v9fs_param_spec[] =3D { - fsparam_string ("source", Opt_source), - fsparam_u32hex ("debug", Opt_debug), - fsparam_uid ("dfltuid", Opt_dfltuid), - fsparam_gid ("dfltgid", Opt_dfltgid), - fsparam_u32 ("afid", Opt_afid), - fsparam_string ("uname", Opt_uname), - fsparam_string ("aname", Opt_remotename), - fsparam_flag ("nodevmap", Opt_nodevmap), - fsparam_flag ("noxattr", Opt_noxattr), - fsparam_flag ("directio", Opt_directio), - fsparam_flag ("ignoreqv", Opt_ignoreqv), - fsparam_string ("cache", Opt_cache), - fsparam_string ("cachetag", Opt_cachetag), - fsparam_string ("access", Opt_access), - fsparam_flag ("posixacl", Opt_posixacl), - fsparam_u32 ("locktimeout", Opt_locktimeout), + fsparam_string ("source", Opt_source), + fsparam_u32hex ("debug", Opt_debug), + fsparam_uid ("dfltuid", Opt_dfltuid), + fsparam_gid ("dfltgid", Opt_dfltgid), + fsparam_u32 ("afid", Opt_afid), + fsparam_string ("uname", Opt_uname), + fsparam_string ("aname", Opt_remotename), + fsparam_flag ("nodevmap", Opt_nodevmap), + fsparam_flag ("noxattr", Opt_noxattr), + fsparam_flag ("directio", Opt_directio), + fsparam_flag ("ignoreqv", Opt_ignoreqv), + fsparam_string ("cache", Opt_cache), + fsparam_string ("cachetag", Opt_cachetag), + fsparam_string ("access", Opt_access), + fsparam_flag ("posixacl", Opt_posixacl), + fsparam_u32 ("locktimeout", Opt_locktimeout), + fsparam_flag ("ndentrycache", Opt_ndentrycache), + fsparam_u32 ("ndentrycache", Opt_ndentrycachetmo), =20 /* client options */ - fsparam_u32 ("msize", Opt_msize), - fsparam_flag ("noextend", Opt_legacy), - fsparam_string ("trans", Opt_trans), - fsparam_enum ("version", Opt_version, p9_versions), + fsparam_u32 ("msize", Opt_msize), + fsparam_flag ("noextend", Opt_legacy), + fsparam_string ("trans", Opt_trans), + fsparam_enum ("version", Opt_version, p9_versions), =20 /* fd transport options */ - fsparam_u32 ("rfdno", Opt_rfdno), - fsparam_u32 ("wfdno", Opt_wfdno), + fsparam_u32 ("rfdno", Opt_rfdno), + fsparam_u32 ("wfdno", Opt_wfdno), =20 /* rdma transport options */ - fsparam_u32 ("sq", Opt_sq_depth), - fsparam_u32 ("rq", Opt_rq_depth), - fsparam_u32 ("timeout", Opt_timeout), + fsparam_u32 ("sq", Opt_sq_depth), + fsparam_u32 ("rq", Opt_rq_depth), + fsparam_u32 ("timeout", Opt_timeout), =20 /* fd and rdma transprt options */ - fsparam_u32 ("port", Opt_port), - fsparam_flag ("privport", Opt_privport), + fsparam_u32 ("port", Opt_port), + fsparam_flag ("privport", Opt_privport), {} }; =20 @@ -159,6 +162,10 @@ int v9fs_show_options(struct seq_file *m, struct dentr= y *root) from_kgid_munged(&init_user_ns, v9ses->dfltgid)); if (v9ses->afid !=3D ~0) seq_printf(m, ",afid=3D%u", v9ses->afid); + if (v9ses->ndentry_timeout_ms =3D=3D NDENTRY_TMOUT_NEVER) + seq_printf(m, ",ndentrycache"); + else if (v9ses->flags & V9FS_NDENTRY_TMOUT_SET) + seq_printf(m, ",ndentrycache=3D%u", v9ses->ndentry_timeout_ms); if (strcmp(v9ses->uname, V9FS_DEFUSER) !=3D 0) seq_printf(m, ",uname=3D%s", v9ses->uname); if (strcmp(v9ses->aname, V9FS_DEFANAME) !=3D 0) @@ -337,6 +344,16 @@ int v9fs_parse_param(struct fs_context *fc, struct fs_= parameter *param) session_opts->session_lock_timeout =3D (long)result.uint_32 * HZ; break; =20 + case Opt_ndentrycache: + session_opts->flags |=3D V9FS_NDENTRY_TMOUT_SET; + session_opts->ndentry_timeout_ms =3D NDENTRY_TMOUT_NEVER; + break; + + case Opt_ndentrycachetmo: + session_opts->flags |=3D V9FS_NDENTRY_TMOUT_SET; + session_opts->ndentry_timeout_ms =3D result.uint_64; + break; + /* Options for client */ case Opt_msize: if (result.uint_32 < 4096) { diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h index 8410f7883109..2e42729c6c20 100644 --- a/fs/9p/v9fs.h +++ b/fs/9p/v9fs.h @@ -24,6 +24,8 @@ * @V9FS_ACCESS_ANY: use a single attach for all users * @V9FS_ACCESS_MASK: bit mask of different ACCESS options * @V9FS_POSIX_ACL: POSIX ACLs are enforced + * @V9FS_NDENTRY_TMOUT_SET: Has negative dentry timeout retention time been + * overriden by ndentrycache mount option * * Session flags reflect options selected by users at mount time */ @@ -34,16 +36,17 @@ #define V9FS_ACL_MASK V9FS_POSIX_ACL =20 enum p9_session_flags { - V9FS_PROTO_2000U =3D 0x01, - V9FS_PROTO_2000L =3D 0x02, - V9FS_ACCESS_SINGLE =3D 0x04, - V9FS_ACCESS_USER =3D 0x08, - V9FS_ACCESS_CLIENT =3D 0x10, - V9FS_POSIX_ACL =3D 0x20, - V9FS_NO_XATTR =3D 0x40, - V9FS_IGNORE_QV =3D 0x80, /* ignore qid.version for cache hints */ - V9FS_DIRECT_IO =3D 0x100, - V9FS_SYNC =3D 0x200 + V9FS_PROTO_2000U =3D 0x01, + V9FS_PROTO_2000L =3D 0x02, + V9FS_ACCESS_SINGLE =3D 0x04, + V9FS_ACCESS_USER =3D 0x08, + V9FS_ACCESS_CLIENT =3D 0x10, + V9FS_POSIX_ACL =3D 0x20, + V9FS_NO_XATTR =3D 0x40, + V9FS_IGNORE_QV =3D 0x80, /* ignore qid.version for cache hints */ + V9FS_DIRECT_IO =3D 0x100, + V9FS_SYNC =3D 0x200, + V9FS_NDENTRY_TMOUT_SET =3D 0x400, }; =20 /** --=20 2.52.0