From: Daniel Rosenberg via Linux-f2fs-devel <linux-f2fs-devel@lists.sourceforge.net> To: "Theodore Ts'o" <tytso@mit.edu>, linux-ext4@vger.kernel.org, Jaegeuk Kim <jaegeuk@kernel.org>, Chao Yu <chao@kernel.org>, linux-f2fs-devel@lists.sourceforge.net, Eric Biggers <ebiggers@kernel.org>, linux-fscrypt@vger.kernel.org, Alexander Viro <viro@zeniv.linux.org.uk>, Richard Weinberger <richard@nod.at> Cc: Daniel Rosenberg <drosen@google.com>, linux-doc@vger.kernel.org, kernel-team@android.com, Jonathan Corbet <corbet@lwn.net>, linux-kernel@vger.kernel.org, Andreas Dilger <adilger.kernel@dilger.ca>, linux-fsdevel@vger.kernel.org, linux-mtd@lists.infradead.org, Gabriel Krisman Bertazi <krisman@collabora.com> Subject: [f2fs-dev] [PATCH v7 2/8] fs: Add standard casefolding support Date: Fri, 7 Feb 2020 17:35:46 -0800 Message-ID: <20200208013552.241832-3-drosen@google.com> (raw) In-Reply-To: <20200208013552.241832-1-drosen@google.com> This adds general supporting functions for filesystems that use utf8 casefolding. It provides standard dentry_operations and adds the necessary structures in struct super_block to allow this standardization. Ext4 and F2fs are switch to these implementations. Signed-off-by: Daniel Rosenberg <drosen@google.com> --- fs/libfs.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++ include/linux/fs.h | 22 +++++++++++++ 2 files changed, 99 insertions(+) diff --git a/fs/libfs.c b/fs/libfs.c index c686bd9caac67..433c283df3099 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -20,6 +20,9 @@ #include <linux/fs_context.h> #include <linux/pseudo_fs.h> #include <linux/fsnotify.h> +#include <linux/unicode.h> +#include <linux/fscrypt.h> +#include <linux/stringhash.h> #include <linux/uaccess.h> @@ -1361,3 +1364,77 @@ bool is_empty_dir_inode(struct inode *inode) return (inode->i_fop == &empty_dir_operations) && (inode->i_op == &empty_dir_inode_operations); } + +#ifdef CONFIG_UNICODE +bool needs_casefold(const struct inode *dir) +{ + return IS_CASEFOLDED(dir) && dir->i_sb->s_encoding && + (!IS_ENCRYPTED(dir) || fscrypt_has_encryption_key(dir)); +} +EXPORT_SYMBOL(needs_casefold); + +int generic_ci_d_compare(const struct dentry *dentry, unsigned int len, + const char *str, const struct qstr *name) +{ + const struct dentry *parent = READ_ONCE(dentry->d_parent); + const struct inode *inode = READ_ONCE(parent->d_inode); + const struct super_block *sb = dentry->d_sb; + const struct unicode_map *um = sb->s_encoding; + struct qstr entry = QSTR_INIT(str, len); + int ret; + + if (!inode || !needs_casefold(inode)) + goto fallback; + + ret = utf8_strncasecmp(um, name, &entry); + if (ret >= 0) + return ret; + + if (sb_has_enc_strict_mode(sb)) + return -EINVAL; +fallback: + if (len != name->len) + return 1; + return !!memcmp(str, name->name, len); +} +EXPORT_SYMBOL(generic_ci_d_compare); + +struct hash_ctx { + struct utf8_itr_context ctx; + unsigned long hash; +}; + +static int do_generic_ci_hash(struct utf8_itr_context *ctx, int byte, int pos) +{ + struct hash_ctx *hctx = container_of(ctx, struct hash_ctx, ctx); + + hctx->hash = partial_name_hash((unsigned char)byte, hctx->hash); + return 0; +} + +int generic_ci_d_hash(const struct dentry *dentry, struct qstr *str) +{ + const struct inode *inode = READ_ONCE(dentry->d_inode); + struct super_block *sb = dentry->d_sb; + const struct unicode_map *um = sb->s_encoding; + int ret = 0; + struct hash_ctx hctx; + + if (!inode || !needs_casefold(inode)) + return 0; + + hctx.hash = init_name_hash(dentry); + hctx.ctx.actor = do_generic_ci_hash; + ret = utf8_casefold_iter(um, str, &hctx.ctx); + if (ret < 0) + goto err; + str->hash = end_name_hash(hctx.hash); + + return 0; +err: + if (sb_has_enc_strict_mode(sb)) + ret = -EINVAL; + return ret; +} +EXPORT_SYMBOL(generic_ci_d_hash); +#endif diff --git a/include/linux/fs.h b/include/linux/fs.h index 6eae91c0668f9..a260afbc06d22 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1382,6 +1382,12 @@ extern int send_sigurg(struct fown_struct *fown); #define SB_ACTIVE (1<<30) #define SB_NOUSER (1<<31) +/* These flags relate to encoding and casefolding */ +#define SB_ENC_STRICT_MODE_FL (1 << 0) + +#define sb_has_enc_strict_mode(sb) \ + (sb->s_encoding_flags & SB_ENC_STRICT_MODE_FL) + /* * Umount options */ @@ -1449,6 +1455,10 @@ struct super_block { #endif #ifdef CONFIG_FS_VERITY const struct fsverity_operations *s_vop; +#endif +#ifdef CONFIG_UNICODE + struct unicode_map *s_encoding; + __u16 s_encoding_flags; #endif struct hlist_bl_head s_roots; /* alternate root dentries for NFS */ struct list_head s_mounts; /* list of mounts; _not_ for fs use */ @@ -3361,6 +3371,18 @@ extern int generic_file_fsync(struct file *, loff_t, loff_t, int); extern int generic_check_addressable(unsigned, u64); +#ifdef CONFIG_UNICODE +extern int generic_ci_d_hash(const struct dentry *dentry, struct qstr *str); +extern int generic_ci_d_compare(const struct dentry *dentry, unsigned int len, + const char *str, const struct qstr *name); +extern bool needs_casefold(const struct inode *dir); +#else +static inline bool needs_casefold(const struct inode *dir) +{ + return 0; +} +#endif + #ifdef CONFIG_MIGRATION extern int buffer_migrate_page(struct address_space *, struct page *, struct page *, -- 2.25.0.341.g760bfbb309-goog _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
next prev parent reply index Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-02-08 1:35 [f2fs-dev] [PATCH v7 0/8] Support fof Casefolding and Encryption Daniel Rosenberg via Linux-f2fs-devel 2020-02-08 1:35 ` [f2fs-dev] [PATCH v7 1/8] unicode: Add utf8_casefold_iter Daniel Rosenberg via Linux-f2fs-devel 2020-02-12 3:38 ` Eric Biggers 2020-02-14 21:47 ` Daniel Rosenberg via Linux-f2fs-devel 2020-02-17 19:02 ` Gabriel Krisman Bertazi 2020-02-08 1:35 ` Daniel Rosenberg via Linux-f2fs-devel [this message] 2020-02-08 2:12 ` [f2fs-dev] [PATCH v7 2/8] fs: Add standard casefolding support Al Viro 2020-02-10 23:11 ` Daniel Rosenberg via Linux-f2fs-devel 2020-02-10 23:42 ` Al Viro 2020-02-12 6:34 ` Eric Biggers 2020-02-12 6:57 ` Eric Biggers 2020-02-20 2:27 ` Daniel Rosenberg via Linux-f2fs-devel 2020-02-12 3:55 ` Eric Biggers 2020-02-08 1:35 ` [f2fs-dev] [PATCH v7 3/8] f2fs: Use generic " Daniel Rosenberg via Linux-f2fs-devel 2020-02-12 4:05 ` Eric Biggers 2020-02-08 1:35 ` [f2fs-dev] [PATCH v7 4/8] ext4: " Daniel Rosenberg via Linux-f2fs-devel 2020-02-08 1:35 ` [f2fs-dev] [PATCH v7 5/8] fscrypt: Have filesystems handle their d_ops Daniel Rosenberg via Linux-f2fs-devel 2020-02-12 4:33 ` Eric Biggers 2020-02-08 1:35 ` [f2fs-dev] [PATCH v7 6/8] f2fs: Handle casefolding with Encryption Daniel Rosenberg via Linux-f2fs-devel 2020-02-12 5:10 ` Eric Biggers 2020-02-12 5:55 ` Al Viro 2020-02-12 6:06 ` Eric Biggers 2020-02-12 5:47 ` Eric Biggers 2020-02-08 1:35 ` [f2fs-dev] [PATCH v7 7/8] ext4: Hande casefolding with encryption Daniel Rosenberg via Linux-f2fs-devel 2020-02-12 5:59 ` Eric Biggers 2020-02-08 1:35 ` [f2fs-dev] [PATCH v7 8/8] ext4: Optimize match for casefolded encrypted dirs Daniel Rosenberg via Linux-f2fs-devel 2020-02-12 6:12 ` [f2fs-dev] [PATCH v7 0/8] Support fof Casefolding and Encryption Eric Biggers 2020-02-13 0:01 ` Daniel Rosenberg via Linux-f2fs-devel
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200208013552.241832-3-drosen@google.com \ --to=linux-f2fs-devel@lists.sourceforge.net \ --cc=adilger.kernel@dilger.ca \ --cc=chao@kernel.org \ --cc=corbet@lwn.net \ --cc=drosen@google.com \ --cc=ebiggers@kernel.org \ --cc=jaegeuk@kernel.org \ --cc=kernel-team@android.com \ --cc=krisman@collabora.com \ --cc=linux-doc@vger.kernel.org \ --cc=linux-ext4@vger.kernel.org \ --cc=linux-fscrypt@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mtd@lists.infradead.org \ --cc=richard@nod.at \ --cc=tytso@mit.edu \ --cc=viro@zeniv.linux.org.uk \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Linux-f2fs-devel Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-f2fs-devel/0 linux-f2fs-devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-f2fs-devel linux-f2fs-devel/ https://lore.kernel.org/linux-f2fs-devel \ linux-f2fs-devel@lists.sourceforge.net public-inbox-index linux-f2fs-devel Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/net.sourceforge.lists.linux-f2fs-devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git