From nobody Fri Dec 19 21:55:46 2025 Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.52]) (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 9739B328B71 for ; Fri, 7 Nov 2025 14:22:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762525322; cv=none; b=ibN3yU5zCn2CG5uGgzvYBd2NBqOgel27j09HjtTiRHVfcbnm2S6v+oPIQYcCQkMXz9kA59yX3qBWI0AyMcuwKNklThPJB0mJqFPY0KYzLIMooOawuM00ZdKUI5HH+3ks1EYLxvEVsPJE/RkdGyKqdY53xM96xu4S1EVpv0ofWzo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762525322; c=relaxed/simple; bh=w5deGl8WYR6YTvsLCjYxxzByC+EMu+/vV37yNkMgPrc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Y0LuxE19K2jeuu1lsmDEj6K/FXqU2wl54iwBfjgtYeCOEObNeh8KEFTyn0F4NnN/SSQd80FyPiVaMYLTsr73iGTZdaNF1uhAoCHmomnvFkrXlsfOXZ0Eh/BqqOWuy9DLXQ/KiQ/XGut5CjtWMyED//uqTtfjl2CnBOD31L/Vi5U= 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=MQGvsYob; arc=none smtp.client-ip=209.85.218.52 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="MQGvsYob" Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-b713c7096f9so117880466b.3 for ; Fri, 07 Nov 2025 06:22:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762525319; x=1763130119; 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=UsGuYQL0z7dUj/c8Asijzw9vVRg0vOPVA9pvPp5Cvak=; b=MQGvsYobF1Qfq4VNcrVJjK4fpntGJ/UHnsJ12xcPQYDZXH2vv5eTwPEbTFBJnR8rM5 W5P45SGCdrHx3z0E4XcXLta8tCMHEgxSmU71CVpitaUXGv/y9Bo1+bs/m4w2GFoQPXB5 crXI/GTe8mtCb9dyYy1sDcpzc0a+fIW7IJevUDkTIRX9ylHsN1ng5FKoV9NNRFXBha7X aUHFzGtL4rQo1FRlbSsbykRWW5q/CM0f86CRHt93Xn2fWWUq5yKZU/YUBwbcGvXiwPCr jXPGUHzQna8DzfCt1NF+qpdhSheWddB/OqMAaiMSvp1X1JrS89fI87iccFw682bFAOi5 VIPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762525319; x=1763130119; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=UsGuYQL0z7dUj/c8Asijzw9vVRg0vOPVA9pvPp5Cvak=; b=K2KxqVsKnmMovowdEvf6We9UHQ9DbahoWecHEabd7L5LtC+qasO6LINByF/dUs/AAS OfwKfRl1ySH2/gfuxrVMmNfsEYR1q7rPIqSy8uUe5ehCeJgAI6okVDr9a6bUF5cY8T/o QoF5Ludws3i4yq369B5EEEkAG0D3ElnttR7ZJSkyc86U5O5uLi0kstHrqlUWtBrrr0NX CnnsJPiuByIp+evcWMMGBEFO1aWBz9pvCeUQi4gTlaldAcc1A78v/etE/MqqRQOAWv+T d2fOrJU/oDdVUt/uf6w/0gIw34R61r7toUkh6Ra4tULCpItyUJ/0z6D6ifEXDfxlErO7 EF/A== X-Forwarded-Encrypted: i=1; AJvYcCUckxAWiMVE0kh278JtdsL0+Z3lONW5WPE8KtZ8VmEDCMG+q2o2lUO6C7qINenI8rhA3esYiXbPC34z3AI=@vger.kernel.org X-Gm-Message-State: AOJu0YzHn76Z4akEVV9p5hcFBhq2oGZLScynHU2+7QV0zYGdTVLYAb0E bVAJXliYFrIImkHgQeGUe6cDpI4sejHJBcXwn9Y/Aq7UnQFeTz6gNyn8 X-Gm-Gg: ASbGncs2KbiTgMfk3eaZAXyBfVb0mS96zteWC76nSU4Q2eZLHEMqVvU2nL/tZoS+237 CR1Ct8YwWoeW617YaYi/79TfST0jonqdpdT09b8zVVOpAxzv57o0aQppxhBlyJzBKkuCPQiLDPb n6AncqxMXq2781aEvxJgvGvZ4YPLBBsRu7j+DT8kq+Rbyl68uc4XF58iGItqiRbPlmbJsa5Lmdq R8TGGYhQ3vDBHX3F9y/F5lsATP2ktjIJ4otLaLf1VLvEabD3fHBI5PZ306CCB5w9P3XbYbRAzbJ 2ENO2f9VHMMT1DYaDbFvBd1+gaSrt0Q9bkf+hNnIXZTGU1ICrLJivsC4aqppKGyYYtwLm9KElgw oK3T+52ssXUopi+Qqwi0wmAVxW/O9PtZiGpLHAgIVSM632pDucQ6K+QrsS0pG35TN8VD4TBzhDS GWHY54hh0TYLtQHO+DcMZT02ySYq7ZCkZA6E2c/C2W3cqJBu4e X-Google-Smtp-Source: AGHT+IHXwwL5d1Y7URBkz1tG0Tm0jTDbkcT/kc1DkCsc+QLH3dXm1w472zQlkM45EEjA0X6bID47/Q== X-Received: by 2002:a17:907:3d16:b0:b6d:73f8:3168 with SMTP id a640c23a62f3a-b72c08dc7demr306432466b.3.1762525318659; Fri, 07 Nov 2025 06:21:58 -0800 (PST) Received: from f.. (cst-prg-14-82.cust.vodafone.cz. [46.135.14.82]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b72bf97e563sm253322766b.41.2025.11.07.06.21.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Nov 2025 06:21:58 -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, linux-ext4@vger.kernel.org, tytso@mit.edu, torvalds@linux-foundation.org, josef@toxicpanda.com, linux-btrfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v3 1/3] fs: speed up path lookup with cheaper handling of MAY_EXEC Date: Fri, 7 Nov 2025 15:21:47 +0100 Message-ID: <20251107142149.989998-2-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251107142149.989998-1-mjguzik@gmail.com> References: <20251107142149.989998-1-mjguzik@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" The generic inode_permission() routine does work which is known to be of no significance for lookup. There are checks for MAY_WRITE, while the requested permission is MAY_EXEC. Additionally devcgroup_inode_permission() is called to check for devices, but it is an invariant the inode is a directory. Absent a ->permission func, execution lands in generic_permission() which checks upfront if the requested permission is granted for everyone. We can elide the branches which are guaranteed to be false and cut straight to the check if everyone happens to be allowed MAY_EXEC on the inode (which holds true most of the time). Moreover, filesystems which provide their own ->permission routine can take advantage of the optimization by setting the IOP_FASTPERM_MAY_EXEC flag on their inodes, which they can legitimately do if their MAY_EXEC handling matches generic_permission(). As a simple benchmark, as part of compilation gcc issues access(2) on numerous long paths, for example /usr/lib/gcc/x86_64-linux-gnu/12/crtendS.o Issuing access(2) on it in a loop on ext4 on Sapphire Rapids (ops/s): before: 3797556 after: 3987789 (+5%) Note: this depends on the not-yet-landed ext4 patch to mark inodes with cache_no_acl() Signed-off-by: Mateusz Guzik Reviewed-by: Jan Kara --- fs/namei.c | 43 +++++++++++++++++++++++++++++++++++++++++-- include/linux/fs.h | 13 +++++++------ 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index a9f9d0453425..6b2a5a5478e7 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -540,6 +540,9 @@ static inline int do_inode_permission(struct mnt_idmap = *idmap, * @mask: Right to check for (%MAY_READ, %MAY_WRITE, %MAY_EXEC) * * Separate out file-system wide checks from inode-specific permission che= cks. + * + * Note: lookup_inode_permission_may_exec() does not call here. If you add + * MAY_EXEC checks, adjust it. */ static int sb_permission(struct super_block *sb, struct inode *inode, int = mask) { @@ -602,6 +605,42 @@ int inode_permission(struct mnt_idmap *idmap, } EXPORT_SYMBOL(inode_permission); =20 +/** + * lookup_inode_permission_may_exec - Check traversal right for given inode + * + * This is a special case routine for may_lookup() making assumptions spec= ific + * to path traversal. Use inode_permission() if you are doing something el= se. + * + * Work is shaved off compared to inode_permission() as follows: + * - we know for a fact there is no MAY_WRITE to worry about + * - it is an invariant the inode is a directory + * + * Since majority of real-world traversal happens on inodes which grant it= for + * everyone, we check it upfront and only resort to more expensive work if= it + * fails. + * + * Filesystems which have their own ->permission hook and consequently mis= s out + * on IOP_FASTPERM can still get the optimization if they set IOP_FASTPERM= _MAY_EXEC + * on their directory inodes. + */ +static __always_inline int lookup_inode_permission_may_exec(struct mnt_idm= ap *idmap, + struct inode *inode, int mask) +{ + /* Lookup already checked this to return -ENOTDIR */ + VFS_BUG_ON_INODE(!S_ISDIR(inode->i_mode), inode); + VFS_BUG_ON((mask & ~MAY_NOT_BLOCK) !=3D 0); + + mask |=3D MAY_EXEC; + + if (unlikely(!(inode->i_opflags & (IOP_FASTPERM | IOP_FASTPERM_MAY_EXEC))= )) + return inode_permission(idmap, inode, mask); + + if (unlikely(((inode->i_mode & 0111) !=3D 0111) || !no_acl_inode(inode))) + return inode_permission(idmap, inode, mask); + + return security_inode_permission(inode, mask); +} + /** * path_get - get a reference to a path * @path: path to get the reference to @@ -1855,7 +1894,7 @@ static inline int may_lookup(struct mnt_idmap *idmap, int err, mask; =20 mask =3D nd->flags & LOOKUP_RCU ? MAY_NOT_BLOCK : 0; - err =3D inode_permission(idmap, nd->inode, mask | MAY_EXEC); + err =3D lookup_inode_permission_may_exec(idmap, nd->inode, mask); if (likely(!err)) return 0; =20 @@ -1870,7 +1909,7 @@ static inline int may_lookup(struct mnt_idmap *idmap, if (err !=3D -ECHILD) // hard error return err; =20 - return inode_permission(idmap, nd->inode, MAY_EXEC); + return lookup_inode_permission_may_exec(idmap, nd->inode, 0); } =20 static int reserve_stack(struct nameidata *nd, struct path *link) diff --git a/include/linux/fs.h b/include/linux/fs.h index 03e450dd5211..7d5de647ac7b 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -647,13 +647,14 @@ is_uncached_acl(struct posix_acl *acl) return (long)acl & 1; } =20 -#define IOP_FASTPERM 0x0001 -#define IOP_LOOKUP 0x0002 -#define IOP_NOFOLLOW 0x0004 -#define IOP_XATTR 0x0008 +#define IOP_FASTPERM 0x0001 +#define IOP_LOOKUP 0x0002 +#define IOP_NOFOLLOW 0x0004 +#define IOP_XATTR 0x0008 #define IOP_DEFAULT_READLINK 0x0010 -#define IOP_MGTIME 0x0020 -#define IOP_CACHED_LINK 0x0040 +#define IOP_MGTIME 0x0020 +#define IOP_CACHED_LINK 0x0040 +#define IOP_FASTPERM_MAY_EXEC 0x0080 =20 /* * Inode state bits. Protected by inode->i_lock --=20 2.48.1 From nobody Fri Dec 19 21:55:46 2025 Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.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 8FC27329C7F for ; Fri, 7 Nov 2025 14:22:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762525326; cv=none; b=BP2O95ujTmKKWjK80WPG0aKZzPY/pd0NiuWemEYNb7jzLKldaUm5uuS8JPrj71BlsHVn+Hlqjwg/DfIOD4/cUaU7ksPW644sDZbZOrblK8L1Ytscc7qtOjWRVyZe9f//gtntgXHdjLLV9oBJipYSLopRkMxiizEVOgA3M+8tuu8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762525326; c=relaxed/simple; bh=128KSekg9ZnF2sASoMn8sOUDRGbIcWBCHawlZ+Q48b4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ag3LFT5O6qvuBErYP6O8DaMCojb0il/Pm3xxOSjnBofXbPjvldBt8Gf2NL949r33jh4ZnywRR+t5CMBcYevYKme01rjzfPaY8IMBBG1ZZF7RhOthrhTq0KdxS7/ITK/5h2VpKVZh7O08YndG/0FGbsTchS7S0/Mdu7hZxKJyMk0= 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=ETVmxdsL; arc=none smtp.client-ip=209.85.218.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="ETVmxdsL" Received: by mail-ej1-f45.google.com with SMTP id a640c23a62f3a-b727f330dd2so129641966b.2 for ; Fri, 07 Nov 2025 06:22:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762525322; x=1763130122; 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=wT6MSCAlH/pIZcAzO5vrkwY0EcFJEg7V7STMnWnK/pQ=; b=ETVmxdsL50D5FLUBG/X9tr4eyj0jP+bGDTcSp4R9wzOn3zi+uVAoox6ikqXiO80Td+ OVe/LnO45No33dcaVpNyy1rfTbEnYYO++sgWGnMx75rCSbBSgVX3q4857YpiQ6pwrX8k dkpZRo44UCYNbM+WXT9GrMTDL4mrdun/dzxHvNpKqOpqJuDAzGkrK2zpu36UWG0iVj0w xd9wkVAvTL/KqxPCgzV7l+WporwzZu8FTdaq5qC0T2BJuW49/1PXEH9gdpw4rFq7PO2b kRrIzLlCMm5/R3UpCTsL+HvZKb+UQZhUpgw7lzZdd/aYuXkHguc/Oee/eTeGSZv4NKEX 0JzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762525322; x=1763130122; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=wT6MSCAlH/pIZcAzO5vrkwY0EcFJEg7V7STMnWnK/pQ=; b=fUKRtC/iysTvSeizXydqdFnRr3jEZgox4kX/XvNs6nF6LzJwiAQCPK67uNdILTLavw fiNOaXeaey7ntYtTp86RYHMLDNNeDkEqDldIcPrFgPt/PWLlmqVtgxmO2y7wyqlpPgcM Qp4CyKhsNHtCx0tQNErDGYnnkU5vQJr49w23PODEYUCLPDM4Jt+aiQsGhHbGKhR6c1XH cPyRryAz8M73aI7AaEB05HEG5n3pAxhBpMPfD5SdLEiohEXyClbUkS/vs3YGMTFBerRB dJMW9xSO5bap8Jq3sScF+u/gqOnz1EibiscZk7E3UonIt/Ai+zCeeC7LCTxUUiDgLWcI urcQ== X-Forwarded-Encrypted: i=1; AJvYcCV37erylQIsTgZ+o0SpsmFz9jEH0/iITc81SaYeplSwch/rzc4b8TrLhCEoCs3VyVCmJ15LhrAYt+OO10g=@vger.kernel.org X-Gm-Message-State: AOJu0Yx5IFpu/AzWa6Dt8DBaTylIDVlWkmvGUnXX2HK5GgkUS7WtA7SA Js3/QtMaDRBfGeN8rw8DgKjzxBs8AJJmiiG9PipSKU4jQvOyA4wQfXz5 X-Gm-Gg: ASbGncuejb2reb+gS4e9cQwlpF6I/E+SJD225tpadeOFYPENU3CmWj9xuQYc5uILMRQ TaEkBV2CVmF7uaiYnzjvllkYnGe1AciFYv+sZ9fn2R1c9+5gfZHmHsW207lLJFFJkBDnRQBv0xA 7kbLvyxUPiLBEES1dwkVMyzAkdLt22LkebG/uMzXTcKDmJA+mYX52KcxlrwcwXe4RfLrGTusS21 gepbPYNjce0h410M7D2HrCy5pawwDcfWmJsZMoDjURNOEUIgpbED+ek1OYXuIZP26S3hdix64ke zcGOJvS3tpXcm1pVoF9FIO+U2L7MxgG0l8cqXR4wZQGkkWWZN0XXfXRyYFInyzHU9+qEnZAo3at icfsvuDxS3pJZa/w9CZZ72eMHYLRPIcis5kxfroXUKvcKb3Fxk0ubrjXYCAl5vXSLeVU9Scp8XO IAwwlgmE0DZRvALmedvs7AS+KKy8inO2b1JNn5p8QQHieqLzhd X-Google-Smtp-Source: AGHT+IGrbWD7yFMbT4C/yX4TspKvFS9f6XhDjvBKE1AYLhGSfZjTB0CFxn4t/7QjDw74UBz/8iB09w== X-Received: by 2002:a17:907:3f1f:b0:b70:8e7d:42a4 with SMTP id a640c23a62f3a-b72c0ae2029mr426905166b.36.1762525321480; Fri, 07 Nov 2025 06:22:01 -0800 (PST) Received: from f.. (cst-prg-14-82.cust.vodafone.cz. [46.135.14.82]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b72bf97e563sm253322766b.41.2025.11.07.06.21.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Nov 2025 06:22:01 -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, linux-ext4@vger.kernel.org, tytso@mit.edu, torvalds@linux-foundation.org, josef@toxicpanda.com, linux-btrfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v3 2/3] btrfs: utilize IOP_FASTPERM_MAY_EXEC Date: Fri, 7 Nov 2025 15:21:48 +0100 Message-ID: <20251107142149.989998-3-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251107142149.989998-1-mjguzik@gmail.com> References: <20251107142149.989998-1-mjguzik@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" Root filesystem was ext4, btrfs was mounted on /testfs. Then issuing access(2) in a loop on /testfs/repos/linux/include/linux/fs.h on Sapphire Rapids (ops/s): before: 3447976 after: 3620879 (+5%) Signed-off-by: Mateusz Guzik Acked-by: David Sterba --- fs/btrfs/inode.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 42da39c1e5b5..1a560f7298bf 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5852,6 +5852,8 @@ struct btrfs_inode *btrfs_iget(u64 ino, struct btrfs_= root *root) if (ret) return ERR_PTR(ret); =20 + if (S_ISDIR(inode->vfs_inode.i_mode)) + inode->vfs_inode.i_opflags |=3D IOP_FASTPERM_MAY_EXEC; unlock_new_inode(&inode->vfs_inode); return inode; } @@ -6803,8 +6805,11 @@ static int btrfs_create_common(struct inode *dir, st= ruct dentry *dentry, } =20 ret =3D btrfs_create_new_inode(trans, &new_inode_args); - if (!ret) + if (!ret) { + if (S_ISDIR(inode->i_mode)) + inode->i_opflags |=3D IOP_FASTPERM_MAY_EXEC; d_instantiate_new(dentry, inode); + } =20 btrfs_end_transaction(trans); btrfs_btree_balance_dirty(fs_info); @@ -9163,6 +9168,11 @@ int btrfs_prealloc_file_range_trans(struct inode *in= ode, min_size, actual_len, alloc_hint, trans); } =20 +/* + * NOTE: in case you are adding MAY_EXEC check for directories: + * we are marking them with IOP_FASTPERM_MAY_EXEC, allowing path lookup to + * elide calls here. + */ static int btrfs_permission(struct mnt_idmap *idmap, struct inode *inode, int mask) { --=20 2.48.1 From nobody Fri Dec 19 21:55:46 2025 Received: from mail-ej1-f46.google.com (mail-ej1-f46.google.com [209.85.218.46]) (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 9858032938E for ; Fri, 7 Nov 2025 14:22:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762525327; cv=none; b=AMkiQFyUq6oG4cp2McIa8rKuYiGGvPcgdLvATiZXE2i9zBOvPkJe0DTfLlkcZEqaxmI3cO7jYAFn2fbaMdDQEFf6zDoDaePrHinuKV9SCu5r3mkaZ8MrR3Tly9mPq06iZu+wWczV8ihI4C6OzZANCk1Sfk9Jwl5wGk3VzgiCQgA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762525327; c=relaxed/simple; bh=wS2imuQ9BmkOhIkqMvqqB5gl66Z+pbAiZyZ4vNX0hTE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IAgIg/7z8hzHhWmZBWAPtVyisiEs2x6BywDAF1X1LZU3sn1rzjtvc35ajkC5asK/gjURJ6/24TJzbeNXeSsBwiHeT7QFNqrwQeOzAjAzex6bZQy0UeeLuId9ikHBVCZH9DQhEiPQfcuutSHWid4W1aDxYmMgh/zc5pQm7HsONCQ= 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=To2POnNR; arc=none smtp.client-ip=209.85.218.46 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="To2POnNR" Received: by mail-ej1-f46.google.com with SMTP id a640c23a62f3a-b72cbc24637so129510466b.0 for ; Fri, 07 Nov 2025 06:22:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762525324; x=1763130124; 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=ALuLKFw+mr0eVU5vuPj8LnIxQt3AfWAYuS4LghXi6Bg=; b=To2POnNRLv1Z3RMuB327G2Bf9yjQ9YNRisL8V7Ov15aKZICI4Ofq0UP/LIsjXK3XcJ VM/LwdnxjyCrL9PnHBrxhsZCG+NPykzg0l0pv5mRfhqC4hWrY5m+Ozha1bnoZfy6+iYy l11vn2RvuaI5l0OjlNCmjYC2kJUYPQzX49GitXv5ByPDkv57UpscjjzZEbRaW9uWdpv+ mZdwjpZyiDA7wRjBTnWpbImi0ZQl+ClMQo8gZfEUJwOETqt2ZIYoZ3Atbr3xsPzg11Sj 6Sh9e9DRaAWTOuIlOxUa4w5h6K+nKUNG3PSqzYyCRRclZ8b3LfN9EDfyBN3NIdY6GF7j mAUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762525324; x=1763130124; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ALuLKFw+mr0eVU5vuPj8LnIxQt3AfWAYuS4LghXi6Bg=; b=sXOBj0RWt7TFCCjPsWynQkgE5/s24YZpD1vaWc2vDRSp8uz/BS7otQAME2uIiU7xro x8aBvqYNmadmbMLVd4OjG5QsOp0hwT64bzsX8a1SDpIaVfZsQ9OZvoCaGB3yvv3VSnYN 2knP5Dr+c4DxNqC7CRFN1fHVGRpO01WIUuSo9ohxVHUe0Ch0wjpnrWroFNc71dJhRT8w 0sY2OFrEIa9pJw/QYvsst7khLR/GF0eCWYl1h5HOzcnLG10v3dHoffKqymmo1sf8A1Ez oMX9xQqOHeRHBr3+q+3T8zILACWuCXDoc5bAcA8DBS0YdQkF/CmubZOV36IfE64BvV52 YGFQ== X-Forwarded-Encrypted: i=1; AJvYcCXUu84kbYT0P7UH4wTDqTGe1xN/R0ju+T8ToHL7I+5V5+EGtDIJDH97HAEkA9BqkROc9+j7Acs+n3qUtHQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwTTL2Um7mOSlvJzLUZzCd8PJeocwK6aTDMvXfv3f3sjP3pm7ce UCiaqGKk2WRk9HKOj9oBsCFvV0comwTnuOxRVAlWZK9FcZBdTpC4dgI5 X-Gm-Gg: ASbGncvDp5VouVeGhcjtWw27u+Vo91lLiGAjlXTvb4kUvKdjS6sLZnREdRv/4MNAjqT LR7KDbsYQnSKXs8ljd1iS/0dngFRW9MdYvhsROOOOd2el72ZuecQQUhlWDWPNxJcBjQo3btSPKr s4QQUJsSEPlgadYc+apDo1JJZROYzp80eKE5vigPBHPD7SLMbchK3KOape4fzTs0JsIJjIoHbEe W+iFRMOfm4eOfzJiU6jC237oCwY6SzK/aCy9vS0FNm7ib+wCFVJZkYNThNe+73iNy6JW5p/6cQ1 jnUXbIcv8Lne3rECx1ZXV+3X8ArTYAit4wsRS+SEjZrKiXWc5sq7VktoTZUtaVu7TL4E5tqCCNd oh82GCvib+TeEAQZCeLblevPWKh9PDFxXxZONG9wCDlghijIWP5wksKfA23wnEyj0zqU0oMnwkV 586lkl8CEvgKVfgbiuw9A4V01B6LyE5H2z/1mFPlbqMfICP+e6 X-Google-Smtp-Source: AGHT+IFYK2b9ojdXtTAd4PTW5XlFiit6Z3g1OoNfduNaJTNxwuPOLhjJOAV1QVecyGCifhAj28KZcw== X-Received: by 2002:a17:907:3fa5:b0:b3f:a960:e057 with SMTP id a640c23a62f3a-b72c090e626mr342966366b.31.1762525323963; Fri, 07 Nov 2025 06:22:03 -0800 (PST) Received: from f.. (cst-prg-14-82.cust.vodafone.cz. [46.135.14.82]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b72bf97e563sm253322766b.41.2025.11.07.06.22.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Nov 2025 06:22:03 -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, linux-ext4@vger.kernel.org, tytso@mit.edu, torvalds@linux-foundation.org, josef@toxicpanda.com, linux-btrfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v3 3/3] fs: retire now stale MAY_WRITE predicts in inode_permission() Date: Fri, 7 Nov 2025 15:21:49 +0100 Message-ID: <20251107142149.989998-4-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251107142149.989998-1-mjguzik@gmail.com> References: <20251107142149.989998-1-mjguzik@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" The primary non-MAY_WRITE consumer now uses lookup_inode_permission_may_exe= c(). Signed-off-by: Mateusz Guzik Reviewed-by: Jan Kara --- fs/namei.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 6b2a5a5478e7..2a112b2c0951 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -546,7 +546,7 @@ static inline int do_inode_permission(struct mnt_idmap = *idmap, */ static int sb_permission(struct super_block *sb, struct inode *inode, int = mask) { - if (unlikely(mask & MAY_WRITE)) { + if (mask & MAY_WRITE) { umode_t mode =3D inode->i_mode; =20 /* Nobody gets write access to a read-only fs. */ @@ -577,7 +577,7 @@ int inode_permission(struct mnt_idmap *idmap, if (unlikely(retval)) return retval; =20 - if (unlikely(mask & MAY_WRITE)) { + if (mask & MAY_WRITE) { /* * Nobody gets write access to an immutable file. */ --=20 2.48.1