Bug report: unaligned access with ext4 encryption

From: Aaro Koskinen
Date: Sun Dec 30 2018 - 11:29:24 EST


Hi,

When using ext4 encryption on SPARC, there's plenty of dmesg noise about
unaligned access:

[ 167.269526] Kernel unaligned access at TPC[5497a0] find_and_lock_process_key+0x80/0x120
[ 167.270152] Kernel unaligned access at TPC[5497a0] find_and_lock_process_key+0x80/0x120
[ 181.087451] log_unaligned: 5 callbacks suppressed
[ 181.087511] Kernel unaligned access at TPC[5497a0] find_and_lock_process_key+0x80/0x120
[ 181.092435] Kernel unaligned access at TPC[5497a0] find_and_lock_process_key+0x80/0x120
[ 181.095816] Kernel unaligned access at TPC[5497a0] find_and_lock_process_key+0x80/0x120

And also seen on an ARM machine:

$ cat /proc/cpu/alignment
User: 0
System: 1028193 (find_and_lock_process_key+0x84/0x10c)
Skipped: 0
Half: 0
Word: 1028193
DWord: 0
Multi: 0
User faults: 0 (ignored)

Looks like user_key_payload layout is not optimal when data address
is used for fscrypt_key... I tried the below change and got rid of the
messages. Not sure what the proper fix should be?

A.

diff --git a/include/keys/user-type.h b/include/keys/user-type.h
index e098cbe27db5..6495ffcfe510 100644
--- a/include/keys/user-type.h
+++ b/include/keys/user-type.h
@@ -31,7 +31,7 @@
struct user_key_payload {
struct rcu_head rcu; /* RCU destructor */
unsigned short datalen; /* length of this data */
- char data[0]; /* actual data */
+ char data[0] __aligned(4); /* actual data */
};

extern struct key_type key_type_user;