From patchwork Wed Sep 18 14:01:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miao Wang via B4 Relay X-Patchwork-Id: 13806913 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 63CEB18C011; Wed, 18 Sep 2024 14:01:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726668109; cv=none; b=K7liBriTQxcAwGaQOKhN29V2olzsHSEd5atRqfX1lhdarkxdNPUQCnUS61JNnwU/kAc64Y7fXLIkwt4ZqTmOKpv9vyg+wGy6ddtaRxeJjVJnIpPBlEqTiLuelGNDsjRCrcoUwqp2lkXsn7i4XPBYxtzEEXgBLUSvuE17ulBmj/w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726668109; c=relaxed/simple; bh=XwWrkxXFbCDO4HGZO7lMIgPUXvVKDVNC/m/Lbc48u1Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JSdkad1kvfjaMJeu5NeYkjDYn7b+zR372gHh/G6B0DPsFxnuW0x3QBiUDeyoKWZvUcAgm/k5JeiQ9ClZLPp/12Z80VebsU2LXWLGgMFuX2Kf5UuLAVixGNhQsqm8xs3+WAyQZUDm5X6Qjr5ajhJKuHWYmycksHf/o/OHwsACj44= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BU/JALzQ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BU/JALzQ" Received: by smtp.kernel.org (Postfix) with ESMTPS id 35E02C4CEC6; Wed, 18 Sep 2024 14:01:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726668109; bh=XwWrkxXFbCDO4HGZO7lMIgPUXvVKDVNC/m/Lbc48u1Y=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=BU/JALzQhTmhu9djpPZ+TTZrr1U2PRhRrmdOq8iSXNtdEvzXLuCIp/goZUWZlfprZ s+aKekVZ6tx9ZSaeX0CEB+2KXj632spgbbQhKcyEVL7SxqcCczXZNzzqou6lSeLOlk Hfz3dNXPgyLD65QOV+t0b/7pe66xrrxVVjITwU0lN3UgbdIdmz6HSs9EMUWqGo03gW zP/VF+64dMtZ+zWZD8lsqfqRaPJKAH8wcAeyNpjuX8ukZIMXRh2AYmScLIjEn/abdb M3N1+lWssznR1Uug8rLuiRZzlaMxOOWBrzL9GhHczDiGx1AsN/q38Zu18dQ6GNMg7h CNSkvpKAwtVNA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1E246CCD1A0; Wed, 18 Sep 2024 14:01:49 +0000 (UTC) From: Miao Wang via B4 Relay Date: Wed, 18 Sep 2024 22:01:19 +0800 Subject: [PATCH v6.10 1/3] fs: new helper vfs_empty_path() Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240918-statx-stable-linux-6-10-y-v1-1-8364a071074f@gmail.com> References: <20240918-statx-stable-linux-6-10-y-v1-0-8364a071074f@gmail.com> In-Reply-To: <20240918-statx-stable-linux-6-10-y-v1-0-8364a071074f@gmail.com> To: Greg Kroah-Hartman , stable@vger.kernel.org Cc: Xi Ruoyao , Mateusz Guzik , Christian Brauner , Alexander Viro , Jan Kara , Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , linux-fsdevel@vger.kernel.org, stable@vger.kernel.org, Miao Wang X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=1160; i=shankerwangmiao@gmail.com; h=from:subject:message-id; bh=UKi5cKkDYLorcoPNPh8VgxFKz/KyskePZcWRS3ghFg0=; b=owEBbQKS/ZANAwAKAbAx48p7/tluAcsmYgBm6t1KULu5wqjoaobS1DoIbfuhiZbMceaA06Py/ Gx0USf7Sq+JAjMEAAEKAB0WIQREqPWPgPJBxluezBOwMePKe/7ZbgUCZurdSgAKCRCwMePKe/7Z bgqID/9QaVYMKyEgINsB/9tIo+flZS42k3P9doDhzVYtrYYawV4PpZ7UI9+sS/5dmpNhyQ12t7n bKtMoG1veL9VVHM4gq+A4RVkHQPE9yFzFcvzH6o/f3HamoCDC27t+eEnwpupVr5EKKJucIVYwtl /baekLgBr81JQL/njKkiui/ruEYJcNTUD5EAce0blpxM6q3UBeZWFxntsV49ZmnHskUPrYt/lQp CVeL+KggrPNvn74Z7H3gtZcjKDti22FyQDSVLUo3KR4AkxSfV1MBue57X0MMm1zt1O5lKEJdCXg sGNbN8siqUpzYiIg8ImBeojk3tM7b17B0bR5WZ1BXsZA3SO6CpGeDRkg5KlxcK2NW1iZYcMMMBd KFOcGLp4KEnXuEZxl0cDxBdTd/LgqIe74nWnTkU2mfXd/5M/DLU0xhpX99QbiMk02HHJKfDAIOw 3Iz9vgd+wLiKpSWJvNQMhlSYQlYEudtSQU4AkVaqjGPD+xvkFhDKM7sf/iPsPrJmXVcb8uoYSXV f9Axm37U8iDiI2sSOI4OHaPUtrBK3EnGLviN9ulrEu/i7ruyFnHr7E+yACyyVCVeokdfn5Duy5H rPYAC8wt4rPRqzvUyLR0BnzZdJcb3H6rhgtLrbHS+PithR8rlxsE3p9gUMg7XdS8hDbs6p6RGJ1 ZmEWz//KPTxMvrg== X-Developer-Key: i=shankerwangmiao@gmail.com; a=openpgp; fpr=6FAEFF06B7D212A774C60BFDFA0D166D6632EF4A X-Endpoint-Received: by B4 Relay for shankerwangmiao@gmail.com/default with auth_id=189 X-Original-From: Miao Wang Reply-To: shankerwangmiao@gmail.com From: Christian Brauner commit 1bc6d44 upstream. Make it possible to quickly check whether AT_EMPTY_PATH is valid. Note, after some discussion we decided to also allow NULL to be passed instead of requiring the empty string. Signed-off-by: Christian Brauner Cc: # 6.10.x Signed-off-by: Miao Wang Tested-by: Xi Ruoyao --- include/linux/fs.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/include/linux/fs.h b/include/linux/fs.h index 5f07c1c377df..0e334aad85c5 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3619,4 +3619,21 @@ extern int vfs_fadvise(struct file *file, loff_t offset, loff_t len, extern int generic_fadvise(struct file *file, loff_t offset, loff_t len, int advice); +static inline bool vfs_empty_path(int dfd, const char __user *path) +{ + char c; + + if (dfd < 0) + return false; + + /* We now allow NULL to be used for empty path. */ + if (!path) + return true; + + if (unlikely(get_user(c, path))) + return false; + + return !c; +} + #endif /* _LINUX_FS_H */ From patchwork Wed Sep 18 14:01:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miao Wang via B4 Relay X-Patchwork-Id: 13806914 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 724D518C01B; Wed, 18 Sep 2024 14:01:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726668109; cv=none; b=rncC4Q3kg8tMG7UATH2+YRIyfhtAsobPatPNLCxmoHHA1EE/BeDiEEIZz0TRf1l72JhlooMkVLwKl7l9N8Hw/+DblLE8LVRroNn5ExZMKMI3d4D8/6c9/mP8uBYRAuUqGBjB5JvSMgk09AJHCoMh1us6ikcOFChtbnoshRNjs8k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726668109; c=relaxed/simple; bh=jYUgZE0B+hry+WMznovQEaTk5Msn5iTgnUNz7MAXlcI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IMLEzD3k3Yqw+WIwTZraxypoYiM6vfE02p7dA0Vq9XSZ41jo5BX3n3suYJJt05Y2AgR1xllurDQ65VBXdnwFiE3MiJq1bVuQnZj05jYX4HYzhnrYVcWVjsS5r0CrCBpyyMa66q3Cg2ABaXyilvaRZIbzVFDBqaEorpOqbNJ6hBM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=q4hc1EkZ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="q4hc1EkZ" Received: by smtp.kernel.org (Postfix) with ESMTPS id 454BFC4CEC3; Wed, 18 Sep 2024 14:01:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726668109; bh=jYUgZE0B+hry+WMznovQEaTk5Msn5iTgnUNz7MAXlcI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=q4hc1EkZ3+3HLkrplyQabfNim6Jxi6DkuO/8aypbu/0SlAbX4tZXufiJ9DnjrRoke +hINZc8dHVQg0SvqsX0MmqrzRyx7V5H+uBL4t21khfJSwOHml6cNH3P64IHAYrpnqD w0XFz41U7K8vBGnjW6anQpxPmS0Of4WQhUQwoXDZ15DrMmSx8qVjT8zFzE0U/MdWiB x+NrP6iq7F3v6zRPvSNdWKLTKeL2OxYJ/N+KQAdZd8Rrxylnl5EYW80IxuCSxbdfnm paLfrLST7y6fGmP1be9XwVpkBIK55tzDOXOjsGEzd7V+gzQfdRtgOozMn4WNo1Oc9F X8MYDkQCnBNPQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2C62ACCD1A6; Wed, 18 Sep 2024 14:01:49 +0000 (UTC) From: Miao Wang via B4 Relay Date: Wed, 18 Sep 2024 22:01:20 +0800 Subject: [PATCH v6.10 2/3] stat: use vfs_empty_path() helper Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240918-statx-stable-linux-6-10-y-v1-2-8364a071074f@gmail.com> References: <20240918-statx-stable-linux-6-10-y-v1-0-8364a071074f@gmail.com> In-Reply-To: <20240918-statx-stable-linux-6-10-y-v1-0-8364a071074f@gmail.com> To: Greg Kroah-Hartman , stable@vger.kernel.org Cc: Xi Ruoyao , Mateusz Guzik , Christian Brauner , Alexander Viro , Jan Kara , Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , linux-fsdevel@vger.kernel.org, stable@vger.kernel.org, Miao Wang X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=1135; i=shankerwangmiao@gmail.com; h=from:subject:message-id; bh=hecPtMltr78jhtb4nj3TeVbjNkGHnWb3+2dvs/Q+DnI=; b=owEBbQKS/ZANAwAKAbAx48p7/tluAcsmYgBm6t1KDydVEMBXgf20UHmTeiEkJTjTofPNsYYY6 xA6ga5UO8aJAjMEAAEKAB0WIQREqPWPgPJBxluezBOwMePKe/7ZbgUCZurdSgAKCRCwMePKe/7Z bu7YD/9f8RWBQdTZyiyN8jJyNErSuesootBkz6PgMK1350VVrO/eq0FQKY9cWQHFXmptBjbU+30 wd9Mao5/rf19dWxnvQQkKG1UAnVZ9GWqmBmLb/PSnd8EZr3zzWNGtg9vo+pyKKBKvk008mIect9 uM6c9oYbuGlvmOUcS90i7qRJyUL+81uoEihvq0sFonNSvNy7fHzxSfNl9GAzgPHGeBzIKyD6VM4 WAj20j1OiP37XdqAxP7zWPyM8grfdCN4mYAX24IfTkuiJ5JwdXD7bqf+dGXmY2E0dAKdhcvBTrp v25ROemy1L5A2KXMo3WDQV+29z6lT/MtgxT4KtSzJOUlNgbReg5+cHieq2ekmToBZphFTLhxuwE 6bgQmg2OVeLRlGg0T/eJQ0DJvqtk3LuChPHrBBA7bgOzcKCO0hJ4GCE8NJfxt5QBFW+j3vKN1Cf 9BkNWsrGn734862o2f3vEXZKgYEM9SreP0mqKp6fcuzejNCJ5YtbAPc7Yy06fWgxqBnzcgs6SfJ kxE9v2+zU+ObnmMjjzzRAVmlF2+GUjeSbUGdqOJhc0kPk6IV9VkrapodaYxFmp2Qg6TTy3HXCO2 K6NAsR2D3wDoVd9w8dBepfsQ4X61noaqxKw3846s6iL4OyRkX4AwY0pYloKdAuZ5vZOxjL5Wj6D n7t4Czt2gyKJyzg== X-Developer-Key: i=shankerwangmiao@gmail.com; a=openpgp; fpr=6FAEFF06B7D212A774C60BFDFA0D166D6632EF4A X-Endpoint-Received: by B4 Relay for shankerwangmiao@gmail.com/default with auth_id=189 X-Original-From: Miao Wang Reply-To: shankerwangmiao@gmail.com From: Christian Brauner commit 27a2d0c upstream. Use the newly added helper for this. Signed-off-by: Christian Brauner Cc: # 6.10.x Signed-off-by: Miao Wang Tested-by: Xi Ruoyao --- fs/stat.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/fs/stat.c b/fs/stat.c index 70bd3e888cfa..0e8558f9c0b3 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -289,16 +289,8 @@ int vfs_fstatat(int dfd, const char __user *filename, * If AT_EMPTY_PATH is set, we expect the common case to be that * empty path, and avoid doing all the extra pathname work. */ - if (dfd >= 0 && flags == AT_EMPTY_PATH) { - char c; - - ret = get_user(c, filename); - if (unlikely(ret)) - return ret; - - if (likely(!c)) - return vfs_fstat(dfd, stat); - } + if (flags == AT_EMPTY_PATH && vfs_empty_path(dfd, filename)) + return vfs_fstat(dfd, stat); name = getname_flags(filename, getname_statx_lookup_flags(statx_flags), NULL); ret = vfs_statx(dfd, name, statx_flags, stat, STATX_BASIC_STATS); From patchwork Wed Sep 18 14:01:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miao Wang via B4 Relay X-Patchwork-Id: 13806912 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 70C2918C01A; Wed, 18 Sep 2024 14:01:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726668109; cv=none; b=r7bkamgowVshbckU4qBmmjjezjGr32bl24K8LdwiMm732vROmAwYoGVoJ6av2L6f17hIY4lOw6I7RoSjjo4S3WQQXgorLWFF1oVkRvuiYdF511UvP5DymS1kS4dfdPyHQvvsi9HB3Kl9Jl0bxzB3WIPupT+BM0rOWX0Az26xnGI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726668109; c=relaxed/simple; bh=SrjfI6AJkMF7a6Yl8Mz1p1+x5RAggVoecp0mMtBpEhc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TyAaLgxzSochXk3NITAIq15XTFYMCXG8eOot4xV65Yeyx15GBOEmjnWDiu7zOsw9zvdQ0uuNCgeudbialVJ6tS+KPMd9mIrLlmu++ofrZKxhw3xX+UgVfhzjGXSBVvOgBhwHoi5voM/tk/yvV2JFdkS0Xw9W1pw467BHBTt/O3Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HBgm5reN; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HBgm5reN" Received: by smtp.kernel.org (Postfix) with ESMTPS id 4D5CEC4CECE; Wed, 18 Sep 2024 14:01:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726668109; bh=SrjfI6AJkMF7a6Yl8Mz1p1+x5RAggVoecp0mMtBpEhc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=HBgm5reNAr+rZxQOxQgZlwIG7owMM6OIIndSPYrnOYTFZTjsn/Xl1mT3KwQ82a1oD iCtitZNTEGR289ZXEki5QerBnBXtHCyHzraG0vGyOKGcoEuddzJ7EIA6UokyTDn0S1 3OqQo/xamrKYqfgf9jMp952jfdUruZ37e5ng+pBUko+iVaiycBgNS9p1GI6+gimMIb QLlndbGT8Z9ZET+QVZbhEfcZvQ12dyGhpypKZOfrEY7mPMuSJ+g/YneIUvq2qO0+I2 mOSoGyd9DJALZNLnbULB6Xf9qwL8GhnYy4V/yh/Qk5d3iehIgx4meE5MwYvd5O9Wfy BQvtxxy6LYF8w== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3F084CCD1A5; Wed, 18 Sep 2024 14:01:49 +0000 (UTC) From: Miao Wang via B4 Relay Date: Wed, 18 Sep 2024 22:01:21 +0800 Subject: [PATCH v6.10 3/3] vfs: support statx(..., NULL, AT_EMPTY_PATH, ...) Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240918-statx-stable-linux-6-10-y-v1-3-8364a071074f@gmail.com> References: <20240918-statx-stable-linux-6-10-y-v1-0-8364a071074f@gmail.com> In-Reply-To: <20240918-statx-stable-linux-6-10-y-v1-0-8364a071074f@gmail.com> To: Greg Kroah-Hartman , stable@vger.kernel.org Cc: Xi Ruoyao , Mateusz Guzik , Christian Brauner , Alexander Viro , Jan Kara , Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , linux-fsdevel@vger.kernel.org, stable@vger.kernel.org, Miao Wang X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=8249; i=shankerwangmiao@gmail.com; h=from:subject:message-id; bh=9J/bYSPlXIhi6E9ZB6fXyrlVsF3FwIjzHhYa5Djr6II=; b=owEBbQKS/ZANAwAKAbAx48p7/tluAcsmYgBm6t1KfUnRmp/RO24B5ffmTM9lmVdAkJCLpExWt CDy7GA9pmSJAjMEAAEKAB0WIQREqPWPgPJBxluezBOwMePKe/7ZbgUCZurdSgAKCRCwMePKe/7Z budqEACnpGoT7Y0FlY2Hs2G5q/h3SoXGRAespgXTTIeFpKmWPIKeNlPnWKtyyLBIQTJMIzuABmQ VzY5fSizUDOH9hKyt6w2la06glIjq+0UXn8xpQUZwCY0zUfn/vHVNdzBjOx3KtHitTdyLERDw9x rLEOxCLye+X7wq+570ufY/bTjkPfWrWiTZjxHWkmYdgwo/MbGPj1CEJ/KS/vRFhVrTC3xxaRhkJ hpYc2qhM3KxOkpADfedtQijQYxjWDIfrqmx457NgeQrMdcNIk/Z2yUzkLs/MUqZ0+AVpeuaWkxK 9CkMzKARdApRrZ2Eoy/J5y4Xw/L+3Glrd3jkDnQWQeMmxnU7izK0tQIaxf6LvABRKeUnsWcDU1c IEBTTuB7dtDCyrAfY9QoKR7Q8CD5yM3QkHoULr0zOu8i0f4zNduz/y5/OB4LyieLTqj2JPs0dGe yuzRacpyxh0AugoGlfqW6awB+WxfZaJO6JF+hVpIl3npdRa3nttd4utogGk1j9WsQSAptX25o4k dT56Ivbok6mxkw+XEQk3Pz/NActtImZppXw64YHomixrU92Evjh2u6loAHgDa/tpeNMcvZ6qwue Fx2F/nGdWmho/X5BqYo1E3EeaBl8SqDlOYpKbiQmo4AAMhbzmY1a3yFtpQd3BJQfNVOpXMaNSr9 glbBWJcrl9U+YWg== X-Developer-Key: i=shankerwangmiao@gmail.com; a=openpgp; fpr=6FAEFF06B7D212A774C60BFDFA0D166D6632EF4A X-Endpoint-Received: by B4 Relay for shankerwangmiao@gmail.com/default with auth_id=189 X-Original-From: Miao Wang Reply-To: shankerwangmiao@gmail.com From: Mateusz Guzik commit 0ef625b upstream. The newly used helper also checks for empty ("") paths. NULL paths with any flag value other than AT_EMPTY_PATH go the usual route and end up with -EFAULT to retain compatibility (Rust is abusing calls of the sort to detect availability of statx). This avoids path lookup code, lockref management, memory allocation and in case of NULL path userspace memory access (which can be quite expensive with SMAP on x86_64). Benchmarked with statx(..., AT_EMPTY_PATH, ...) running on Sapphire Rapids, with the "" path for the first two cases and NULL for the last one. Results in ops/s: stock: 4231237 pre-check: 5944063 (+40%) NULL path: 6601619 (+11%/+56%) Signed-off-by: Mateusz Guzik Link: https://lore.kernel.org/r/20240625151807.620812-1-mjguzik@gmail.com Tested-by: Xi Ruoyao [brauner: use path_mounted() and other tweaks] Signed-off-by: Christian Brauner Cc: # 6.10.x Signed-off-by: Miao Wang Tested-by: Xi Ruoyao --- fs/internal.h | 14 ++++++++ fs/namespace.c | 13 ------- fs/stat.c | 111 ++++++++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 97 insertions(+), 41 deletions(-) diff --git a/fs/internal.h b/fs/internal.h index ab2225136f60..f26454c60a98 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -247,6 +247,8 @@ extern const struct dentry_operations ns_dentry_operations; int getname_statx_lookup_flags(int flags); int do_statx(int dfd, struct filename *filename, unsigned int flags, unsigned int mask, struct statx __user *buffer); +int do_statx_fd(int fd, unsigned int flags, unsigned int mask, + struct statx __user *buffer); /* * fs/splice.c: @@ -321,3 +323,15 @@ struct stashed_operations { int path_from_stashed(struct dentry **stashed, struct vfsmount *mnt, void *data, struct path *path); void stashed_dentry_prune(struct dentry *dentry); +/** + * path_mounted - check whether path is mounted + * @path: path to check + * + * Determine whether @path refers to the root of a mount. + * + * Return: true if @path is the root of a mount, false if not. + */ +static inline bool path_mounted(const struct path *path) +{ + return path->mnt->mnt_root == path->dentry; +} diff --git a/fs/namespace.c b/fs/namespace.c index e1ced589d835..0134eda41b71 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -1846,19 +1846,6 @@ bool may_mount(void) return ns_capable(current->nsproxy->mnt_ns->user_ns, CAP_SYS_ADMIN); } -/** - * path_mounted - check whether path is mounted - * @path: path to check - * - * Determine whether @path refers to the root of a mount. - * - * Return: true if @path is the root of a mount, false if not. - */ -static inline bool path_mounted(const struct path *path) -{ - return path->mnt->mnt_root == path->dentry; -} - static void warn_mandlock(void) { pr_warn_once("=======================================================\n" diff --git a/fs/stat.c b/fs/stat.c index 0e8558f9c0b3..52fde6fe0086 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -214,6 +214,43 @@ int getname_statx_lookup_flags(int flags) return lookup_flags; } +static int vfs_statx_path(struct path *path, int flags, struct kstat *stat, + u32 request_mask) +{ + int error = vfs_getattr(path, stat, request_mask, flags); + + if (request_mask & STATX_MNT_ID_UNIQUE) { + stat->mnt_id = real_mount(path->mnt)->mnt_id_unique; + stat->result_mask |= STATX_MNT_ID_UNIQUE; + } else { + stat->mnt_id = real_mount(path->mnt)->mnt_id; + stat->result_mask |= STATX_MNT_ID; + } + + if (path_mounted(path)) + stat->attributes |= STATX_ATTR_MOUNT_ROOT; + stat->attributes_mask |= STATX_ATTR_MOUNT_ROOT; + + /* Handle STATX_DIOALIGN for block devices. */ + if (request_mask & STATX_DIOALIGN) { + struct inode *inode = d_backing_inode(path->dentry); + + if (S_ISBLK(inode->i_mode)) + bdev_statx_dioalign(inode, stat); + } + + return error; +} + +static int vfs_statx_fd(int fd, int flags, struct kstat *stat, + u32 request_mask) +{ + CLASS(fd_raw, f)(fd); + if (!f.file) + return -EBADF; + return vfs_statx_path(&f.file->f_path, flags, stat, request_mask); +} + /** * vfs_statx - Get basic and extra attributes by filename * @dfd: A file descriptor representing the base dir for a relative filename @@ -243,36 +280,13 @@ static int vfs_statx(int dfd, struct filename *filename, int flags, retry: error = filename_lookup(dfd, filename, lookup_flags, &path, NULL); if (error) - goto out; - - error = vfs_getattr(&path, stat, request_mask, flags); - - if (request_mask & STATX_MNT_ID_UNIQUE) { - stat->mnt_id = real_mount(path.mnt)->mnt_id_unique; - stat->result_mask |= STATX_MNT_ID_UNIQUE; - } else { - stat->mnt_id = real_mount(path.mnt)->mnt_id; - stat->result_mask |= STATX_MNT_ID; - } - - if (path.mnt->mnt_root == path.dentry) - stat->attributes |= STATX_ATTR_MOUNT_ROOT; - stat->attributes_mask |= STATX_ATTR_MOUNT_ROOT; - - /* Handle STATX_DIOALIGN for block devices. */ - if (request_mask & STATX_DIOALIGN) { - struct inode *inode = d_backing_inode(path.dentry); - - if (S_ISBLK(inode->i_mode)) - bdev_statx_dioalign(inode, stat); - } - + return error; + error = vfs_statx_path(&path, flags, stat, request_mask); path_put(&path); if (retry_estale(error, lookup_flags)) { lookup_flags |= LOOKUP_REVAL; goto retry; } -out: return error; } @@ -666,7 +680,8 @@ int do_statx(int dfd, struct filename *filename, unsigned int flags, if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_SYNC_TYPE) return -EINVAL; - /* STATX_CHANGE_COOKIE is kernel-only for now. Ignore requests + /* + * STATX_CHANGE_COOKIE is kernel-only for now. Ignore requests * from userland. */ mask &= ~STATX_CHANGE_COOKIE; @@ -678,16 +693,41 @@ int do_statx(int dfd, struct filename *filename, unsigned int flags, return cp_statx(&stat, buffer); } +int do_statx_fd(int fd, unsigned int flags, unsigned int mask, + struct statx __user *buffer) +{ + struct kstat stat; + int error; + + if (mask & STATX__RESERVED) + return -EINVAL; + if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_SYNC_TYPE) + return -EINVAL; + + /* + * STATX_CHANGE_COOKIE is kernel-only for now. Ignore requests + * from userland. + */ + mask &= ~STATX_CHANGE_COOKIE; + + error = vfs_statx_fd(fd, flags, &stat, mask); + if (error) + return error; + + return cp_statx(&stat, buffer); +} + /** * sys_statx - System call to get enhanced stats * @dfd: Base directory to pathwalk from *or* fd to stat. - * @filename: File to stat or "" with AT_EMPTY_PATH + * @filename: File to stat or either NULL or "" with AT_EMPTY_PATH * @flags: AT_* flags to control pathwalk. * @mask: Parts of statx struct actually required. * @buffer: Result buffer. * * Note that fstat() can be emulated by setting dfd to the fd of interest, - * supplying "" as the filename and setting AT_EMPTY_PATH in the flags. + * supplying "" (or preferably NULL) as the filename and setting AT_EMPTY_PATH + * in the flags. */ SYSCALL_DEFINE5(statx, int, dfd, const char __user *, filename, unsigned, flags, @@ -695,8 +735,23 @@ SYSCALL_DEFINE5(statx, struct statx __user *, buffer) { int ret; + unsigned lflags; struct filename *name; + /* + * Short-circuit handling of NULL and "" paths. + * + * For a NULL path we require and accept only the AT_EMPTY_PATH flag + * (possibly |'d with AT_STATX flags). + * + * However, glibc on 32-bit architectures implements fstatat as statx + * with the "" pathname and AT_NO_AUTOMOUNT | AT_EMPTY_PATH flags. + * Supporting this results in the uglification below. + */ + lflags = flags & ~(AT_NO_AUTOMOUNT | AT_STATX_SYNC_TYPE); + if (lflags == AT_EMPTY_PATH && vfs_empty_path(dfd, filename)) + return do_statx_fd(dfd, flags & ~AT_NO_AUTOMOUNT, mask, buffer); + name = getname_flags(filename, getname_statx_lookup_flags(flags), NULL); ret = do_statx(dfd, name, flags, mask, buffer); putname(name);