Unverified Commit c4a09bd5 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!4061 ext4: synchronize the casefold bugfix from the mainline

Merge Pull Request from: @ci-robot 
 
PR sync from: Baokun Li <libaokun1@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/2GFI2CFTV6PING3BXPNMEU6NT5RQ5GBS/ 
Eric Biggers (1):
  ext4: reject casefold inode flag without casefold feature

Theodore Ts'o (1):
  ext4: improve error handling from ext4_dirhash()


-- 
2.31.1
 
https://gitee.com/openeuler/kernel/issues/I8WZXW 
 
Link:https://gitee.com/openeuler/kernel/pulls/4061

 

Reviewed-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents e8011b70 36aa395e
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -261,7 +261,10 @@ static int __ext4fs_dirhash(const char *name, int len,
		break;
	default:
		hinfo->hash = 0;
		return -1;
		hinfo->minor_hash = 0;
		pr_warn("invalid/unsupported hash tree version %u",
			hinfo->hash_version);
		return -EINVAL;
	}
	hash = hash & ~1;
	if (hash == (EXT4_HTREE_EOF_32BIT << 1))
+4 −1
Original line number Diff line number Diff line
@@ -5083,9 +5083,12 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
				 "iget: bogus i_mode (%o)", inode->i_mode);
		goto bad_inode;
	}
	if (IS_CASEFOLDED(inode) && !ext4_has_feature_casefold(inode->i_sb))
	if (IS_CASEFOLDED(inode) && !ext4_has_feature_casefold(inode->i_sb)) {
		ext4_error_inode(inode, function, line, 0,
				 "casefold flag without casefold feature");
		ret = -EFSCORRUPTED;
		goto bad_inode;
	}
	if (is_bad_inode(inode) && !(flags & EXT4_IGET_BAD)) {
		ext4_error_inode(inode, function, line, 0,
				 "bad inode without EXT4_IGET_BAD flag");
+31 −9
Original line number Diff line number Diff line
@@ -681,7 +681,7 @@ static struct stats dx_show_leaf(struct inode *dir,
				}
				if (!fscrypt_has_encryption_key(dir)) {
					/* Directory is not encrypted */
					ext4fs_dirhash(dir, de->name,
					(void) ext4fs_dirhash(dir, de->name,
						de->name_len, &h);
					printk("%*.s:(U)%x.%u ", len,
					       name, h.hash,
@@ -713,7 +713,8 @@ static struct stats dx_show_leaf(struct inode *dir,
						name = fname_crypto_str.name;
						len = fname_crypto_str.len;
					}
					ext4fs_dirhash(dir, de->name,
					(void) ext4fs_dirhash(dir,
							de->name,
							de->name_len, &h);
					printk("%*.s:(E)%x.%u ", len, name,
					       h.hash, (unsigned) ((char *) de
@@ -724,7 +725,8 @@ static struct stats dx_show_leaf(struct inode *dir,
#else
				int len = de->name_len;
				char *name = de->name;
				ext4fs_dirhash(dir, de->name, de->name_len, &h);
				(void) ext4fs_dirhash(dir, de->name,
						      de->name_len, &h);
				printk("%*.s:%x.%u ", len, name, h.hash,
				       (unsigned) ((char *) de - base));
#endif
@@ -814,8 +816,14 @@ dx_probe(struct ext4_filename *fname, struct inode *dir,
	if (hinfo->hash_version <= DX_HASH_TEA)
		hinfo->hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned;
	hinfo->seed = EXT4_SB(dir->i_sb)->s_hash_seed;
	if (fname && fname_name(fname))
		ext4fs_dirhash(dir, fname_name(fname), fname_len(fname), hinfo);
	if (fname && fname_name(fname)) {
		int ret = ext4fs_dirhash(dir, fname_name(fname),
					 fname_len(fname), hinfo);
		if (ret < 0) {
			ret_err = ERR_PTR(ret);
			goto fail;
		}
	}
	hash = hinfo->hash;

	if (root->info.unused_flags & 1) {
@@ -1077,7 +1085,12 @@ static int htree_dirblock_to_tree(struct file *dir_file,
			/* silently ignore the rest of the block */
			break;
		}
		ext4fs_dirhash(dir, de->name, de->name_len, hinfo);
		err = ext4fs_dirhash(dir, de->name,
				     de->name_len, hinfo);
		if (err < 0) {
			count = err;
			goto errout;
		}
		if ((hinfo->hash < start_hash) ||
		    ((hinfo->hash == start_hash) &&
		     (hinfo->minor_hash < start_minor_hash)))
@@ -1273,7 +1286,10 @@ static int dx_make_map(struct inode *dir, struct buffer_head *bh,
					 ((char *)de) - base))
			return -EFSCORRUPTED;
		if (de->name_len && de->inode) {
			ext4fs_dirhash(dir, de->name, de->name_len, &h);
			int err = ext4fs_dirhash(dir, de->name,
						 de->name_len, &h);
			if (err < 0)
				return err;
			map_tail--;
			map_tail->hash = h.hash;
			map_tail->offs = ((char *) de - base)>>2;
@@ -2195,7 +2211,13 @@ static int make_indexed_dir(handle_t *handle, struct ext4_filename *fname,
	if (fname->hinfo.hash_version <= DX_HASH_TEA)
		fname->hinfo.hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned;
	fname->hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed;
	ext4fs_dirhash(dir, fname_name(fname), fname_len(fname), &fname->hinfo);
	retval = ext4fs_dirhash(dir, fname_name(fname),
				fname_len(fname), &fname->hinfo);
	if (retval < 0) {
		brelse(bh2);
		brelse(bh);
		return retval;
	}

	memset(frames, 0, sizeof(frames));
	frame = frames;