shithub: lwext4

Download patch

ref: f4737bfd38c5a2bd7d1cd8da7f1a6e9cd2680b2a
parent: 08dc4abdfdb49ad8a92d2eafed1adccc206abfe5
author: ngkaho1234 <ngkaho1234@gmail.com>
date: Thu Nov 5 04:41:01 EST 2015

EA: ea entries with name "system.data" should be
    preferentially stored in inode body.

--- a/lwext4/ext4_types.h
+++ b/lwext4/ext4_types.h
@@ -823,6 +823,9 @@
 } __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;
--- a/lwext4/ext4_xattr.c
+++ b/lwext4/ext4_xattr.c
@@ -163,6 +163,12 @@
 			       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 @@
 	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 @@
 		.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);
 }