mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
erofs: fix long xattr name prefix placement
Currently, xattr name prefixes are forcibly placed into the packed
inode if the fragments feature is enabled, and users have no option
to put them in plain form directly on disk.
This is inflexible. First, as mentioned above, users should be able
to store unwrapped long xattr name prefixes unconditionally
(COMPAT_PLAIN_XATTR_PFX). Second, since we now have the new metabox
inode to store metadata, it should be used when available instead
of the packed inode.
Fixes: 414091322c
("erofs: implement metadata compression")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
This commit is contained in:
parent
181993bb0d
commit
1fcf686def
3 changed files with 16 additions and 6 deletions
|
@ -16,6 +16,8 @@
|
|||
#define EROFS_FEATURE_COMPAT_MTIME 0x00000002
|
||||
#define EROFS_FEATURE_COMPAT_XATTR_FILTER 0x00000004
|
||||
#define EROFS_FEATURE_COMPAT_SHARED_EA_IN_METABOX 0x00000008
|
||||
#define EROFS_FEATURE_COMPAT_PLAIN_XATTR_PFX 0x00000010
|
||||
|
||||
|
||||
/*
|
||||
* Any bits that aren't in EROFS_ALL_FEATURE_INCOMPAT should
|
||||
|
|
|
@ -234,6 +234,7 @@ EROFS_FEATURE_FUNCS(metabox, incompat, INCOMPAT_METABOX)
|
|||
EROFS_FEATURE_FUNCS(sb_chksum, compat, COMPAT_SB_CHKSUM)
|
||||
EROFS_FEATURE_FUNCS(xattr_filter, compat, COMPAT_XATTR_FILTER)
|
||||
EROFS_FEATURE_FUNCS(shared_ea_in_metabox, compat, COMPAT_SHARED_EA_IN_METABOX)
|
||||
EROFS_FEATURE_FUNCS(plain_xattr_pfx, compat, COMPAT_PLAIN_XATTR_PFX)
|
||||
|
||||
static inline u64 erofs_nid_to_ino64(struct erofs_sb_info *sbi, erofs_nid_t nid)
|
||||
{
|
||||
|
|
|
@ -482,6 +482,7 @@ int erofs_xattr_prefixes_init(struct super_block *sb)
|
|||
erofs_off_t pos = (erofs_off_t)sbi->xattr_prefix_start << 2;
|
||||
struct erofs_xattr_prefix_item *pfs;
|
||||
int ret = 0, i, len;
|
||||
bool plain = erofs_sb_has_plain_xattr_pfx(sbi);
|
||||
|
||||
if (!sbi->xattr_prefix_count)
|
||||
return 0;
|
||||
|
@ -490,9 +491,15 @@ int erofs_xattr_prefixes_init(struct super_block *sb)
|
|||
if (!pfs)
|
||||
return -ENOMEM;
|
||||
|
||||
if (sbi->packed_inode)
|
||||
if (!plain) {
|
||||
if (erofs_sb_has_metabox(sbi))
|
||||
(void)erofs_init_metabuf(&buf, sb, true);
|
||||
else if (sbi->packed_inode)
|
||||
buf.mapping = sbi->packed_inode->i_mapping;
|
||||
else
|
||||
plain = true;
|
||||
}
|
||||
if (plain)
|
||||
(void)erofs_init_metabuf(&buf, sb, false);
|
||||
|
||||
for (i = 0; i < sbi->xattr_prefix_count; i++) {
|
||||
|
|
Loading…
Add table
Reference in a new issue