diff options
| author | ngkaho1234 <ngkaho1234@gmail.com> | 2015-11-05 09:41:01 +0000 |
|---|---|---|
| committer | ngkaho1234 <ngkaho1234@gmail.com> | 2015-11-05 13:03:29 +0000 |
| commit | f4737bfd38c5a2bd7d1cd8da7f1a6e9cd2680b2a (patch) | |
| tree | 52b2a0e5ab3a4f53c35a6d814f560f2de432be75 | |
| parent | 08dc4abdfdb49ad8a92d2eafed1adccc206abfe5 (diff) | |
EA: ea entries with name "system.data" should be
preferentially stored in inode body.
| -rw-r--r-- | lwext4/ext4_types.h | 3 | ||||
| -rw-r--r-- | lwext4/ext4_xattr.c | 15 |
2 files changed, 18 insertions, 0 deletions
diff --git a/lwext4/ext4_types.h b/lwext4/ext4_types.h index 93ab650..2018123 100644 --- a/lwext4/ext4_types.h +++ b/lwext4/ext4_types.h @@ -823,6 +823,9 @@ struct ext4_xattr_entry { } __attribute__((packed)); struct ext4_xattr_item { + /* This attribute should be stored in inode body */ + bool in_inode; + uint8_t name_index; char *name; size_t name_len; diff --git a/lwext4/ext4_xattr.c b/lwext4/ext4_xattr.c index d50f5cd..e4b1913 100644 --- a/lwext4/ext4_xattr.c +++ b/lwext4/ext4_xattr.c @@ -163,6 +163,12 @@ static int ext4_xattr_item_cmp(struct ext4_xattr_item *a, 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; @@ -194,6 +200,11 @@ ext4_xattr_item_alloc(uint8_t name_index, const char *name, size_t name_len) 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; + return item; } @@ -404,6 +415,10 @@ ext4_xattr_lookup_item(struct ext4_xattr_ref *xattr_ref, uint8_t name_index, .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); } |
