Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit babbb40f authored by Daniel Rosenberg's avatar Daniel Rosenberg
Browse files

FROMLIST: f2fs: Use generic casefolding support



This switches f2fs over to the generic support provided in
commit 65832afbeaaf ("fs: Add standard casefolding support")

Signed-off-by: default avatarDaniel Rosenberg <drosen@google.com>
Test: Boots, /data/media is case insensitive
Bug: 138322712
Link: https://lore.kernel.org/linux-f2fs-devel/20200208013552.241832-1-drosen@google.com/T/#t
Change-Id: Ib2aecfdf029a53d116929bf6c0fc4802585f4383
parent 6e29e14f
Loading
Loading
Loading
Loading
+10 −53
Original line number Original line Diff line number Diff line
@@ -114,8 +114,8 @@ static struct f2fs_dir_entry *find_in_block(struct inode *dir,
int f2fs_ci_compare(const struct inode *parent, const struct qstr *name,
int f2fs_ci_compare(const struct inode *parent, const struct qstr *name,
				const struct qstr *entry, bool quick)
				const struct qstr *entry, bool quick)
{
{
	const struct f2fs_sb_info *sbi = F2FS_SB(parent->i_sb);
	const struct super_block *sb = parent->i_sb;
	const struct unicode_map *um = sbi->s_encoding;
	const struct unicode_map *um = sb->s_encoding;
	int ret;
	int ret;


	if (quick)
	if (quick)
@@ -127,7 +127,7 @@ int f2fs_ci_compare(const struct inode *parent, const struct qstr *name,
		/* Handle invalid character sequence as either an error
		/* Handle invalid character sequence as either an error
		 * or as an opaque byte sequence.
		 * or as an opaque byte sequence.
		 */
		 */
		if (f2fs_has_strict_mode(sbi))
		if (sb_has_enc_strict_mode(sb))
			return -EINVAL;
			return -EINVAL;


		if (name->len != entry->len)
		if (name->len != entry->len)
@@ -154,7 +154,7 @@ static void f2fs_fname_setup_ci_filename(struct inode *dir,
	if (!cf_name->name)
	if (!cf_name->name)
		return;
		return;


	cf_name->len = utf8_casefold(sbi->s_encoding,
	cf_name->len = utf8_casefold(dir->i_sb->s_encoding,
					iname, cf_name->name,
					iname, cf_name->name,
					F2FS_NAME_LEN);
					F2FS_NAME_LEN);
	if ((int)cf_name->len <= 0) {
	if ((int)cf_name->len <= 0) {
@@ -173,7 +173,7 @@ static inline bool f2fs_match_name(struct f2fs_dentry_ptr *d,
{
{
#ifdef CONFIG_UNICODE
#ifdef CONFIG_UNICODE
	struct inode *parent = d->inode;
	struct inode *parent = d->inode;
	struct f2fs_sb_info *sbi = F2FS_I_SB(parent);
	struct super_block *sb = parent->i_sb;
	struct qstr entry;
	struct qstr entry;
#endif
#endif


@@ -184,7 +184,7 @@ static inline bool f2fs_match_name(struct f2fs_dentry_ptr *d,
	entry.name = d->filename[bit_pos];
	entry.name = d->filename[bit_pos];
	entry.len = de->name_len;
	entry.len = de->name_len;


	if (sbi->s_encoding && IS_CASEFOLDED(parent)) {
	if (sb->s_encoding && IS_CASEFOLDED(parent)) {
		if (cf_str->name) {
		if (cf_str->name) {
			struct qstr cf = {.name = cf_str->name,
			struct qstr cf = {.name = cf_str->name,
					  .len = cf_str->len};
					  .len = cf_str->len};
@@ -357,8 +357,8 @@ struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir,
	int err;
	int err;


#ifdef CONFIG_UNICODE
#ifdef CONFIG_UNICODE
	if (f2fs_has_strict_mode(F2FS_I_SB(dir)) && IS_CASEFOLDED(dir) &&
	if (sb_has_enc_strict_mode(dir->i_sb) && IS_CASEFOLDED(dir) &&
			utf8_validate(F2FS_I_SB(dir)->s_encoding, child)) {
			utf8_validate(dir->i_sb->s_encoding, child)) {
		*res_page = ERR_PTR(-EINVAL);
		*res_page = ERR_PTR(-EINVAL);
		return NULL;
		return NULL;
	}
	}
@@ -1079,51 +1079,8 @@ const struct file_operations f2fs_dir_operations = {
};
};


#ifdef CONFIG_UNICODE
#ifdef CONFIG_UNICODE
static int f2fs_d_compare(const struct dentry *dentry, unsigned int len,
			  const char *str, const struct qstr *name)
{
	struct qstr qstr = {.name = str, .len = len };
	const struct dentry *parent = READ_ONCE(dentry->d_parent);
	const struct inode *inode = READ_ONCE(parent->d_inode);

	if (!inode || !IS_CASEFOLDED(inode)) {
		if (len != name->len)
			return -1;
		return memcmp(str, name->name, len);
	}

	return f2fs_ci_compare(inode, name, &qstr, false);
}

static int f2fs_d_hash(const struct dentry *dentry, struct qstr *str)
{
	struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
	const struct unicode_map *um = sbi->s_encoding;
	const struct inode *inode = READ_ONCE(dentry->d_inode);
	unsigned char *norm;
	int len, ret = 0;

	if (!inode || !IS_CASEFOLDED(inode))
		return 0;

	norm = f2fs_kmalloc(sbi, PATH_MAX, GFP_ATOMIC);
	if (!norm)
		return -ENOMEM;

	len = utf8_casefold(um, str, norm, PATH_MAX);
	if (len < 0) {
		if (f2fs_has_strict_mode(sbi))
			ret = -EINVAL;
		goto out;
	}
	str->hash = full_name_hash(dentry, norm, len);
out:
	kvfree(norm);
	return ret;
}

const struct dentry_operations f2fs_dentry_ops = {
const struct dentry_operations f2fs_dentry_ops = {
	.d_hash = f2fs_d_hash,
	.d_hash = generic_ci_d_hash,
	.d_compare = f2fs_d_compare,
	.d_compare = generic_ci_d_compare,
};
};
#endif
#endif
+0 −4
Original line number Original line Diff line number Diff line
@@ -1287,10 +1287,6 @@ struct f2fs_sb_info {
	int valid_super_block;			/* valid super block no */
	int valid_super_block;			/* valid super block no */
	unsigned long s_flag;				/* flags for sbi */
	unsigned long s_flag;				/* flags for sbi */
	struct mutex writepages;		/* mutex for writepages() */
	struct mutex writepages;		/* mutex for writepages() */
#ifdef CONFIG_UNICODE
	struct unicode_map *s_encoding;
	__u16 s_encoding_flags;
#endif


#ifdef CONFIG_BLK_DEV_ZONED
#ifdef CONFIG_BLK_DEV_ZONED
	unsigned int blocks_per_blkz;		/* F2FS blocks per zone */
	unsigned int blocks_per_blkz;		/* F2FS blocks per zone */
+1 −1
Original line number Original line Diff line number Diff line
@@ -110,7 +110,7 @@ f2fs_hash_t f2fs_dentry_hash(const struct inode *dir,
{
{
#ifdef CONFIG_UNICODE
#ifdef CONFIG_UNICODE
	struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
	struct f2fs_sb_info *sbi = F2FS_SB(dir->i_sb);
	const struct unicode_map *um = sbi->s_encoding;
	const struct unicode_map *um = dir->i_sb->s_encoding;
	int r, dlen;
	int r, dlen;
	unsigned char *buff;
	unsigned char *buff;
	struct qstr folded;
	struct qstr folded;
+5 −5
Original line number Original line Diff line number Diff line
@@ -1230,7 +1230,7 @@ static void f2fs_put_super(struct super_block *sb)
	for (i = 0; i < NR_PAGE_TYPE; i++)
	for (i = 0; i < NR_PAGE_TYPE; i++)
		kvfree(sbi->write_io[i]);
		kvfree(sbi->write_io[i]);
#ifdef CONFIG_UNICODE
#ifdef CONFIG_UNICODE
	utf8_unload(sbi->s_encoding);
	utf8_unload(sb->s_encoding);
#endif
#endif
	kvfree(sbi);
	kvfree(sbi);
}
}
@@ -3293,7 +3293,7 @@ static int f2fs_scan_devices(struct f2fs_sb_info *sbi)
static int f2fs_setup_casefold(struct f2fs_sb_info *sbi)
static int f2fs_setup_casefold(struct f2fs_sb_info *sbi)
{
{
#ifdef CONFIG_UNICODE
#ifdef CONFIG_UNICODE
	if (f2fs_sb_has_casefold(sbi) && !sbi->s_encoding) {
	if (f2fs_sb_has_casefold(sbi) && !sbi->sb->s_encoding) {
		const struct f2fs_sb_encodings *encoding_info;
		const struct f2fs_sb_encodings *encoding_info;
		struct unicode_map *encoding;
		struct unicode_map *encoding;
		__u16 encoding_flags;
		__u16 encoding_flags;
@@ -3324,8 +3324,8 @@ static int f2fs_setup_casefold(struct f2fs_sb_info *sbi)
			 "%s-%s with flags 0x%hx", encoding_info->name,
			 "%s-%s with flags 0x%hx", encoding_info->name,
			 encoding_info->version?:"\b", encoding_flags);
			 encoding_info->version?:"\b", encoding_flags);


		sbi->s_encoding = encoding;
		sbi->sb->s_encoding = encoding;
		sbi->s_encoding_flags = encoding_flags;
		sbi->sb->s_encoding_flags = encoding_flags;
		sbi->sb->s_d_op = &f2fs_dentry_ops;
		sbi->sb->s_d_op = &f2fs_dentry_ops;
	}
	}
#else
#else
@@ -3801,7 +3801,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
		kvfree(sbi->write_io[i]);
		kvfree(sbi->write_io[i]);


#ifdef CONFIG_UNICODE
#ifdef CONFIG_UNICODE
	utf8_unload(sbi->s_encoding);
	utf8_unload(sb->s_encoding);
#endif
#endif
free_options:
free_options:
#ifdef CONFIG_QUOTA
#ifdef CONFIG_QUOTA
+6 −4
Original line number Original line Diff line number Diff line
@@ -175,12 +175,14 @@ static ssize_t encoding_show(struct f2fs_attr *a,
		struct f2fs_sb_info *sbi, char *buf)
		struct f2fs_sb_info *sbi, char *buf)
{
{
#ifdef CONFIG_UNICODE
#ifdef CONFIG_UNICODE
	struct super_block *sb = sbi->sb;

	if (f2fs_sb_has_casefold(sbi))
	if (f2fs_sb_has_casefold(sbi))
		return snprintf(buf, PAGE_SIZE, "%s (%d.%d.%d)\n",
		return snprintf(buf, PAGE_SIZE, "%s (%d.%d.%d)\n",
			sbi->s_encoding->charset,
			sb->s_encoding->charset,
			(sbi->s_encoding->version >> 16) & 0xff,
			(sb->s_encoding->version >> 16) & 0xff,
			(sbi->s_encoding->version >> 8) & 0xff,
			(sb->s_encoding->version >> 8) & 0xff,
			sbi->s_encoding->version & 0xff);
			sb->s_encoding->version & 0xff);
#endif
#endif
	return sprintf(buf, "(none)");
	return sprintf(buf, "(none)");
}
}
Loading