From patchwork Fri Aug 23 17:33:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andr=C3=A9_Almeida?= X-Patchwork-Id: 13775613 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4696DC531DC for ; Fri, 23 Aug 2024 17:33:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A1F73800B7; Fri, 23 Aug 2024 13:33:56 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9D038800B4; Fri, 23 Aug 2024 13:33:56 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 896F5800B7; Fri, 23 Aug 2024 13:33:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 6FF3D800B4 for ; Fri, 23 Aug 2024 13:33:56 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 06449A0D84 for ; Fri, 23 Aug 2024 17:33:56 +0000 (UTC) X-FDA: 82484208072.27.1DB4033 Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by imf26.hostedemail.com (Postfix) with ESMTP id 1908614001E for ; Fri, 23 Aug 2024 17:33:51 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=igalia.com header.s=20170329 header.b=pwiLiZ0j; spf=pass (imf26.hostedemail.com: domain of andrealmeid@igalia.com designates 178.60.130.6 as permitted sender) smtp.mailfrom=andrealmeid@igalia.com; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1724434392; a=rsa-sha256; cv=none; b=bXnp2IdiOClLdAe0u/lTlFrCdvd15xhY7CA/lirTaKIHRyi5SMU23t5cVIb0uFvdybUuDS 1o1m2YxnheUkNdLT2a0D/W58fcBF1Y17EiOd8g6UWBRdTSOQw824E3WKtf7kuzqd14uxvz GQn5lLiW1bYdjm9hSdJ2IIDjd8+L9X0= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=igalia.com header.s=20170329 header.b=pwiLiZ0j; spf=pass (imf26.hostedemail.com: domain of andrealmeid@igalia.com designates 178.60.130.6 as permitted sender) smtp.mailfrom=andrealmeid@igalia.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1724434391; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=y9QOgUnGmMfOXt3imEXMFmKZoYcPek4W3U8ViHPXL9E=; b=eiRldyXSO0HJiAorAvJ47drBYBH2KXMMKZWP666WTwVV1YfZkm/GQpotUpQrjQo8FpLRMI blFFJH93ewieNH4AT2ZDv1MU1dz56UOavPUUUc6w/70Gr68KytkzRBBsbayT9FBe1rSwcW dHAAaCiaNOKkDusk5KsJ5W6n7/XEJwk= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=y9QOgUnGmMfOXt3imEXMFmKZoYcPek4W3U8ViHPXL9E=; b=pwiLiZ0jOOthH9F2SeGr7Suney P0Qx8u9N4jscQ8YEczpVwDus5CS5wSiBL8Q9JsZhhRGxJRkTX8IiRtNuQFZszoxBK03p4c1oSyO3s g4yUreFx0v96lY3zFE7qXYo8AX3nJhsPHPruhMF0sZGug7HQDKPfggxEmM+NFMM8rFc9MkUpAN6nk LmoJGYx0+rsiURnMC6sIdfZN0J4JMV31wPv+kreX3IYbO57f3UBjGJw5GTJrWztr6FCQR+bwveXV4 w9xbxxMZzi9mpFMK/8maAtNIi7nebYcTsBC/mFVqnktHaptQjcHwYl79abuigeUzxB1H02SMuQdXv IqpaWIaA==; Received: from [179.118.186.198] (helo=localhost.localdomain) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1shYAP-0048Ww-Nr; Fri, 23 Aug 2024 19:33:41 +0200 From: =?utf-8?q?Andr=C3=A9_Almeida?= To: Hugh Dickins , Andrew Morton , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, kernel-dev@igalia.com, krisman@kernel.org, Daniel Rosenberg , smcv@collabora.com, =?utf-8?q?Andr?= =?utf-8?q?=C3=A9_Almeida?= Subject: [PATCH 1/5] tmpfs: Add casefold lookup support Date: Fri, 23 Aug 2024 14:33:28 -0300 Message-ID: <20240823173332.281211-2-andrealmeid@igalia.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240823173332.281211-1-andrealmeid@igalia.com> References: <20240823173332.281211-1-andrealmeid@igalia.com> MIME-Version: 1.0 X-Stat-Signature: pkng3uq6ir45aozf7wam7yiwxro8fwpz X-Rspamd-Queue-Id: 1908614001E X-Rspam-User: X-Rspamd-Server: rspam10 X-HE-Tag: 1724434431-723577 X-HE-Meta: U2FsdGVkX1+U9ugZVueLQz988jMXn/7eS74t36OPwfttmUjB2c57VRtx01NtW9PaCdzAlgf5cmJS9SzT/wGswpBrKqPcd07SOBC6oy/Jhf21Vn0BPgPE6MNRG+3tC6u5KbEcJcB11PkF/FR9HJZpPdDD8m5E1SSmXF2mpG4TbHqK58/8hOFNcYzclHKmD4dYPg0PfhqnCY/CPKV+dR7pRtXGzIULsEovS9gjMPRUJ/NBxlLHMaC152ZpsLYwwaDya4mGBG8u2mt1TP4HmgQka9KAAsOpV9Jm65jCshLiU92WKDi76SIBf+liR25odk7HPUjkzBh2fWAcpjqmElH7ozuoZriXb7BxIEKIeamVk6W5VMoDjWOK6lbtD3Y6RWmP90zacKNwN1S6TpXpsnPl7Ne4E+SCGJt4WVtGVRGkOZ5AYwVmW/7DmcPtvpdTJIACk3X5y0e0oL2q0gv77Z6yHAo7woSmIBjmYiHtp+rpNZvxHON8yXBKxFnUb8hHAKzETCk61vsvTkNgKKdaMqkgQBxYJ21fA7w8Z3QeP2Ye/UNlshk1WwzeimleDCQpetuqsV6DBpnTtaAChK+wXg9ZiDh7ulOHlhp00SP6qMbuAyweOL6UljnLALxFqb80TNCwjPFCknKbJ4yFqkJscfy+zK6eg/8pHTBkLuU36bNvakuX8HfLK07WblW9NgD5BS77uok0G7gjqqGmOy8W5FQDQidqMpkItNNdr2xcsFBzyV52Zjkq9vfO4JSszw71tByKjTsULoKezxqjiZ6beCo1IxZdnIO4/EmU/RE7AOmgHqAAX91eJ9NE0/Bomr80jD7BfBHQmcPvEKiV8vclvc5AgmLXeufvESoPibgQIS3ZGbQ70VEBV0mbTumySVfaLiDcXYqFAy4v0eWDOxrVZHszFV4D/+1qO4bM36isKi82+Z/dyta3ASowONF8NTOxU85YeCgQtbsdk+KW/zZyGB9 lyslJisu 4C9xHAOsbgT5YQEaALgcdDxRev7EwSV5u8l0J7u4hZz7DqjjgdmEjbiS68No/WO9k6sy5lPj5Ar4CoEqJn6ZnHc1tbwXUSxl+iArUnrHeqAUKivQ7XkQC4KRny3hdqwvmLI7FtgdvTrmlFeHjx5/dNCxQWoQlhrqTXxhu4+og3z8JP4TJURMlYvRaF5+nrlyUiFPBx/xXHxTxLAv/gDhXnJvEpQoXnvRUnkmMzcUJ1bGLQDCjJPQi8eLo7dGPP1Cz8BnDYmxB8FyOc1Qo4rDMXJUOQoPctIH1jjXL X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Enable casefold lookup in tmpfs, based on the enconding defined by userspace. That means that instead of comparing byte per byte a file name, it compares to a case-insensitive equivalent of the Unicode string. * dcache handling There's a special need when dealing with case-insensitive dentries. First of all, we currently invalidated every negative casefold dentries. That happens because currently VFS code has no proper support to deal with that, giving that it could incorrectly reuse a previous filename for a new file that has a casefold match. For instance, this could happen: $ mkdir DIR $ rm -r DIR $ mkdir dir $ ls DIR/ And would be perceived as inconsistency from userspace point of view, because even that we match files in a case-insensitive manner, we still honor whatever is the initial filename. Along with that, tmpfs stores only the first equivalent name dentry used in the dcache, preventing duplications of dentries in the dcache. The d_compare() version for casefold files stores a normalized string, and before every lookup, the filename is normalized as well, achieving a casefolded lookup. Signed-off-by: André Almeida --- include/linux/shmem_fs.h | 1 + mm/shmem.c | 63 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h index 1d06b1e5408a..1a1196b077a6 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h @@ -73,6 +73,7 @@ struct shmem_sb_info { struct list_head shrinklist; /* List of shinkable inodes */ unsigned long shrinklist_len; /* Length of shrinklist */ struct shmem_quota_limits qlimits; /* Default quota limits */ + bool casefold; }; static inline struct shmem_inode_info *SHMEM_I(struct inode *inode) diff --git a/mm/shmem.c b/mm/shmem.c index 5a77acf6ac6a..aa272c62f811 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -40,6 +40,8 @@ #include #include #include +#include +#include #include "swap.h" static struct vfsmount *shm_mnt __ro_after_init; @@ -123,6 +125,8 @@ struct shmem_options { bool noswap; unsigned short quota_types; struct shmem_quota_limits qlimits; + struct unicode_map *encoding; + bool strict_encoding; #define SHMEM_SEEN_BLOCKS 1 #define SHMEM_SEEN_INODES 2 #define SHMEM_SEEN_HUGE 4 @@ -3427,6 +3431,12 @@ shmem_mknod(struct mnt_idmap *idmap, struct inode *dir, if (IS_ERR(inode)) return PTR_ERR(inode); +#if IS_ENABLED(CONFIG_UNICODE) + if (sb_has_strict_encoding(dir->i_sb) && IS_CASEFOLDED(dir) && + dir->i_sb->s_encoding && utf8_validate(dir->i_sb->s_encoding, &dentry->d_name)) + return -EINVAL; +#endif + error = simple_acl_create(dir, inode); if (error) goto out_iput; @@ -3435,6 +3445,9 @@ shmem_mknod(struct mnt_idmap *idmap, struct inode *dir, if (error && error != -EOPNOTSUPP) goto out_iput; + if (IS_CASEFOLDED(dir)) + d_add(dentry, NULL); + error = simple_offset_add(shmem_get_offset_ctx(dir), dentry); if (error) goto out_iput; @@ -3526,6 +3539,9 @@ static int shmem_link(struct dentry *old_dentry, struct inode *dir, goto out; } + if (IS_CASEFOLDED(dir)) + d_add(dentry, NULL); + dir->i_size += BOGO_DIRENT_SIZE; inode_set_mtime_to_ts(dir, inode_set_ctime_to_ts(dir, inode_set_ctime_current(inode))); @@ -3553,6 +3569,14 @@ static int shmem_unlink(struct inode *dir, struct dentry *dentry) inode_inc_iversion(dir); drop_nlink(inode); dput(dentry); /* Undo the count from "create" - does all the work */ + + /* + * For now, VFS can't deal with case-insensitive negative dentries, so + * we destroy them + */ + if (IS_CASEFOLDED(dir)) + d_invalidate(dentry); + return 0; } @@ -3697,6 +3721,8 @@ static int shmem_symlink(struct mnt_idmap *idmap, struct inode *dir, dir->i_size += BOGO_DIRENT_SIZE; inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir)); inode_inc_iversion(dir); + if (IS_CASEFOLDED(dir)) + d_add(dentry, NULL); d_instantiate(dentry, inode); dget(dentry); return 0; @@ -4471,6 +4497,11 @@ static void shmem_put_super(struct super_block *sb) { struct shmem_sb_info *sbinfo = SHMEM_SB(sb); +#if IS_ENABLED(CONFIG_UNICODE) + if (sbinfo->casefold) + utf8_unload(sb->s_encoding); +#endif + #ifdef CONFIG_TMPFS_QUOTA shmem_disable_quotas(sb); #endif @@ -4515,6 +4546,17 @@ static int shmem_fill_super(struct super_block *sb, struct fs_context *fc) } sb->s_export_op = &shmem_export_ops; sb->s_flags |= SB_NOSEC | SB_I_VERSION; + +#if IS_ENABLED(CONFIG_UNICODE) + if (ctx->encoding) { + sb->s_encoding = ctx->encoding; + generic_set_sb_d_ops(sb); + if (ctx->strict_encoding) + sb->s_encoding_flags = SB_ENC_STRICT_MODE_FL; + sbinfo->casefold = true; + } +#endif + #else sb->s_flags |= SB_NOUSER; #endif @@ -4704,11 +4746,28 @@ static const struct inode_operations shmem_inode_operations = { #endif }; +static struct dentry *shmem_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) +{ + if (dentry->d_name.len > NAME_MAX) + return ERR_PTR(-ENAMETOOLONG); + + /* + * For now, VFS can't deal with case-insensitive negative dentries, so + * we prevent them from being created + */ + if (IS_CASEFOLDED(dir)) + return NULL; + + d_add(dentry, NULL); + + return NULL; +} + static const struct inode_operations shmem_dir_inode_operations = { #ifdef CONFIG_TMPFS .getattr = shmem_getattr, .create = shmem_create, - .lookup = simple_lookup, + .lookup = shmem_lookup, .link = shmem_link, .unlink = shmem_unlink, .symlink = shmem_symlink, @@ -4791,6 +4850,8 @@ int shmem_init_fs_context(struct fs_context *fc) ctx->uid = current_fsuid(); ctx->gid = current_fsgid(); + ctx->encoding = NULL; + fc->fs_private = ctx; fc->ops = &shmem_fs_context_ops; return 0; From patchwork Fri Aug 23 17:33:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andr=C3=A9_Almeida?= X-Patchwork-Id: 13775615 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id D6C59C52D7C for ; Fri, 23 Aug 2024 17:34:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 90FA0800B9; Fri, 23 Aug 2024 13:33:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 896E0800B4; Fri, 23 Aug 2024 13:33:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 73800800B9; Fri, 23 Aug 2024 13:33:58 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 549B4800B4 for ; Fri, 23 Aug 2024 13:33:58 -0400 (EDT) Received: from smtpin19.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id A5A151C4045 for ; Fri, 23 Aug 2024 17:33:57 +0000 (UTC) X-FDA: 82484208114.19.AA4A5FD Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by imf28.hostedemail.com (Postfix) with ESMTP id 0360CC0028 for ; Fri, 23 Aug 2024 17:33:55 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=igalia.com header.s=20170329 header.b=rgKiTFkM; spf=pass (imf28.hostedemail.com: domain of andrealmeid@igalia.com designates 178.60.130.6 as permitted sender) smtp.mailfrom=andrealmeid@igalia.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1724434395; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=kaq/p7WWGkDPfkYXS5iXH7ESr86fZs1bSaN+LK5hniQ=; b=HML6jMQtBdDhNs8IePo0I0Nxz1o8YUN0Dg5Oz2Z8IEluTwvzt6Ur0xDfbE1fIY20FsxZqN +bX7tWuu7/kIr3TZVwuZahyDZx1xrUT+WVSHT7kBw6CNGfSnDFww/wgBWpRgKk0jl6tVVG cGMpTqGCmkxOp6LaJSDQScbKTidb0DE= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=igalia.com header.s=20170329 header.b=rgKiTFkM; spf=pass (imf28.hostedemail.com: domain of andrealmeid@igalia.com designates 178.60.130.6 as permitted sender) smtp.mailfrom=andrealmeid@igalia.com; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1724434395; a=rsa-sha256; cv=none; b=ZJruuLQ1epQWU4OSwuQ94ysMmm7zqwRJk9X6m2bN2/0aibhxc6LK6iz5NSdo8wdLCimrA3 r2emEj8ZmLn099FQ9Dz95/acxVuzStL8KXjsHby7r+Gw/QpmidZQKCXI4Bne+IK9m5BJHW dIBqwZzuYTRxn7rfeFyiX/0MZNtI8tE= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=kaq/p7WWGkDPfkYXS5iXH7ESr86fZs1bSaN+LK5hniQ=; b=rgKiTFkMBobH15FQLLakWX0RAP BzP7Bp1kevVfr/cme/57GIHDALcfZ1lGwmnKxIOM8WrPIuby9AUXJoXDxgvGKgXGCC4Tg00Mn+AoA MRwGNdt7ymV7BBzymaAUEy+K4L/XWHkOfS2vHUhT01/y29VxGZB2kQzsZ+r0Rh2DWs1MtmEx5cINo m9Qwyn8bOOMGlztD8IvEGcPOaG9zZAZ3C88BD6FJiA0XbC5/Fn0JrT1l8HcxCWzaV/B1wKTyC6FHx QnbSrwG7cY3a8z8U1I/DStbyOAsUzfEDxqYSNaQfB7UIK6RD6zfcc6pgfwJgZUZndopllnDW7+VVS Znx9VXCg==; Received: from [179.118.186.198] (helo=localhost.localdomain) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1shYAT-0048Ww-Do; Fri, 23 Aug 2024 19:33:45 +0200 From: =?utf-8?q?Andr=C3=A9_Almeida?= To: Hugh Dickins , Andrew Morton , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, kernel-dev@igalia.com, krisman@kernel.org, Daniel Rosenberg , smcv@collabora.com, =?utf-8?q?Andr?= =?utf-8?q?=C3=A9_Almeida?= Subject: [PATCH 2/5] tmpfs: Add flag FS_CASEFOLD_FL support for tmpfs dirs Date: Fri, 23 Aug 2024 14:33:29 -0300 Message-ID: <20240823173332.281211-3-andrealmeid@igalia.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240823173332.281211-1-andrealmeid@igalia.com> References: <20240823173332.281211-1-andrealmeid@igalia.com> MIME-Version: 1.0 X-Rspamd-Server: rspam03 X-Rspam-User: X-Rspamd-Queue-Id: 0360CC0028 X-Stat-Signature: dk6tq57um441godsownmxwuamz3g1xuj X-HE-Tag: 1724434435-427376 X-HE-Meta: U2FsdGVkX1/k2xQhJR1skDkz3qvVU4wZOGvCQV684l2vAszRNGp4PLWojMmZ8i1/QVsUuvFB8pyFZ0Pq9sCr7ayijCEkVl0hFBvGVwXO56WuacBV45mPVzmu7YVzGpzs0qEGQiARabS19sx6/CWXULa7KHArqSOa6sNOlXH5/wh2NZkp9GqDQ1Y8+FMiJLjkh9K8G8diF3TdNQ5+6FX8alL7SrGbdO6idzKWXh4t/kCu+lrNfOqziPArp5ykCoKrMf0pyeuHeHPiyMpG9hBh+5AsPZWitZrT6EinpCYWmLamiFqtYHc4PH2gFCumYFC6Oislu2KkmAO877svfX1igSFNvpAxDQo7v7rc+IBRrk2rd82YAOyj2wEiH13gABZcenJAoKoglDyvxhfj9Tm41b6Wp5FoMh8FOShn/6hFzm+kEsEm4oZLsxRg7tcTJS65uoph6rA2Wg4rkcClGExABCEslkF0ohBo9AKcXiSfKgwdgJ1J+9QlikzvfV/S+0trl2k2LQB2lRbBjruWyBoLs+575RBag7sgRr5SWt8yB541OTkspf3QUV0Hz7AnwSA5vXf2vAMSjJ6jnhvVbmqB53SxdEyZtcnriVXNH+GxtkjfaMXF1mq/atmRppw044HeWpjLlLDhA4AqHc4WOUql7/H1FySZQyoSAertzrRiUQ/xLMIraL04wEnxym+pSScrg1LAmRmvVu2eY42fmjTGNMepoB36k5wCvQ5JQBZJTXNvv8iN8kcA4tEuTmN9bmKi0Ag8TVIiv61oHlfXCFNe9Hozy08ivxLR97dN2aaAGYNae8OOi6vzDLrFIaFaoEyBc/FyRyZe4kIQSRdmZyF4I0FwsRxqI20zHXF7leJ1sPG4GQ5vLqWee/9KhNazYMJA/zJ0ahAglXiFaj7eB4JQ4b3BtrZiXnpcFGzId1lnQ2p7ZoYVvatila5MoUAOzVWnBIA9ZVH50hErwktxTk2 O+OndrlK zegBDj2M7Ms/5tRGXHdCcPkkXuRb4DkfixLtkczQ78T2v0qkCtN1sxMrFlcI4QnO9GewAOimuDDII1mlQW7b6o3UFPbsn1nfLnBNf1DnglU4aZM+BNX8bvCBwb545B/aXi4SxQxU9t2Cr3xm5RHqp3HrHeu3BT3hQthtVLWN4dVpfouASvmfayQuxMWked9yaCKdI2zfMoPulvydkijaUu4d70wroVAX61Uk7DbP15wHqNKwNAmmjo9oTNFegQ4pGg73mkF+Yr1Vf/Ru32LASnI8/JOCxDU6yGtsZkHsONkTKXXBOvT0jAklThzDnjBT7jmdBQj0FXwWsKd1gZo0O55wmqg== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Enable setting flag FS_CASEFOLD_FL for tmpfs directories, when tmpfs is mounted with casefold support. A special check is need for this flag, since it can't be set for non-empty directories. Signed-off-by: André Almeida --- include/linux/shmem_fs.h | 6 +++--- mm/shmem.c | 40 +++++++++++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h index 1a1196b077a6..acec92564122 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h @@ -42,10 +42,10 @@ struct shmem_inode_info { struct inode vfs_inode; }; -#define SHMEM_FL_USER_VISIBLE FS_FL_USER_VISIBLE +#define SHMEM_FL_USER_VISIBLE (FS_FL_USER_VISIBLE | FS_CASEFOLD_FL) #define SHMEM_FL_USER_MODIFIABLE \ - (FS_IMMUTABLE_FL | FS_APPEND_FL | FS_NODUMP_FL | FS_NOATIME_FL) -#define SHMEM_FL_INHERITED (FS_NODUMP_FL | FS_NOATIME_FL) + (FS_IMMUTABLE_FL | FS_APPEND_FL | FS_NODUMP_FL | FS_NOATIME_FL | FS_CASEFOLD_FL) +#define SHMEM_FL_INHERITED (FS_NODUMP_FL | FS_NOATIME_FL | FS_CASEFOLD_FL) struct shmem_quota_limits { qsize_t usrquota_bhardlimit; /* Default user quota block hard limit */ diff --git a/mm/shmem.c b/mm/shmem.c index aa272c62f811..67b6ab580ca2 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2617,9 +2617,26 @@ static int shmem_initxattrs(struct inode *, const struct xattr *, void *); * chattr's fsflags are unrelated to extended attributes, * but tmpfs has chosen to enable them under the same config option. */ -static void shmem_set_inode_flags(struct inode *inode, unsigned int fsflags) +static int shmem_set_inode_flags(struct inode *inode, unsigned int fsflags, struct dentry *dentry) { - unsigned int i_flags = 0; + unsigned int i_flags = 0, old = inode->i_flags; + struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb); + + if (fsflags & FS_CASEFOLD_FL) { + if (!sbinfo->casefold) + return -EOPNOTSUPP; + + if (!S_ISDIR(inode->i_mode)) + return -ENOTDIR; + + if (dentry && !simple_empty(dentry)) + return -ENOTEMPTY; + + i_flags |= S_CASEFOLD; + } else if (old & S_CASEFOLD) { + if (dentry && !simple_empty(dentry)) + return -ENOTEMPTY; + } if (fsflags & FS_NOATIME_FL) i_flags |= S_NOATIME; @@ -2630,10 +2647,12 @@ static void shmem_set_inode_flags(struct inode *inode, unsigned int fsflags) /* * But FS_NODUMP_FL does not require any action in i_flags. */ - inode_set_flags(inode, i_flags, S_NOATIME | S_APPEND | S_IMMUTABLE); + inode_set_flags(inode, i_flags, S_NOATIME | S_APPEND | S_IMMUTABLE | S_CASEFOLD); + + return 0; } #else -static void shmem_set_inode_flags(struct inode *inode, unsigned int fsflags) +static void shmem_set_inode_flags(struct inode *inode, unsigned int fsflags, struct dentry *dentry) { } #define shmem_initxattrs NULL @@ -2680,7 +2699,7 @@ static struct inode *__shmem_get_inode(struct mnt_idmap *idmap, info->fsflags = (dir == NULL) ? 0 : SHMEM_I(dir)->fsflags & SHMEM_FL_INHERITED; if (info->fsflags) - shmem_set_inode_flags(inode, info->fsflags); + shmem_set_inode_flags(inode, info->fsflags, NULL); INIT_LIST_HEAD(&info->shrinklist); INIT_LIST_HEAD(&info->swaplist); simple_xattrs_init(&info->xattrs); @@ -3788,16 +3807,23 @@ static int shmem_fileattr_set(struct mnt_idmap *idmap, { struct inode *inode = d_inode(dentry); struct shmem_inode_info *info = SHMEM_I(inode); + int ret, flags; if (fileattr_has_fsx(fa)) return -EOPNOTSUPP; if (fa->flags & ~SHMEM_FL_USER_MODIFIABLE) return -EOPNOTSUPP; - info->fsflags = (info->fsflags & ~SHMEM_FL_USER_MODIFIABLE) | + flags = (info->fsflags & ~SHMEM_FL_USER_MODIFIABLE) | (fa->flags & SHMEM_FL_USER_MODIFIABLE); - shmem_set_inode_flags(inode, info->fsflags); + ret = shmem_set_inode_flags(inode, flags, dentry); + + if (ret) + return ret; + + info->fsflags = flags; + inode_set_ctime_current(inode); inode_inc_iversion(inode); return 0; From patchwork Fri Aug 23 17:33:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andr=C3=A9_Almeida?= X-Patchwork-Id: 13775614 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id E75D8C5321D for ; Fri, 23 Aug 2024 17:33:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2CB69800B8; Fri, 23 Aug 2024 13:33:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 27DB9800B4; Fri, 23 Aug 2024 13:33:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F27F6800B8; Fri, 23 Aug 2024 13:33:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id DAABE800B4 for ; Fri, 23 Aug 2024 13:33:57 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 892C5140E13 for ; Fri, 23 Aug 2024 17:33:57 +0000 (UTC) X-FDA: 82484208114.05.E5912D0 Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by imf05.hostedemail.com (Postfix) with ESMTP id C7413100023 for ; Fri, 23 Aug 2024 17:33:55 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=igalia.com header.s=20170329 header.b="ahX/SCZP"; spf=pass (imf05.hostedemail.com: domain of andrealmeid@igalia.com designates 178.60.130.6 as permitted sender) smtp.mailfrom=andrealmeid@igalia.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1724434326; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=8fGDhDblxpiWpLMEgOVUHiirq5YHZlp3LvTsoH5n4cY=; b=7qNDgP6O0EwEWUxxEMYO9+ew+PmRbTjBVX/sg2qiqseY4bSUapi3bEXRLuxTot6p0cqCq0 i5b2QjycZxt9RafZECgkTl8MnFRgwWbDGnpy3oAopFoVc2KJX8LqMk6iQB1EB3XqLprwVJ FHX80001Ozy5ZFWWUkOmKWdFEUM4upk= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=igalia.com header.s=20170329 header.b="ahX/SCZP"; spf=pass (imf05.hostedemail.com: domain of andrealmeid@igalia.com designates 178.60.130.6 as permitted sender) smtp.mailfrom=andrealmeid@igalia.com; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1724434326; a=rsa-sha256; cv=none; b=zUAYeegH/0k4pe4pc6IHk7vJrTtfCXKRE5QXsoaK3OPxWEmMfH8ZdOZyqIc1/giweeleOY LCZk8u/xBAqYTzz2mRNGb1wklS70tDcdijxuUew9bBdw1BXzW2gcgQspmDpPQ4jV/WdW83 V2DnW+jmHJYTEk1amTqLvSgetYvuYWE= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=8fGDhDblxpiWpLMEgOVUHiirq5YHZlp3LvTsoH5n4cY=; b=ahX/SCZPOOraUkYBrU/yJolT6B Kaff1CccaDHutwJ9fMceTjyx8yuoufIaCaSXL4xLmYLVu4Ez7dQW4SgRl1UX9kBjwJDz/csOehy2U 2PLh06v/HDwbslSyxxYPnjW9iFO/fRPxH+3yRnP9tzLA97V7wyfigHZCPaLAOYmap67CMl+cAf/Hr k0mPm5XcFUDm4G95UQzuKEKhDVaDMKnqS+ZZEPQuaSb0073EAbelrlCU5MXEQkXoBOtRuL5jj6PgG Xx0bNvwyYLrQ1BkNMqP/KAVd/YO9auXgQEg00LEbCQKYOPATfIhN5QBeZBa6ymMaIfap3YL9tbNqU yROXwNDw==; Received: from [179.118.186.198] (helo=localhost.localdomain) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1shYAX-0048Ww-3i; Fri, 23 Aug 2024 19:33:49 +0200 From: =?utf-8?q?Andr=C3=A9_Almeida?= To: Hugh Dickins , Andrew Morton , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, kernel-dev@igalia.com, krisman@kernel.org, Daniel Rosenberg , smcv@collabora.com, =?utf-8?q?Andr?= =?utf-8?q?=C3=A9_Almeida?= Subject: [PATCH 3/5] tmpfs: Create casefold mount options Date: Fri, 23 Aug 2024 14:33:30 -0300 Message-ID: <20240823173332.281211-4-andrealmeid@igalia.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240823173332.281211-1-andrealmeid@igalia.com> References: <20240823173332.281211-1-andrealmeid@igalia.com> MIME-Version: 1.0 X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: C7413100023 X-Stat-Signature: wsgx3uyygzsporoz3yezpfjh4x9xt9ik X-Rspam-User: X-HE-Tag: 1724434435-568743 X-HE-Meta: U2FsdGVkX1/4PmcahR9+ZcyjD0l5Xyl0YUpSxy+qKdiRTCmxMzf1UOLHR7aYNutehTHTOPP0K9zmVLO/95AW974EWxZ/nao5SjZXJbGf/2XcMq2Z8yIrg5q/DlytDX7izuoA6xE5/ahkmsoKEtnYl1A0iiDlyZ4hFLMpWffRTTH85V6HXCh+Ir5jYJKVkrjDHuCdV1aiVV/GE7AOMOE5FvQRHY8tSeAI2mxtCR5TTYdWwAgKm7jS6lBizxcOV0w3mPdYOlhAy/P0jTTGv+rUuKnySJz3erKCZlK4fSGyM8zyeEEfUqX0HKsDWnAqkupN9vi5W76W89waSpqc2lLntGSKb3iHCaulFWS1ya89n+vMggp6OtGayEcpykJ9WBmUA9YLmjumK0nX2vRNm09Q4ydl/zBp3z7Nu5fudpXpKD4cm4j2FICuMXPcVQLf6/tqhv2VKmZwJxAAArW8WCPgxxOsOyFoRtf9fXT4ezw1RJuj1FR9prAs/81yNPlSCZnsyWh7esoymIY8tSicaIwQk0cKU9TOHTs6LXQkJ3Q4OF6+62t4c1Z9EhKzZZzUxiygC35URjeiek8+3rGX/4+VOTggXV8lYYFP2gZh9Q0Dd801eDeZPRkE4jRGq0ynjMGcRi+QDUTNcIIcAAhdFpqL8VOyArg5N/5P+1xJdmOpvS0liPLBzKtArkgKuUutVLjRaftnARq7fzS11oFJZ1DWJIqxZMyBmJWGzf8Uhjka2MdmcuQnWLgFF9WujtyPQ71v+goH3BH4PDWkSJb7/x4VE4NJf4iYAO9ID+v9aShWo03OUw+1ueisjRA3SLPbXNuhj59pPAd8GBIOFqvM4ehmFDZhSH7ChIR/Vqle188mV5CWuECZ0cUP0tZdffdRXRqF0I3PElOT+qGXKX9D2/PjcOzFgzFo4udk17yblkAzjCNFkKwur1kxCXeHlF/Z6jw8hrGnETpE64cqNhv32/6 H7hh0wDO u8RtQQ9QT1VjdDGbKDH/airbPNhB87y0//TkllxdsgYBNzNHrqZ1VxqkcIwFSnsMeriVaBvNdAu+s0vajgykzIQt8zzZqjdi4J/BqXAki7QuhBwN3vw1L2+/isWljPWYAM4lxOp76jLaTH14MhTgR0JoSBvMpo5YKz9kiih/u+XaSQq3XnkQwe9x4mb59eF7Q5aPQPn0mFNaFolmw5hbnVT12QzXba2X9v6ms+dyjJ78ce1QkmZaX0nyL707UkP8PdyuwnWfaaQzC2J0hExbZp3QTlP0LhhSq2LLhpm+wlhbg8bYOyZDlXWe9HimzNBVx9p/a X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Most filesystems have their data stored in disk, so casefold option need to be enabled when building a filesystem on a device (via mkfs). However, as tmpfs is a RAM backed filesystem, there's no disk information and thus no mkfs to store information about casefold. For tmpfs, create casefold options for mounting. Userspace can then enable casefold support for a mount point using: $ mount -t tmpfs -o casefold=utf8-12.1.0 fs_name mount_dir/ Userspace must set what Unicode standard is aiming to. The available options depends on what the kernel Unicode subsystem supports. And for strict encoding: $ mount -t tmpfs -o casefold=utf8-12.1.0,strict_encoding fs_name mount_dir/ Strict encoding means that tmpfs will refuse to create invalid UTF-8 sequences. When this option is not enabled, any invalid sequence will be treated as an opaque byte sequence, ignoring the encoding thus not being able to be looked up in a case-insensitive way. Signed-off-by: André Almeida --- mm/shmem.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/mm/shmem.c b/mm/shmem.c index 67b6ab580ca2..5c77b4e73204 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -4102,6 +4102,8 @@ enum shmem_param { Opt_usrquota_inode_hardlimit, Opt_grpquota_block_hardlimit, Opt_grpquota_inode_hardlimit, + Opt_casefold, + Opt_strict_encoding, }; static const struct constant_table shmem_param_enums_huge[] = { @@ -4133,9 +4135,67 @@ const struct fs_parameter_spec shmem_fs_parameters[] = { fsparam_string("grpquota_block_hardlimit", Opt_grpquota_block_hardlimit), fsparam_string("grpquota_inode_hardlimit", Opt_grpquota_inode_hardlimit), #endif + fsparam_string("casefold", Opt_casefold), + fsparam_flag ("strict_encoding", Opt_strict_encoding), {} }; +#if IS_ENABLED(CONFIG_UNICODE) +static int utf8_parse_version(const char *version, unsigned int *maj, + unsigned int *min, unsigned int *rev) +{ + substring_t args[3]; + char version_string[12]; + static const struct match_token token[] = { + {1, "%d.%d.%d"}, + {0, NULL} + }; + + strscpy(version_string, version, sizeof(version_string)); + + if (match_token(version_string, token, args) != 1) + return -EINVAL; + + if (match_int(&args[0], maj) || match_int(&args[1], min) || + match_int(&args[2], rev)) + return -EINVAL; + + return 0; +} + +static int shmem_parse_opt_casefold(struct fs_context *fc, struct fs_parameter *param) +{ + struct shmem_options *ctx = fc->fs_private; + unsigned int maj, min, rev, version_number; + char version[10]; + int ret; + struct unicode_map *encoding; + + if (strncmp(param->string, "utf8-", 5)) + return invalfc(fc, "Only utf8 encondings are supported"); + ret = strscpy(version, param->string + 5, sizeof(version)); + if (ret < 0) + return invalfc(fc, "Invalid enconding argument: %s", + param->string); + + utf8_parse_version(version, &maj, &min, &rev); + version_number = UNICODE_AGE(maj, min, rev); + encoding = utf8_load(version_number); + if (IS_ERR(encoding)) + return invalfc(fc, "Invalid utf8 version: %s", version); + pr_info("tmpfs: Using encoding provided by mount options: %s\n", + param->string); + ctx->encoding = encoding; + + return 0; +} +#else +static int shmem_parse_opt_casefold(struct fs_context *fc, struct fs_parameter *param) +{ + return invalfc(fc, "tmpfs: No kernel support for casefold filesystems\n"); +} +#endif + static int shmem_parse_one(struct fs_context *fc, struct fs_parameter *param) { struct shmem_options *ctx = fc->fs_private; @@ -4294,6 +4354,11 @@ static int shmem_parse_one(struct fs_context *fc, struct fs_parameter *param) "Group quota inode hardlimit too large."); ctx->qlimits.grpquota_ihardlimit = size; break; + case Opt_casefold: + return shmem_parse_opt_casefold(fc, param); + case Opt_strict_encoding: + ctx->strict_encoding = true; + break; } return 0; From patchwork Fri Aug 23 17:33:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andr=C3=A9_Almeida?= X-Patchwork-Id: 13775616 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9FFA4C531DC for ; Fri, 23 Aug 2024 17:34:05 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DA244800BA; Fri, 23 Aug 2024 13:34:01 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D0438800B4; Fri, 23 Aug 2024 13:34:01 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B5CBA800BA; Fri, 23 Aug 2024 13:34:01 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 8C2F6800B4 for ; Fri, 23 Aug 2024 13:34:01 -0400 (EDT) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 2AD50A0AEE for ; Fri, 23 Aug 2024 17:34:01 +0000 (UTC) X-FDA: 82484208282.18.9D59693 Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by imf03.hostedemail.com (Postfix) with ESMTP id 7C96920025 for ; Fri, 23 Aug 2024 17:33:59 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=igalia.com header.s=20170329 header.b=ma3Xhzs3; spf=pass (imf03.hostedemail.com: domain of andrealmeid@igalia.com designates 178.60.130.6 as permitted sender) smtp.mailfrom=andrealmeid@igalia.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1724434330; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=zap4iol6rqGSjG5PpDRAFuTwCuOL01NSJqIIbGm2kbw=; b=VVGr/TGbD+FQmWTC2lrzwCLJHACAo0B2I0D5R/pYeSe5AbqS0KCjajhnIRFxfFW/4CgeGK fxCkQ2MgmOz/cE2IwguKms3osC8xI5MCt3h8BjQBUU7vIppbC0KnqBWxHvQqEqtF0Mh39+ hmTvhxYaVXa4TqxhIYX+t5gFMRvC7OI= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=igalia.com header.s=20170329 header.b=ma3Xhzs3; spf=pass (imf03.hostedemail.com: domain of andrealmeid@igalia.com designates 178.60.130.6 as permitted sender) smtp.mailfrom=andrealmeid@igalia.com; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1724434330; a=rsa-sha256; cv=none; b=6ThBddoaNOHAQHb+tGSAdBnlUUmBK4vL3pj6fJk1M7pwfyhLP16gFlEMdcGjSHCRo8155x Az+VfPe+yQidynPcqtPEd0f6K4+W4iIMDEtZrIwqSi9IWBYWGub6JyUtp3gY/rgdd2gpZv yf+y5j7W6SYSx2WEmk53YW0fK9YG0j4= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=zap4iol6rqGSjG5PpDRAFuTwCuOL01NSJqIIbGm2kbw=; b=ma3Xhzs3EwKomj3mpglFRwcABm abpsMnv+HGliRBrfAeREW4zYsafdnHo80mfj+l0CnjSX0kFp/aBnkN8w8WfuU/be7Rfj4RXbN4UiT gIBa9vYSVbaAHcRm60M3BeSNazFmJtScWkAV4emfUMWDIocYFhxQ0Yo32MR1/xvsGg4q77vk2kFaT wuVBFl4Z0Vy6wWRk8cgnfivmp3BEQHW/cDf2xwKHWFmhIosfhPZpDDxzEvOs/cD0QMWf+v2VB9+kg rq2TOD5vgs/K6zW7MmrTryws+94SffwMgyL21J5JMcLrd+rBnEPavyd0LNxej8vw5mE/rYY00xTKx fMbvGxGw==; Received: from [179.118.186.198] (helo=localhost.localdomain) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1shYAa-0048Ww-Pr; Fri, 23 Aug 2024 19:33:52 +0200 From: =?utf-8?q?Andr=C3=A9_Almeida?= To: Hugh Dickins , Andrew Morton , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, kernel-dev@igalia.com, krisman@kernel.org, Daniel Rosenberg , smcv@collabora.com, =?utf-8?q?Andr?= =?utf-8?q?=C3=A9_Almeida?= Subject: [PATCH 4/5] tmpfs: Expose filesystem features via sysfs Date: Fri, 23 Aug 2024 14:33:31 -0300 Message-ID: <20240823173332.281211-5-andrealmeid@igalia.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240823173332.281211-1-andrealmeid@igalia.com> References: <20240823173332.281211-1-andrealmeid@igalia.com> MIME-Version: 1.0 X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 7C96920025 X-Stat-Signature: 4mjww7p7u7goe3pnua63gtmfrxjbtxg3 X-Rspam-User: X-HE-Tag: 1724434439-744056 X-HE-Meta: U2FsdGVkX1+GWAbILYzVP5iEA1ms1KtssnY4vNoCvuvOFA9eVDKicroEwZyEwMqJe69hT7n3Mh4/2PPa4D16MKdh//1kQmWH2ZGEGH7HfJcA/OqZbSAq1nHT4HdCq7mmwmcVp2fB4ek5J6/MUhyCN5GfzYjtca5xMCuWDws8qWe7rNqHOb8uUnNybOg8wEEvscYssG6mYhyjbjYvgQ8KYFGJPYMHO15JR27xLInJoCNmR/sK+ddnC9WYps9lfH3QLlKr7bnCi3NAahlctezUFAlglbswcL3gnSXJmVhj7fgwD76p0gz9QlvLbfr/M4INNE3iaAZG2kRFIzytR5PtC1lD9+T+WykRBLZpJGCYyCbEcEYt60jyz4bn9hOIOJrk7McVNFI247wDKrnIDBlhXTVef90LnjL8n2Lzgp9w/qC8dpSyKkGpo7UMP1y+ycAazs27CvA0kWpOHIZ5o8A+SvCiud1dUJELyidj5Sv/Jh73KP1kQjFfTkcGjyoH3/ECl5yzjjPM+XIk2Z7AJ2CibFRNFDqeMq2h/TC5vASkiadxI2p5e5a2WADYiDXl7LI85rbmYCWP/Ws28PZBOEKh+x/QVx45pO9FChxu9KYMHac4KSexVENLnVVhD+B1brQaLo/310GtiTYweRJGSooqNOkQBdZw3gvoeI4Rr51quUna0tFmN3hx+7K6k93fjfibKdQzG2TG+9d3sNwUtGBWBctJb+7X/a/vEkeDaQ36PR+aw037EDxljHnxCe8/w9CEE143tTN56FkIDHdnSrlV7h0aCnc1LudaAbaOO7tDEhbXE/3ZGA01qizwZnmcv6hsRmt3bHJs+caCvttEjA2FluFm/RaLNa4DG53nTpnwphFNSOL8HpdBj15g2USjAgSqa3ThMRWMEdpP7QuQvafVoxkaOn2NAqeU7CFC8MfSO/jncIjQbgyJ47hp37lnkFl1F/F1DoeAJEO93ulK6mo FjA/ZFTs ADIz6t8Q7riKuvqyhd0Sf6bdOFoIV26KiT47Zm91r007AW73N8jqxxGWO01u3rnfuM1W1evlD2+yizWSslXotMfacpSg/wGYgzdqqOLWdTQS6HiG3k8EnYK+8lDdL395JYORjS8CzUHh1u/aRNBx+vJn4zvhYjcgnHbtzo1wXf1sYL9Z+Ur0RYBAdfR+2ug7zO49LkJAPIR0QDJPx7E/8x5KJoU2mbkn85geCM+2AnNpAJGAdGVaQrF4fC1/Mxxfg0201CZn7XO56v8ol8DyhA11HGAYv98PCgK9i X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Expose filesystem features through sysfs, so userspace can query if tmpfs support casefold. This follows the same setup as defined by ext4 and f2fs to expose casefold support to userspace. Signed-off-by: André Almeida --- mm/shmem.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/mm/shmem.c b/mm/shmem.c index 5c77b4e73204..f6e19b88d647 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -5384,3 +5384,40 @@ struct page *shmem_read_mapping_page_gfp(struct address_space *mapping, return page; } EXPORT_SYMBOL_GPL(shmem_read_mapping_page_gfp); + +#if defined(CONFIG_SYSFS) && defined(CONFIG_TMPFS) +#if IS_ENABLED(CONFIG_UNICODE) +DEVICE_STRING_ATTR_RO(casefold, 0444, "supported"); +#endif + +static struct attribute *tmpfs_attributes[] = { +#if IS_ENABLED(CONFIG_UNICODE) + &dev_attr_casefold.attr.attr, +#endif + NULL +}; + +static const struct attribute_group tmpfs_attribute_group = { + .attrs = tmpfs_attributes, + .name = "features" +}; + +static struct kobject *tmpfs_kobj; + +static int __init tmpfs_sysfs_init(void) +{ + int ret; + + tmpfs_kobj = kobject_create_and_add("tmpfs", fs_kobj); + if (!tmpfs_kobj) + return -ENOMEM; + + ret = sysfs_create_group(tmpfs_kobj, &tmpfs_attribute_group); + if (ret) + kobject_put(tmpfs_kobj); + + return ret; +} + +fs_initcall(tmpfs_sysfs_init); +#endif /* CONFIG_SYSFS && CONFIG_TMPFS */ From patchwork Fri Aug 23 17:33:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andr=C3=A9_Almeida?= X-Patchwork-Id: 13775617 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id AAE1AC5321D for ; Fri, 23 Aug 2024 17:34:08 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8E940800BB; Fri, 23 Aug 2024 13:34:05 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7FBAB800B4; Fri, 23 Aug 2024 13:34:05 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3B5FE800BB; Fri, 23 Aug 2024 13:34:05 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 14226800B4 for ; Fri, 23 Aug 2024 13:34:05 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id BA7AF819E7 for ; Fri, 23 Aug 2024 17:34:04 +0000 (UTC) X-FDA: 82484208408.09.778CE40 Received: from fanzine2.igalia.com (fanzine.igalia.com [178.60.130.6]) by imf22.hostedemail.com (Postfix) with ESMTP id 10562C0016 for ; Fri, 23 Aug 2024 17:34:02 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=igalia.com header.s=20170329 header.b="e8//f4fU"; spf=pass (imf22.hostedemail.com: domain of andrealmeid@igalia.com designates 178.60.130.6 as permitted sender) smtp.mailfrom=andrealmeid@igalia.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1724434360; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=2uckVKN0pdzCghR0p6/g82d2/8anRVmY8PvlKYt2nuo=; b=RG97TNPZ+HSw/HIPjHdPicYDnnKVf9YRqI/O/AkcPmVfvoLC0A3nzRx00ESel1bqRwJ960 sYNdkJzb4CleYwnvYeFBn5tNgsVZ4Yxy4Aeqc1+TGx9O+eqRr6yOWLZLmTfzZ+e+NcNsAR aPFMQiP0p0naGMZayJXIMUYTQ+l1uvY= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1724434360; a=rsa-sha256; cv=none; b=P7wutKne7dm7thaMLCmbG4IJqEerJH72HZgMC0pDZX/qyCmXTWmaKjmhVs3cyTvxOoa/6Z HM/9ssvN9CQLdZn/nJSDkr8ggoFcT51GzyiFnPx94Di2zRJ9sjBbrphOV1Mmh03Tyr+WCp bu+gVmcLHv93fLuUj4T2n4C1ouurlts= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=igalia.com header.s=20170329 header.b="e8//f4fU"; spf=pass (imf22.hostedemail.com: domain of andrealmeid@igalia.com designates 178.60.130.6 as permitted sender) smtp.mailfrom=andrealmeid@igalia.com; dmarc=none DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=2uckVKN0pdzCghR0p6/g82d2/8anRVmY8PvlKYt2nuo=; b=e8//f4fU6MKCA9/tuu/dsGqQQ3 10S/BJHzanaeCer9+DrWQVreL3F7xlH9HYJd0vxHwUaIRtL/OucvWMqQwlqWVqrCvj3VSIUVSlitE UbhWC8PtfsjPdD39u5eU6XrL+u0fb99yGwGCoVh01Uf1P2QOX/PSQ2OZfivbUlOBF+vgNq+pe3TD4 MSoXXhtt7JjGQd4gTbRCq+hDgqxXWCqY21pgTTEKwILl5CDL2g38xAca75f4hbuj2TOcKjXvKnnzV LLezTv2tJ49sZBQKp2/u0m6i+E8bKg2Avu4NtztNs8tb1rnOLjECeS6kcvVsXYCS07oBAweVfjgOe 2iDDM1Qw==; Received: from [179.118.186.198] (helo=localhost.localdomain) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1shYAe-0048Ww-Fj; Fri, 23 Aug 2024 19:33:56 +0200 From: =?utf-8?q?Andr=C3=A9_Almeida?= To: Hugh Dickins , Andrew Morton , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, kernel-dev@igalia.com, krisman@kernel.org, Daniel Rosenberg , smcv@collabora.com, =?utf-8?q?Andr?= =?utf-8?q?=C3=A9_Almeida?= Subject: [PATCH 5/5] docs: tmpfs: Add casefold options Date: Fri, 23 Aug 2024 14:33:32 -0300 Message-ID: <20240823173332.281211-6-andrealmeid@igalia.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240823173332.281211-1-andrealmeid@igalia.com> References: <20240823173332.281211-1-andrealmeid@igalia.com> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 10562C0016 X-Stat-Signature: 66a14s4e9ibsenkqusafnsfn1x8kg6et X-HE-Tag: 1724434442-140476 X-HE-Meta: U2FsdGVkX1+meOtVebcZ0bbBhydDKu0zwCOLyDUTI+wcAoHIua75vk+2YG3YQ3IH934+rN/NHar4ck/3yW6WATQtTa8ai/vlh7+5jfk7OWmsJKZKVyHy8strsMdFtylzoB8QOtoaPNugksYVGlw8Ht71azwaSthJnISAthpUk7Sw0dEA3wdn4PtcsWJY7pcxTnYJtDRyQxR7QO/Roo06G8SUo6oMbvB3rJzVHqDN5BB2FrW2yoTPDZAk7WvPCbc9QVCjYz08m1GNbKILweJ0JR2TbYX/fEsbfTrIoxJLsk+VjYHzb0WfzUjg4pnGXBovEOx/gayHeo1B1A96TmFNXNRRJoQ7OxUvKrdVI7XdTrI5D2E4qqedHum6J2/LP1WAa64PgmwT6vvo/sGo1mTOBqULGFZKuwv2y5riehtkDj+CLgUZCnnGoAf+TZoa6Hn7w/ygiiDE9TsCV0uVd9T0mN4IVhikABZp6wp53BTclVU2vE1VtWIFOYer3BOP++vPcovv1jZ9i3+F4VT7xvUbWIqNyv56zTrqOuEnv/pjr4AXFJL+kF+RfAPBTnRS4bmbM582dY2Q/ji5FhEABdAnw8bDB/64MOsx6xPI2n6wNGVQilHqbP8mm0MvVkd8ADiAf0OYQe6tqxYWuJiSdal/52ngmq20wTQbNxovdLeRcH2KE89Mq1MxY5lpXW+096N3Giol1dhigXN/kGAt4oFtCIug1eLlIbu1NGt9RVnfoa7FhSg2wtLgkgoKn/Ig3J30ASypsEogVnRUEz28A/3bSW5YY35Hd3auuJoe8ph2Ttk2tewVc4ppgju88tBaoDg57zDVkSqVMAX9SHNa9FugrfUM1EtbKQn/DKvPazjogLTLUOtACSmCUcPE92jSfmwUlOPtP3Ur+z07yvsjGtkzBcYuXiW2xmJedv7AEKtgxoUD1DPYs3Ast6HtVUVOosagm64lZsD01kmmjiqFVFZ f5pw3brt fp4E/dmQKMPwwLuE11XU03SjAyAqe5k459eBny/8DUj6ay28UGaPj6y4RyqnpG/8fJILjhUo8YUGc5Ql90lo7D6Ue1p9NEPdxAeBhW7/TJ9anFQA2vqfbr18joxBjGotURAVx6Mwvdu4ovGjSnJk0ZQ014n7Ho7FEsHHUQTYlK+E3STo+7DtkxH39fCCDlgpgG0Zgn2jdwcu4N04a6p3IVYbn12kAxzO3mmA5Wb6WK5LQQ4iDLZs6UOGFg4kHjKFroBWoJq8xMD8THlrk9BH/RVRCl71HK9DMYKESpqe/+WcDlH6ETw70KmbQ0w== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Document mounting options for casefold support in tmpfs. Signed-off-by: André Almeida --- Documentation/filesystems/tmpfs.rst | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Documentation/filesystems/tmpfs.rst b/Documentation/filesystems/tmpfs.rst index 56a26c843dbe..ce24fb16979a 100644 --- a/Documentation/filesystems/tmpfs.rst +++ b/Documentation/filesystems/tmpfs.rst @@ -241,6 +241,41 @@ So 'mount -t tmpfs -o size=10G,nr_inodes=10k,mode=700 tmpfs /mytmpfs' will give you tmpfs instance on /mytmpfs which can allocate 10GB RAM/SWAP in 10240 inodes and it is only accessible by root. +tmpfs has the following mounting options for case-insesitive lookups support: + +================= ============================================================== +casefold Enable casefold support at this mount point using the given + argument as the encoding standard. Currently only utf8 + encodings are supported. +strict_encoding Enable strict encoding at this mount point (disabled by + default). This means that invalid sequences will be rejected + by the file system. +================= ============================================================== + +Note that this option doesn't enable casefold by default; one needs to set +casefold flag per directory, setting the +F attribute in an empty directory. New +directories within a casefolded one will inherit the flag. + +Example:: + + $ mount -t tmpfs -o casefold=utf8-12.1.0,cf_strict fs_name /mytmpfs + $ cd /mytmpfs # case-sensitive by default + $ touch a; touch A + $ ls + A a + $ mkdir B + $ cd b + cd: The directory 'b' does not exist + $ mkdir casefold_dir + $ chattr +F casefold_dir/ # marking it as case-insensitive + $ cd + $ touch dir/a; touch dir/A + $ ls dir + a + $ mkdir B + $ cd b + $ pwd + /home/user/mytmpfs/casefold_dir/B :Author: Christoph Rohland , 1.12.01 @@ -250,3 +285,5 @@ RAM/SWAP in 10240 inodes and it is only accessible by root. KOSAKI Motohiro, 16 Mar 2010 :Updated: Chris Down, 13 July 2020 +:Updated: + André Almeida, 23 Aug 2024