Re: d_lookup: Unable to handle kernel paging request

From: Vicente Bergas
Date: Tue May 28 2019 - 05:42:10 EST


On Wednesday, May 22, 2019 6:29:46 PM CEST, Al Viro wrote:
...
IOW, here we have also run into bogus hlist forward pointer or head -
same 0x1000000 in one case and 0x0000880001000000 in two others.

Have you tried to see if KASAN catches anything on those loads?
Use-after-free, for example... Another thing to try: slap
WARN_ON(entry->d_flags & DCACHE_NORCU);
in __d_rehash() and see if it triggers.

Hi Al,
after 5 days with v5.2-rc1 + KASAN + WARN_ON could not reproduce the issue.
Neither the first day running v5.3-rc2 + WARN_ON. But today 6 times.
So, there is no KASAN and also the WARN_ON, being there, did not trigger.
The first trace hapenned while untaring a big file into tmpfs. The other
five while "git pull -r" severeal repos on f2fs.

Regards,
VicenÃ.

Unable to handle kernel paging request at virtual address 0000000001000018
Mem abort info:
ESR = 0x96000004
Exception class = DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000004
CM = 0, WnR = 0
user pgtable: 4k pages, 48-bit VAs, pgdp=00000000aeab4000
[0000000001000018] pgd=0000000000000000
Internal error: Oops: 96000004 [#1] SMP
CPU: 4 PID: 1172 Comm: tar Not tainted 5.2.0-rc2 #1
Hardware name: Sapphire-RK3399 Board (DT)
pstate: 00000005 (nzcv daif -PAN -UAO)
pc : __d_lookup+0x58/0x198
lr : d_lookup+0x38/0x68
sp : ffff000012663b90
x29: ffff000012663b90 x28: ffff000012663d58 x27: 0000000000000000 x26: ffff8000ae7cc900 x25: 0000000000000001 x24: ffffffffffffffff x23: 00000000ce9c8f81 x22: 0000000000000000 x21: 0000000000000001 x20: ffff000012663d58 x19: 0000000001000000 x18: 0000000000000000 x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000 x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 x11: fefefefefefefeff x10: b4fea3d0a3a4b4fe x9 : d237122a91454b69 x8 : a0591ae4450bed6a x7 : 5845a2c80f79d4e7 x6 : 0000000000000004 x5 : 0000000000000000 x4 : ffff000012663d58 x3 : ffff000010828a68 x2 : ffff000010828000 x1 : ffff8000f3000000 x0 : 00000000000674e4 Call trace:
__d_lookup+0x58/0x198
d_lookup+0x38/0x68
path_openat+0x4a8/0xfb8
do_filp_open+0x60/0xd8
do_sys_open+0x144/0x1f8
__arm64_sys_openat+0x20/0x28
el0_svc_handler+0x74/0x140
el0_svc+0x8/0xc
Code: 92800018 a9025bf5 d2800016 52800035 (b9401a62) ---[ end trace 7fc40d1e6d2ed53e ]---
Unable to handle kernel paging request at virtual address 0000000000fffffc
Mem abort info:
ESR = 0x96000004
Exception class = DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000004
CM = 0, WnR = 0
user pgtable: 4k pages, 48-bit VAs, pgdp=000000007af3e000
[0000000000fffffc] pgd=0000000000000000
Internal error: Oops: 96000004 [#1] SMP
CPU: 4 PID: 2124 Comm: git Not tainted 5.2.0-rc2 #1
Hardware name: Sapphire-RK3399 Board (DT)
pstate: 00000005 (nzcv daif -PAN -UAO)
pc : __d_lookup_rcu+0x68/0x198
lr : lookup_fast+0x44/0x2e8
sp : ffff0000130b3b60
x29: ffff0000130b3b60 x28: 00000000ce99d070 x27: ffffffffffffffff x26: 0000000000000026 x25: ffff8000ecec6030 x24: ffff0000130b3c2c x23: 0000000000000006 x22: 00000026ce99d070 x21: ffff8000811f3d80 x20: 0000000000020000 x19: 0000000001000000 x18: 0000000000000000 x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000 x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 x11: fefefefefefefeff x10: e4d0b2e6e2b4b6e9 x9 : 5096e90463dfacb0 x8 : 2b4f8961c30ebc93 x7 : aec349fb204a7256 x6 : 4fd9025392b5761a x5 : 02ff010101030100 x4 : ffff8000f3000000 x3 : ffff0000130b3d58 x2 : ffff0000130b3c2c x1 : 00000000000674ce x0 : ffff8000811f3d80 Call trace:
__d_lookup_rcu+0x68/0x198
lookup_fast+0x44/0x2e8
path_openat+0x19c/0xfb8
do_filp_open+0x60/0xd8
do_sys_open+0x144/0x1f8
__arm64_sys_openat+0x20/0x28
el0_svc_handler+0x74/0x140
el0_svc+0x8/0xc
Code: 9280001b 14000003 f9400273 b4000793 (b85fc265) ---[ end trace 6bd1b3b7588a78fe ]---
Unable to handle kernel paging request at virtual address 0000880000fffffc
Mem abort info:
ESR = 0x96000004
Exception class = DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000004
CM = 0, WnR = 0
user pgtable: 4k pages, 48-bit VAs, pgdp=00000000867ac000
[0000880000fffffc] pgd=0000000000000000
Internal error: Oops: 96000004 [#2] SMP
CPU: 4 PID: 2183 Comm: git Tainted: G D 5.2.0-rc2 #1
Hardware name: Sapphire-RK3399 Board (DT)
pstate: 00000005 (nzcv daif -PAN -UAO)
pc : __d_lookup_rcu+0x68/0x198
lr : lookup_fast+0x44/0x2e8
sp : ffff00001325ba90
x29: ffff00001325ba90 x28: 00000000ce99f075 x27: ffffffffffffffff x26: 0000000000000007 x25: ffff8000ecec402a x24: ffff00001325bb5c x23: 0000000000000007 x22: 00000007ce99f075 x21: ffff80007a810c00 x20: 0000000000000000 x19: 0000880001000000 x18: 0000000000000000 x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000 x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 x11: fefefefefefefeff x10: d0bbbcbfa6b2b9bc x9 : 0000000000000000 x8 : ffff80007a810c00 x7 : 6cad9ff29d8de19c x6 : ff94ec6f0ce3656c x5 : ffff8000ecec402a x4 : ffff8000f3000000 x3 : ffff00001325bc78 x2 : ffff00001325bb5c x1 : 00000000000674cf x0 : ffff80007a810c00 Call trace:
__d_lookup_rcu+0x68/0x198
lookup_fast+0x44/0x2e8
walk_component+0x34/0x2e0
path_lookupat.isra.0+0x5c/0x1e0
filename_lookup+0x78/0xf0
user_path_at_empty+0x44/0x58
vfs_statx+0x70/0xd0
__se_sys_newfstatat+0x20/0x40
__arm64_sys_newfstatat+0x18/0x20
el0_svc_handler+0x74/0x140
el0_svc+0x8/0xc
Code: 9280001b 14000003 f9400273 b4000793 (b85fc265) ---[ end trace 6bd1b3b7588a78ff ]---
Unable to handle kernel paging request at virtual address 0000880000fffffc
Mem abort info:
ESR = 0x96000004
Exception class = DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000004
CM = 0, WnR = 0
user pgtable: 4k pages, 48-bit VAs, pgdp=00000000867ac000
[0000880000fffffc] pgd=0000000000000000
Internal error: Oops: 96000004 [#3] SMP
CPU: 4 PID: 2180 Comm: git Tainted: G D 5.2.0-rc2 #1
Hardware name: Sapphire-RK3399 Board (DT)
pstate: 00000005 (nzcv daif -PAN -UAO)
pc : __d_lookup_rcu+0x68/0x198
lr : lookup_fast+0x44/0x2e8
sp : ffff000012a3ba90
x29: ffff000012a3ba90 x28: 00000000ce99f075 x27: ffffffffffffffff x26: 0000000000000007 x25: ffff8000ecec702a x24: ffff000012a3bb5c x23: 0000000000000007 x22: 00000007ce99f075 x21: ffff80007a810c00 x20: 0000000000000000 x19: 0000880001000000 x18: 0000000000000000 x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000 x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 x11: fefefefefefefeff x10: d0bbbcbfa6b2b9bc x9 : 0000000000000000 x8 : ffff80007a810c00 x7 : 6cad9ff29d8de19c x6 : ff94ec6f0ce3656c x5 : ffff8000ecec702a x4 : ffff8000f3000000 x3 : ffff000012a3bc78 x2 : ffff000012a3bb5c x1 : 00000000000674cf x0 : ffff80007a810c00 Call trace:
__d_lookup_rcu+0x68/0x198
lookup_fast+0x44/0x2e8
walk_component+0x34/0x2e0
path_lookupat.isra.0+0x5c/0x1e0
filename_lookup+0x78/0xf0
user_path_at_empty+0x44/0x58
vfs_statx+0x70/0xd0
__se_sys_newfstatat+0x20/0x40
__arm64_sys_newfstatat+0x18/0x20
el0_svc_handler+0x74/0x140
el0_svc+0x8/0xc
Code: 9280001b 14000003 f9400273 b4000793 (b85fc265) ---[ end trace 6bd1b3b7588a7900 ]---
Unable to handle kernel paging request at virtual address 0000880000fffffc
Mem abort info:
ESR = 0x96000004
Exception class = DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000004
CM = 0, WnR = 0
user pgtable: 4k pages, 48-bit VAs, pgdp=0000000073f2f000
[0000880000fffffc] pgd=0000000000000000
Internal error: Oops: 96000004 [#4] SMP
CPU: 4 PID: 2210 Comm: git Tainted: G D 5.2.0-rc2 #1
Hardware name: Sapphire-RK3399 Board (DT)
pstate: 00000005 (nzcv daif -PAN -UAO)
pc : __d_lookup_rcu+0x68/0x198
lr : lookup_fast+0x44/0x2e8
sp : ffff0000132bba90
x29: ffff0000132bba90 x28: 00000000ce99e1a6 x27: ffffffffffffffff x26: 000000000000000c x25: ffff8000f21dd036 x24: ffff0000132bbb5c x23: 0000000000000004 x22: 0000000cce99e1a6 x21: ffff800074dd8d80 x20: 0000000000000000 x19: 0000880001000000 x18: 0000000000000000 x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000 x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 x11: fefefefefefefeff x10: d0d0d0d0b8fea4b3 x9 : 40bcd8645005512e x8 : c433ade89ebd10f9 x7 : c6b69091eeb194d2 x6 : 848f758ca69635b4 x5 : ffff8000f21dd036 x4 : ffff8000f3000000 x3 : ffff0000132bbc78 x2 : ffff0000132bbb5c x1 : 00000000000674cf x0 : ffff800074dd8d80 Call trace:
__d_lookup_rcu+0x68/0x198
lookup_fast+0x44/0x2e8
walk_component+0x34/0x2e0
path_lookupat.isra.0+0x5c/0x1e0
filename_lookup+0x78/0xf0
user_path_at_empty+0x44/0x58
vfs_statx+0x70/0xd0
__se_sys_newfstatat+0x20/0x40
__arm64_sys_newfstatat+0x18/0x20
el0_svc_handler+0x74/0x140
el0_svc+0x8/0xc
Code: 9280001b 14000003 f9400273 b4000793 (b85fc265) ---[ end trace 6bd1b3b7588a7901 ]---
Unable to handle kernel paging request at virtual address 0000880000fffffc
Mem abort info:
ESR = 0x96000004
Exception class = DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000004
CM = 0, WnR = 0
user pgtable: 4k pages, 48-bit VAs, pgdp=0000000073f2f000
[0000880000fffffc] pgd=0000000000000000
Internal error: Oops: 96000004 [#5] SMP
CPU: 5 PID: 2200 Comm: git Tainted: G D 5.2.0-rc2 #1
Hardware name: Sapphire-RK3399 Board (DT)
pstate: 00000005 (nzcv daif -PAN -UAO)
pc : __d_lookup_rcu+0x68/0x198
lr : lookup_fast+0x44/0x2e8
sp : ffff000013263a90
x29: ffff000013263a90 x28: 00000000ce99e1a6 x27: ffffffffffffffff x26: 000000000000000c x25: ffff8000f0a6f036 x24: ffff000013263b5c x23: 0000000000000004 x22: 0000000cce99e1a6 x21: ffff800074dd8d80 x20: 0000000000000000 x19: 0000880001000000 x18: 0000000000000000 x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000 x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 x11: fefefefefefefeff x10: d0d0d0d0b8fea4b3 x9 : 40bcd8645005512e x8 : c433ade89ebd10f9 x7 : c6b69091eeb194d2 x6 : 848f758ca69635b4 x5 : ffff8000f0a6f036 x4 : ffff8000f3000000 x3 : ffff000013263c78 x2 : ffff000013263b5c x1 : 00000000000674cf x0 : ffff800074dd8d80 Call trace:
__d_lookup_rcu+0x68/0x198
lookup_fast+0x44/0x2e8
walk_component+0x34/0x2e0
path_lookupat.isra.0+0x5c/0x1e0
filename_lookup+0x78/0xf0
user_path_at_empty+0x44/0x58
vfs_statx+0x70/0xd0
__se_sys_newfstatat+0x20/0x40
__arm64_sys_newfstatat+0x18/0x20
el0_svc_handler+0x74/0x140
el0_svc+0x8/0xc
Code: 9280001b 14000003 f9400273 b4000793 (b85fc265) ---[ end trace 6bd1b3b7588a7902 ]---



00000000000001c8 <__d_rehash>:
return dentry_hashtable + (hash >> d_hash_shift);
1c8: 90000001 adrp x1, 0 <find_submount>
1c8: R_AARCH64_ADR_PREL_PG_HI21 .data..read_mostly
1cc: 91000022 add x2, x1, #0x0
1cc: R_AARCH64_ADD_ABS_LO12_NC .data..read_mostly

static void __d_rehash(struct dentry *entry)
{
struct hlist_bl_head *b = d_hash(entry->d_name.hash);

WARN_ON(entry->d_flags & DCACHE_NORCU);
1d0: b9400003 ldr w3, [x0]
return dentry_hashtable + (hash >> d_hash_shift);
1d4: f9400025 ldr x5, [x1]
1d4: R_AARCH64_LDST64_ABS_LO12_NC .data..read_mostly
1d8: b9400841 ldr w1, [x2, #8]
1dc: b9402002 ldr w2, [x0, #32]
1e0: 1ac12442 lsr w2, w2, w1
1e4: 8b020ca1 add x1, x5, x2, lsl #3
WARN_ON(entry->d_flags & DCACHE_NORCU);
1e8: 37f00343 tbnz w3, #30, 250 <__d_rehash+0x88>
__READ_ONCE_SIZE;
1ec: f9400023 ldr x3, [x1]
if (READ_ONCE(*p) & mask)
1f0: 37000283 tbnz w3, #0, 240 <__d_rehash+0x78>
1f4: f9800031 prfm pstl1strm, [x1]
1f8: c85ffc23 ldaxr x3, [x1]
1fc: b2400064 orr x4, x3, #0x1
200: c8067c24 stxr w6, x4, [x1]
204: 35ffffa6 cbnz w6, 1f8 <__d_rehash+0x30>
while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
208: 370001c3 tbnz w3, #0, 240 <__d_rehash+0x78>
((unsigned long)h->first & ~LIST_BL_LOCKMASK);
20c: f86278a3 ldr x3, [x5, x2, lsl #3]
hlist_bl_lock(b);
hlist_bl_add_head_rcu(&entry->d_hash, b);
210: 91002004 add x4, x0, #0x8
214: 927ff863 and x3, x3, #0xfffffffffffffffe
struct hlist_bl_node *first;

/* don't need hlist_bl_first_rcu because we're under lock */
first = hlist_bl_first(h);

n->next = first;
218: f9000403 str x3, [x0, #8]
if (first)
21c: b4000043 cbz x3, 224 <__d_rehash+0x5c>
first->pprev = &n->next;
220: f9000464 str x4, [x3, #8]
rcu_assign_pointer(h->first,
224: b2400084 orr x4, x4, #0x1
n->pprev = &h->first;
228: f9000801 str x1, [x0, #16]
rcu_assign_pointer(h->first,
22c: c89ffc24 stlr x4, [x1]
230: f86278a0 ldr x0, [x5, x2, lsl #3]
old &= ~BIT_MASK(nr);
234: 927ff800 and x0, x0, #0xfffffffffffffffe
238: c89ffc20 stlr x0, [x1]
hlist_bl_unlock(b);
}
23c: d65f03c0 ret
240: d503203f yield
244: f9400023 ldr x3, [x1]
} while (test_bit(bitnum, addr));
248: 3707ffc3 tbnz w3, #0, 240 <__d_rehash+0x78>
24c: 17ffffe8 b 1ec <__d_rehash+0x24>
WARN_ON(entry->d_flags & DCACHE_NORCU);
250: d4210000 brk #0x800
preempt_disable();
254: 17ffffe6 b 1ec <__d_rehash+0x24>

...

0000000000002d10 <__d_lookup_rcu>:
{
2d10: a9b97bfd stp x29, x30, [sp, #-112]!
2d14: aa0103e3 mov x3, x1
return dentry_hashtable + (hash >> d_hash_shift);
2d18: 90000004 adrp x4, 0 <find_submount>
2d18: R_AARCH64_ADR_PREL_PG_HI21 .data..read_mostly
{
2d1c: 910003fd mov x29, sp
2d20: a90153f3 stp x19, x20, [sp, #16]
return dentry_hashtable + (hash >> d_hash_shift);
2d24: 91000081 add x1, x4, #0x0
2d24: R_AARCH64_ADD_ABS_LO12_NC .data..read_mostly
{
2d28: a9025bf5 stp x21, x22, [sp, #32]
2d2c: a9046bf9 stp x25, x26, [sp, #64]
const unsigned char *str = name->name;
2d30: a9406476 ldp x22, x25, [x3]
return dentry_hashtable + (hash >> d_hash_shift);
2d34: b9400821 ldr w1, [x1, #8]
2d38: f9400084 ldr x4, [x4]
2d38: R_AARCH64_LDST64_ABS_LO12_NC .data..read_mostly
2d3c: 1ac126c1 lsr w1, w22, w1
__READ_ONCE_SIZE;
2d40: f8617893 ldr x19, [x4, x1, lsl #3]
hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
2d44: f27ffa73 ands x19, x19, #0xfffffffffffffffe
2d48: 54000920 b.eq 2e6c <__d_lookup_rcu+0x15c> // b.none
2d4c: aa0003f5 mov x21, x0
if (dentry_cmp(dentry, str, hashlen_len(hashlen)) != 0)
2d50: d360feda lsr x26, x22, #32
2d54: a90363f7 stp x23, x24, [sp, #48]
2d58: aa0203f8 mov x24, x2
2d5c: d3608ad7 ubfx x23, x22, #32, #3
2d60: a90573fb stp x27, x28, [sp, #80]
2d64: 2a1603fc mov w28, w22
mask = bytemask_from_count(tcount);
2d68: 9280001b mov x27, #0xffffffffffffffff // #-1
2d6c: 14000003 b 2d78 <__d_lookup_rcu+0x68>
2d70: f9400273 ldr x19, [x19]
hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
2d74: b4000793 cbz x19, 2e64 <__d_lookup_rcu+0x154>
2d78: b85fc265 ldur w5, [x19, #-4]
smp_rmb();
2d7c: d50339bf dmb ishld
if (dentry->d_parent != parent)
2d80: f9400a64 ldr x4, [x19, #16]
2d84: d1002260 sub x0, x19, #0x8
2d88: eb0402bf cmp x21, x4
2d8c: 54ffff21 b.ne 2d70 <__d_lookup_rcu+0x60> // b.any
return ret & ~1;
2d90: 121f78b4 and w20, w5, #0xfffffffe
hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
2d94: aa0003e9 mov x9, x0
if (d_unhashed(dentry))
2d98: f9400664 ldr x4, [x19, #8]
2d9c: b4fffea4 cbz x4, 2d70 <__d_lookup_rcu+0x60>
if (unlikely(parent->d_flags & DCACHE_OP_COMPARE)) {
2da0: b94002a4 ldr w4, [x21]
2da4: 37080404 tbnz w4, #1, 2e24 <__d_lookup_rcu+0x114>
if (dentry->d_name.hash_len != hashlen)
2da8: f9401000 ldr x0, [x0, #32]
2dac: eb16001f cmp x0, x22
2db0: 54fffe01 b.ne 2d70 <__d_lookup_rcu+0x60> // b.any
2db4: f9401265 ldr x5, [x19, #32]
const unsigned char *cs = READ_ONCE(dentry->d_name.name);
2db8: 2a1a03e6 mov w6, w26
2dbc: cb050328 sub x8, x25, x5
2dc0: 14000006 b 2dd8 <__d_lookup_rcu+0xc8>
cs += sizeof(unsigned long);
2dc4: 910020a5 add x5, x5, #0x8
if (unlikely(a != b))
2dc8: eb07001f cmp x0, x7
2dcc: 54fffd21 b.ne 2d70 <__d_lookup_rcu+0x60> // b.any
if (!tcount)
2dd0: 710020c6 subs w6, w6, #0x8
2dd4: 54000160 b.eq 2e00 <__d_lookup_rcu+0xf0> // b.none
cs += sizeof(unsigned long);
2dd8: 8b0800a4 add x4, x5, x8
if (tcount < sizeof(unsigned long))
2ddc: 6b1700df cmp w6, w23
static inline unsigned long load_unaligned_zeropad(const void *addr)
{
unsigned long ret, offset;

/* Load word from unaligned pointer addr */
asm(
2de0: f9400087 ldr x7, [x4]

static __no_kasan_or_inline
unsigned long read_word_at_a_time(const void *addr)
{
kasan_check_read(addr, 1);
return *(unsigned long *)addr;
2de4: f94000a0 ldr x0, [x5]
2de8: 54fffee1 b.ne 2dc4 <__d_lookup_rcu+0xb4> // b.any
mask = bytemask_from_count(tcount);
2dec: 531d72e1 lsl w1, w23, #3
return unlikely(!!((a ^ b) & mask));
2df0: ca070000 eor x0, x0, x7
mask = bytemask_from_count(tcount);
2df4: 9ac12361 lsl x1, x27, x1
if (dentry_cmp(dentry, str, hashlen_len(hashlen)) != 0)
2df8: ea21001f bics xzr, x0, x1
2dfc: 54fffba1 b.ne 2d70 <__d_lookup_rcu+0x60> // b.any
*seqp = seq;
2e00: b9000314 str w20, [x24]
}
2e04: aa0903e0 mov x0, x9
2e08: a94153f3 ldp x19, x20, [sp, #16]
2e0c: a9425bf5 ldp x21, x22, [sp, #32]
return dentry;
2e10: a94363f7 ldp x23, x24, [sp, #48]
}
2e14: a9446bf9 ldp x25, x26, [sp, #64]
return dentry;
2e18: a94573fb ldp x27, x28, [sp, #80]
}
2e1c: a8c77bfd ldp x29, x30, [sp], #112
2e20: d65f03c0 ret
if (dentry->d_name.hash != hashlen_hash(hashlen))
2e24: b9402001 ldr w1, [x0, #32]
2e28: 6b01039f cmp w28, w1
2e2c: 54fffa21 b.ne 2d70 <__d_lookup_rcu+0x60> // b.any
tlen = dentry->d_name.len;
2e30: b9402401 ldr w1, [x0, #36]
tname = dentry->d_name.name;
2e34: f9401402 ldr x2, [x0, #40]
smp_rmb();
2e38: d50339bf dmb ishld
return unlikely(s->sequence != start);
2e3c: b85fc264 ldur w4, [x19, #-4]
if (read_seqcount_retry(&dentry->d_seq, seq)) {
2e40: 6b04029f cmp w20, w4
2e44: 54000221 b.ne 2e88 <__d_lookup_rcu+0x178> // b.any
if (parent->d_op->d_compare(dentry,
2e48: f94032a4 ldr x4, [x21, #96]
2e4c: a90627e3 stp x3, x9, [sp, #96]
2e50: f9400c84 ldr x4, [x4, #24]
2e54: d63f0080 blr x4
2e58: a94627e3 ldp x3, x9, [sp, #96]
2e5c: 34fffd20 cbz w0, 2e00 <__d_lookup_rcu+0xf0>
2e60: 17ffffc4 b 2d70 <__d_lookup_rcu+0x60>
2e64: a94363f7 ldp x23, x24, [sp, #48]
2e68: a94573fb ldp x27, x28, [sp, #80]
return NULL;
2e6c: d2800009 mov x9, #0x0 // #0
}
2e70: aa0903e0 mov x0, x9
2e74: a94153f3 ldp x19, x20, [sp, #16]
2e78: a9425bf5 ldp x21, x22, [sp, #32]
2e7c: a9446bf9 ldp x25, x26, [sp, #64]
2e80: a8c77bfd ldp x29, x30, [sp], #112
2e84: d65f03c0 ret
2e88: d503203f yield
__READ_ONCE_SIZE;
2e8c: b85fc265 ldur w5, [x19, #-4]
smp_rmb();
2e90: d50339bf dmb ishld
if (dentry->d_parent != parent)
2e94: f9400c01 ldr x1, [x0, #24]
return ret & ~1;
2e98: 121f78b4 and w20, w5, #0xfffffffe
2e9c: eb15003f cmp x1, x21
2ea0: 54fff681 b.ne 2d70 <__d_lookup_rcu+0x60> // b.any
2ea4: 17ffffbd b 2d98 <__d_lookup_rcu+0x88>

0000000000002ea8 <__d_lookup>:
{
2ea8: a9b97bfd stp x29, x30, [sp, #-112]!
return dentry_hashtable + (hash >> d_hash_shift);
2eac: 90000002 adrp x2, 0 <find_submount>
2eac: R_AARCH64_ADR_PREL_PG_HI21 .data..read_mostly
2eb0: 91000043 add x3, x2, #0x0
2eb0: R_AARCH64_ADD_ABS_LO12_NC .data..read_mostly
{
2eb4: 910003fd mov x29, sp
2eb8: a90573fb stp x27, x28, [sp, #80]
2ebc: aa0103fc mov x28, x1
2ec0: a90153f3 stp x19, x20, [sp, #16]
2ec4: a90363f7 stp x23, x24, [sp, #48]
2ec8: a9046bf9 stp x25, x26, [sp, #64]
2ecc: aa0003fa mov x26, x0
unsigned int hash = name->hash;
2ed0: b9400397 ldr w23, [x28]
return dentry_hashtable + (hash >> d_hash_shift);
2ed4: b9400860 ldr w0, [x3, #8]
2ed8: f9400041 ldr x1, [x2]
2ed8: R_AARCH64_LDST64_ABS_LO12_NC .data..read_mostly
2edc: 1ac026e0 lsr w0, w23, w0
2ee0: f8607833 ldr x19, [x1, x0, lsl #3]
hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
2ee4: f27ffa73 ands x19, x19, #0xfffffffffffffffe
2ee8: 54000320 b.eq 2f4c <__d_lookup+0xa4> // b.none
smp_store_release(&lock->locked, 0);
2eec: 5280001b mov w27, #0x0 // #0
mask = bytemask_from_count(tcount);
2ef0: 92800018 mov x24, #0xffffffffffffffff // #-1
2ef4: a9025bf5 stp x21, x22, [sp, #32]
2ef8: d2800016 mov x22, #0x0 // #0
2efc: 52800035 mov w21, #0x1 // #1
if (dentry->d_name.hash != hash)
2f00: b9401a62 ldr w2, [x19, #24]
2f04: d1002274 sub x20, x19, #0x8
2f08: 6b17005f cmp w2, w23
2f0c: 540001a1 b.ne 2f40 <__d_lookup+0x98> // b.any
2f10: 91014279 add x25, x19, #0x50
2f14: f9800331 prfm pstl1strm, [x25]
2f18: 885fff21 ldaxr w1, [x25]
2f1c: 4a160020 eor w0, w1, w22
2f20: 35000060 cbnz w0, 2f2c <__d_lookup+0x84>
2f24: 88007f35 stxr w0, w21, [x25]
2f28: 35ffff80 cbnz w0, 2f18 <__d_lookup+0x70>
2f2c: 35000521 cbnz w1, 2fd0 <__d_lookup+0x128>
if (dentry->d_parent != parent)
2f30: f9400e82 ldr x2, [x20, #24]
2f34: eb1a005f cmp x2, x26
2f38: 540001a0 b.eq 2f6c <__d_lookup+0xc4> // b.none
2f3c: 089fff3b stlrb w27, [x25]
2f40: f9400273 ldr x19, [x19]
hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
2f44: b5fffdf3 cbnz x19, 2f00 <__d_lookup+0x58>
2f48: a9425bf5 ldp x21, x22, [sp, #32]
struct dentry *found = NULL;
2f4c: d2800008 mov x8, #0x0 // #0
}
2f50: aa0803e0 mov x0, x8
2f54: a94153f3 ldp x19, x20, [sp, #16]
2f58: a94363f7 ldp x23, x24, [sp, #48]
2f5c: a9446bf9 ldp x25, x26, [sp, #64]
2f60: a94573fb ldp x27, x28, [sp, #80]
2f64: a8c77bfd ldp x29, x30, [sp], #112
2f68: d65f03c0 ret
if (d_unhashed(dentry))
2f6c: f9400660 ldr x0, [x19, #8]
2f70: b4fffe60 cbz x0, 2f3c <__d_lookup+0x94>
if (likely(!(parent->d_flags & DCACHE_OP_COMPARE))) {
2f74: b9400340 ldr w0, [x26]
hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) {
2f78: aa1403e8 mov x8, x20
if (likely(!(parent->d_flags & DCACHE_OP_COMPARE))) {
2f7c: b9402681 ldr w1, [x20, #36]
2f80: 370802e0 tbnz w0, #1, 2fdc <__d_lookup+0x134>
if (dentry->d_name.len != name->len)
2f84: b9400784 ldr w4, [x28, #4]
2f88: 6b04003f cmp w1, w4
2f8c: 54fffd81 b.ne 2f3c <__d_lookup+0x94> // b.any
return dentry_cmp(dentry, name->name, name->len) == 0;
2f90: f9400787 ldr x7, [x28, #8]
static inline int dentry_string_cmp(const unsigned char *cs, const unsigned char *ct, unsigned tcount)
2f94: 12000881 and w1, w4, #0x7
2f98: f9401265 ldr x5, [x19, #32]
2f9c: cb0500e7 sub x7, x7, x5
2fa0: 14000003 b 2fac <__d_lookup+0x104>
if (!tcount)
2fa4: 71002084 subs w4, w4, #0x8
2fa8: 54000300 b.eq 3008 <__d_lookup+0x160> // b.none
cs += sizeof(unsigned long);
2fac: 8b0700a2 add x2, x5, x7
if (tcount < sizeof(unsigned long))
2fb0: 6b04003f cmp w1, w4
2fb4: f9400046 ldr x6, [x2]
return *(unsigned long *)addr;
2fb8: f94000a0 ldr x0, [x5]
2fbc: 54000340 b.eq 3024 <__d_lookup+0x17c> // b.none
cs += sizeof(unsigned long);
2fc0: 910020a5 add x5, x5, #0x8
if (unlikely(a != b))
2fc4: eb06001f cmp x0, x6
2fc8: 54fffee0 b.eq 2fa4 <__d_lookup+0xfc> // b.none
2fcc: 17ffffdc b 2f3c <__d_lookup+0x94>
queued_spin_lock_slowpath(lock, val);
2fd0: aa1903e0 mov x0, x25
2fd4: 94000000 bl 0 <queued_spin_lock_slowpath>
2fd4: R_AARCH64_CALL26 queued_spin_lock_slowpath
2fd8: 17ffffd6 b 2f30 <__d_lookup+0x88>
return parent->d_op->d_compare(dentry,
2fdc: f9403340 ldr x0, [x26, #96]
2fe0: aa1c03e3 mov x3, x28
2fe4: f9401682 ldr x2, [x20, #40]
2fe8: f90037f4 str x20, [sp, #104]
2fec: f9400c04 ldr x4, [x0, #24]
2ff0: aa1403e0 mov x0, x20
2ff4: d63f0080 blr x4
name) == 0;
2ff8: 7100001f cmp w0, #0x0
2ffc: 1a9f17e0 cset w0, eq // eq = none
3000: f94037e8 ldr x8, [sp, #104]
if (!d_same_name(dentry, parent, name))
3004: 34fff9c0 cbz w0, 2f3c <__d_lookup+0x94>
dentry->d_lockref.count++;
3008: b9405e80 ldr w0, [x20, #92]
smp_store_release(&lock->locked, 0);
300c: 52800001 mov w1, #0x0 // #0
3010: 11000400 add w0, w0, #0x1
3014: b9005e80 str w0, [x20, #92]
3018: 089fff21 stlrb w1, [x25]
}
301c: a9425bf5 ldp x21, x22, [sp, #32]
3020: 17ffffcc b 2f50 <__d_lookup+0xa8>
mask = bytemask_from_count(tcount);
3024: 531d7021 lsl w1, w1, #3
return unlikely(!!((a ^ b) & mask));
3028: ca060000 eor x0, x0, x6
mask = bytemask_from_count(tcount);
302c: 9ac12301 lsl x1, x24, x1
3030: ea21001f bics xzr, x0, x1
3034: 1a9f17e0 cset w0, eq // eq = none
if (!d_same_name(dentry, parent, name))
3038: 34fff820 cbz w0, 2f3c <__d_lookup+0x94>
303c: 17fffff3 b 3008 <__d_lookup+0x160>

0000000000003040 <d_lookup>:
{
3040: a9bd7bfd stp x29, x30, [sp, #-48]!
3044: 910003fd mov x29, sp
3048: a90153f3 stp x19, x20, [sp, #16]
304c: 90000013 adrp x19, 0 <find_submount>
304c: R_AARCH64_ADR_PREL_PG_HI21 .data..cacheline_aligned
3050: aa0103f4 mov x20, x1
3054: 91000273 add x19, x19, #0x0
3054: R_AARCH64_ADD_ABS_LO12_NC .data..cacheline_aligned
3058: a9025bf5 stp x21, x22, [sp, #32]
305c: aa0003f5 mov x21, x0
__READ_ONCE_SIZE;
3060: b9400276 ldr w22, [x19]
if (unlikely(ret & 1)) {
3064: 370001d6 tbnz w22, #0, 309c <d_lookup+0x5c>
smp_rmb();
3068: d50339bf dmb ishld
dentry = __d_lookup(parent, name);
306c: aa1403e1 mov x1, x20
3070: aa1503e0 mov x0, x21
3074: 94000000 bl 2ea8 <__d_lookup>
3074: R_AARCH64_CALL26 __d_lookup
if (dentry)
3078: b50000a0 cbnz x0, 308c <d_lookup+0x4c>
smp_rmb();
307c: d50339bf dmb ishld
} while (read_seqretry(&rename_lock, seq));
3080: b9400261 ldr w1, [x19]
3084: 6b16003f cmp w1, w22
3088: 54fffec1 b.ne 3060 <d_lookup+0x20> // b.any
}
308c: a94153f3 ldp x19, x20, [sp, #16]
3090: a9425bf5 ldp x21, x22, [sp, #32]
3094: a8c37bfd ldp x29, x30, [sp], #48
3098: d65f03c0 ret
309c: d503203f yield
30a0: 17fffff0 b 3060 <d_lookup+0x20>
30a4: d503201f nop