summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorngkaho1234 <ngkaho1234@gmail.com>2015-11-05 09:41:01 +0000
committerngkaho1234 <ngkaho1234@gmail.com>2015-11-05 13:03:29 +0000
commitf4737bfd38c5a2bd7d1cd8da7f1a6e9cd2680b2a (patch)
tree52b2a0e5ab3a4f53c35a6d814f560f2de432be75
parent08dc4abdfdb49ad8a92d2eafed1adccc206abfe5 (diff)
EA: ea entries with name "system.data" should be
preferentially stored in inode body.
-rw-r--r--lwext4/ext4_types.h3
-rw-r--r--lwext4/ext4_xattr.c15
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);
}