From: Richard Purdie <richard.purdie@linuxfoundation.org>
To: openembedded-core <openembedded-core@lists.openembedded.org>
Subject: [PATCH] e2fsprogs: Fix multiple xattr handling
Date: Wed, 10 Feb 2016 18:25:59 +0000 [thread overview]
Message-ID: <1455128759.16142.180.camel@linuxfoundation.org> (raw)
There is an ordering issue when adding multiple xattr values to
an ext filesystem build using the -d option to mkfs. This patch
fixes that issue. Its been posted for discussion with the upstream
community.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
diff --git a/meta/recipes-devtools/e2fsprogs/e2fsprogs/xattr_ordering.patch b/meta/recipes-devtools/e2fsprogs/e2fsprogs/xattr_ordering.patch
new file mode 100644
index 0000000..a89b946
--- /dev/null
+++ b/meta/recipes-devtools/e2fsprogs/e2fsprogs/xattr_ordering.patch
@@ -0,0 +1,66 @@
+[Message sent to linux-ext4 on 2016/2/7]
+
+I'm using the -d option of mke2fs to construct a filesystem, I'm seeing
+that some xattrs are being corrupted. The filesystem builds with no
+errors but when mounted by the kernel, I see errors like "security.ima:
+No such attribute". The strace from such a failure is:
+
+mmap(NULL, 26258, PROT_READ, MAP_SHARED, 3, 0) = 0x7fdb36a8c000
+close(3) = 0
+getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=64*1024}) = 0
+lstat("mnt/foobar", {st_mode=S_IFREG|0755, st_size=1, ...}) = 0
+listxattr("mnt/foobar", NULL, 0) = 30
+listxattr("mnt/foobar", "security.SMACK64\0security.ima\0", 256) = 30
+getxattr("mnt/foobar", "security.SMACK64", 0x0, 0) = 1
+getxattr("mnt/foobar", "security.SMACK64", "_", 256) = 1
+fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 13), ...}) = 0
+mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdb36a8b000
+write(1, "# file: mnt/foobar\n", 19# file: mnt/foobar) = 19
+write(1, "security.SMACK64=\"_\"\n", 21security.SMACK64="_") = 21
+getxattr("mnt/foobar", "security.ima", 0x0, 0) = -1 ENODATA (No data available)
+write(2, "mnt/foobar: ", 12mnt/foobar: ) = 12
+write(2, "security.ima: No such attribute\n", 32security.ima: No such attribute) = 32= 32
+
+so the attribute is there but the kernel gives ENODATA when trying
+to read it.
+
+http://www.nongnu.org/ext2-doc/ext2.html#CONTRIB-EXTENDED-ATTRIBUTES co
+ntains the small snippet that " The entry descriptors are sorted by
+attribute name, so that two extended attribute blocks can be compared
+efficiently. ". It doesn't specify what kind of sort.
+
+Looking at ext2fs, there is some sorting code through the qsort call
+using attr_compare() but it doesn't match what the kernel is doing in
+ext4_xattr_find_entry().
+
+This patch fixes the problem.
+
+Upstream-Status: Submitted
+RP
+2016/2/7
+
+Index: git/lib/ext2fs/ext_attr.c
+===================================================================
+--- git.orig/lib/ext2fs/ext_attr.c
++++ git/lib/ext2fs/ext_attr.c
+@@ -258,6 +258,7 @@ static struct ea_name_index ea_names[] =
+ static int attr_compare(const void *a, const void *b)
+ {
+ const struct ext2_xattr *xa = a, *xb = b;
++ size_t len;
+
+ if (xa->name == NULL)
+ return +1;
+@@ -267,7 +268,11 @@ static int attr_compare(const void *a, c
+ return -1;
+ else if (!strcmp(xb->name, "system.data"))
+ return +1;
+- return 0;
++ len = strlen(xa->name) - strlen(xb->name);
++ if (len)
++ return len;
++
++ return strcmp(xa->name, xb->name);
+ }
+
+ static const char *find_ea_prefix(int index)
diff --git a/meta/recipes-devtools/e2fsprogs/e2fsprogs_git.bb b/meta/recipes-devtools/e2fsprogs/e2fsprogs_git.bb
index 9ade1ff..d4a19f9 100644
--- a/meta/recipes-devtools/e2fsprogs/e2fsprogs_git.bb
+++ b/meta/recipes-devtools/e2fsprogs/e2fsprogs_git.bb
@@ -6,6 +6,7 @@ SRC_URI += "file://acinclude.m4 \
file://run-ptest \
file://ptest.patch \
file://mkdir.patch \
+ file://xattr_ordering.patch \
"
SRCREV = "0f26747167cc9d82df849b0aad387bf824f04544"
reply other threads:[~2016-02-10 18:26 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1455128759.16142.180.camel@linuxfoundation.org \
--to=richard.purdie@linuxfoundation.org \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.