header->h_hash = to_le32(hash);
}
+#if CONFIG_META_CSUM_ENABLE
static uint32_t
ext4_xattr_block_checksum(struct ext4_inode_ref *inode_ref,
ext4_fsblk_t blocknr,
uint64_t le64_blocknr = blocknr;
struct ext4_sblock *sb = &inode_ref->fs->sb;
- if (ext4_sb_has_feature_read_only(sb,
- EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) {
- uint32_t orig_checksum, checksum;
+ if (ext4_sb_feature_ro_com(sb, EXT4_FRO_COM_METADATA_CSUM)) {
+ uint32_t orig_checksum;
/* Preparation: temporarily set bg checksum to 0 */
orig_checksum = header->h_checksum;
header->h_checksum = 0;
/* First calculate crc32 checksum against fs uuid */
- checksum = ext4_crc32c(~0, sb->uuid, sizeof(sb->uuid));
+ checksum = ext4_crc32c(EXT4_CRC32_INIT, sb->uuid,
+ sizeof(sb->uuid));
/* Then calculate crc32 checksum block number */
checksum = ext4_crc32c(checksum, &le64_blocknr,
sizeof(le64_blocknr));
}
return checksum;
}
+#else
+#define ext4_xattr_block_checksum(...) 0
+#endif
static void
ext4_xattr_set_block_checksum(struct ext4_inode_ref *inode_ref,
- ext4_fsblk_t blocknr,
+ ext4_fsblk_t blocknr __unused,
struct ext4_xattr_header *header)
{
struct ext4_sblock *sb = &inode_ref->fs->sb;
- if (!ext4_sb_has_feature_read_only(sb,
- EXT4_FEATURE_RO_COMPAT_METADATA_CSUM))
+ if (!ext4_sb_feature_ro_com(sb, EXT4_FRO_COM_METADATA_CSUM))
return;
header->h_checksum =
struct ext4_xattr_item *b)
{
int result;
+ if (a->in_inode && !b->in_inode)
+ return -1;
+
+ if (!a->in_inode && b->in_inode)
+ return 1;
+
result = a->name_index - b->name_index;
if (result)
return result;
memset(&item->node, 0, sizeof(item->node));
memcpy(item->name, name, name_len);
+ if (name_index == EXT4_XATTR_INDEX_SYSTEM &&
+ name_len == 4 &&
+ !memcmp(name, "data", 4))
+ item->in_inode = true;
+ else
+ item->in_inode = false;
+
return item;
}
.name = (char *)name, /*RB_FIND - won't touch this string*/
.name_len = name_len,
};
+ if (name_index == EXT4_XATTR_INDEX_SYSTEM &&
+ name_len == 4 &&
+ !memcmp(name, "data", 4))
+ tmp.in_inode = true;
return RB_FIND(ext4_xattr_tree, &xattr_ref->root, &tmp);
}
block_data = (char *)block_header + block_size_rem;
block_size_rem -= sizeof(struct ext4_xattr_header);
- xattr_ref->block.dirty = true;
+ ext4_bcache_set_dirty(xattr_ref->block.buf);
} else {
/* We don't need an extra block.*/
if (xattr_ref->block_loaded) {
&xattr_ref->fs->sb, 0);
xattr_ref->inode_ref->dirty = true;
- xattr_ref->block.dirty = true;
+ ext4_bcache_set_dirty(xattr_ref->block.buf);
}
}
}
ext4_xattr_set_block_checksum(xattr_ref->inode_ref,
xattr_ref->block.lb_id,
block_header);
- xattr_ref->block.dirty = true;
+ ext4_bcache_set_dirty(xattr_ref->block.buf);
}
Finish:
static const struct xattr_prefix prefix_tbl[] = {
{"user.", EXT4_XATTR_INDEX_USER},
- {"system.", EXT4_XATTR_INDEX_SYSTEM},
{"system.posix_acl_access", EXT4_XATTR_INDEX_POSIX_ACL_ACCESS},
{"system.posix_acl_default", EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT},
+ {"trusted.", EXT4_XATTR_INDEX_TRUSTED},
+ {"security.", EXT4_XATTR_INDEX_SECURITY},
+ {"system.", EXT4_XATTR_INDEX_SYSTEM},
+ {"system.richacl", EXT4_XATTR_INDEX_RICHACL},
{NULL, 0},
};