Re: nfsd, v4: oops in find_acceptable_alias, ppc32 Linux, post-2.6.27-rc1

From: Paul Collins
Date: Mon Aug 04 2008 - 01:11:19 EST


Neil Brown <neilb@xxxxxxx> writes:

> bctrl appears to be the indirect-function-call opcode. There are
> three of them one each for
> ->fh_to_dentry
> acceptable
> ->fh_to_parent
>
> 0xa8 is 'acceptable'.
>
> In the first traceback, the crash was a call from very early in
> find_acceptable_alias, The first significant thing it does is call
> the 'acceptable' function.
>
> So it seems clear that 'acceptable' is NULL.
> It is equally clear that we never ever set it to NULL in the code.
> The logical conclusion is "compiler error".
> We can confirm (hopefully) by looking at a disassembly of fh_verify.
>
> Maybe because nfsd_acceptable is 'static' and never explicitly called,
> gcc gets confused and optimises it away. Maybe a disassembly of
> nfsd_acceptable would be informative ... particularly if it turns out
> to be empty.

Here's the disassembly.

Dump of assembler code for function nfsd_acceptable:
0xc015f450 <nfsd_acceptable+0>: mflr r0
0xc015f454 <nfsd_acceptable+4>: stw r0,4(r1)
0xc015f458 <nfsd_acceptable+8>: bl 0xc0013154 <_mcount>
0xc015f45c <nfsd_acceptable+12>: stwu r1,-32(r1)
0xc015f460 <nfsd_acceptable+16>: mflr r0
0xc015f464 <nfsd_acceptable+20>: stmw r28,16(r1)
0xc015f468 <nfsd_acceptable+24>: mr r28,r3
0xc015f46c <nfsd_acceptable+28>: mr r31,r1
0xc015f470 <nfsd_acceptable+32>: stw r0,36(r1)
0xc015f474 <nfsd_acceptable+36>: li r30,1
0xc015f478 <nfsd_acceptable+40>: lwz r0,24(r3)
0xc015f47c <nfsd_acceptable+44>: mr r3,r4
0xc015f480 <nfsd_acceptable+48>: andi. r9,r0,1024
0xc015f484 <nfsd_acceptable+52>: bne- 0xc015f56c <nfsd_acceptable+284>
0xc015f488 <nfsd_acceptable+56>: cmpwi cr7,r4,0
0xc015f48c <nfsd_acceptable+60>: beq- cr7,0xc015f4b0 <nfsd_acceptable+96>
0xc015f490 <nfsd_acceptable+64>: lwz r0,0(r4)
0xc015f494 <nfsd_acceptable+68>: cntlzw r0,r0
0xc015f498 <nfsd_acceptable+72>: rlwinm r0,r0,27,5,31
0xc015f49c <nfsd_acceptable+76>: twnei r0,0
0xc015f4a0 <nfsd_acceptable+80>: lwarx r0,0,r4
0xc015f4a4 <nfsd_acceptable+84>: addic r0,r0,1
0xc015f4a8 <nfsd_acceptable+88>: stwcx. r0,0,r4
0xc015f4ac <nfsd_acceptable+92>: bne- 0xc015f4a0 <nfsd_acceptable+80>
0xc015f4b0 <nfsd_acceptable+96>: mr r29,r3
0xc015f4b4 <nfsd_acceptable+100>: b 0xc015f508 <nfsd_acceptable+184>
0xc015f4b8 <nfsd_acceptable+104>: beq- cr6,0xc015f4dc <nfsd_acceptable+140>
0xc015f4bc <nfsd_acceptable+108>: lwz r0,0(r30)
0xc015f4c0 <nfsd_acceptable+112>: cntlzw r0,r0
0xc015f4c4 <nfsd_acceptable+116>: rlwinm r0,r0,27,5,31
0xc015f4c8 <nfsd_acceptable+120>: twnei r0,0
0xc015f4cc <nfsd_acceptable+124>: lwarx r0,0,r30
0xc015f4d0 <nfsd_acceptable+128>: addic r0,r0,1
0xc015f4d4 <nfsd_acceptable+132>: stwcx. r0,0,r30
0xc015f4d8 <nfsd_acceptable+136>: bne- 0xc015f4cc <nfsd_acceptable+124>
0xc015f4dc <nfsd_acceptable+140>: lwz r3,8(r30)
0xc015f4e0 <nfsd_acceptable+144>: li r4,1
0xc015f4e4 <nfsd_acceptable+148>: bl 0xc00b2f50 <inode_permission>
0xc015f4e8 <nfsd_acceptable+152>: cmpwi cr7,r3,0
0xc015f4ec <nfsd_acceptable+156>: mr r3,r29
0xc015f4f0 <nfsd_acceptable+160>: bge+ cr7,0xc015f500 <nfsd_acceptable+176>
0xc015f4f4 <nfsd_acceptable+164>: mr r3,r30
0xc015f4f8 <nfsd_acceptable+168>: bl 0xc00befb0 <dput>
0xc015f4fc <nfsd_acceptable+172>: b 0xc015f524 <nfsd_acceptable+212>
0xc015f500 <nfsd_acceptable+176>: bl 0xc00befb0 <dput>
0xc015f504 <nfsd_acceptable+180>: mr r29,r30
0xc015f508 <nfsd_acceptable+184>: lwz r0,32(r28)
0xc015f50c <nfsd_acceptable+188>: cmpw cr7,r29,r0
0xc015f510 <nfsd_acceptable+192>: beq- cr7,0xc015f524 <nfsd_acceptable+212>
0xc015f514 <nfsd_acceptable+196>: lwz r30,20(r29)
0xc015f518 <nfsd_acceptable+200>: cmpw cr7,r29,r30
0xc015f51c <nfsd_acceptable+204>: cmpwi cr6,r30,0
0xc015f520 <nfsd_acceptable+208>: bne+ cr7,0xc015f4b8 <nfsd_acceptable+104>
0xc015f524 <nfsd_acceptable+212>: lwz r0,32(r28)
0xc015f528 <nfsd_acceptable+216>: cmpw cr7,r29,r0
0xc015f52c <nfsd_acceptable+220>: beq- cr7,0xc015f554 <nfsd_acceptable+260>
0xc015f530 <nfsd_acceptable+224>: lis r9,-16296
0xc015f534 <nfsd_acceptable+228>: lwz r0,17792(r9)
0xc015f538 <nfsd_acceptable+232>: andi. r9,r0,2
0xc015f53c <nfsd_acceptable+236>: beq+ 0xc015f554 <nfsd_acceptable+260>
0xc015f540 <nfsd_acceptable+240>: lis r3,-16309
0xc015f544 <nfsd_acceptable+244>: lwz r5,32(r29)
0xc015f548 <nfsd_acceptable+248>: mr r4,r29
0xc015f54c <nfsd_acceptable+252>: addi r3,r3,7972
0xc015f550 <nfsd_acceptable+256>: bl 0xc00330d4 <printk>
0xc015f554 <nfsd_acceptable+260>: lwz r0,32(r28)
0xc015f558 <nfsd_acceptable+264>: mr r3,r29
0xc015f55c <nfsd_acceptable+268>: xor r30,r29,r0
0xc015f560 <nfsd_acceptable+272>: cntlzw r30,r30
0xc015f564 <nfsd_acceptable+276>: rlwinm r30,r30,27,5,31
0xc015f568 <nfsd_acceptable+280>: bl 0xc00befb0 <dput>
0xc015f56c <nfsd_acceptable+284>: lwz r11,0(r1)
0xc015f570 <nfsd_acceptable+288>: mr r3,r30
0xc015f574 <nfsd_acceptable+292>: lwz r0,4(r11)
0xc015f578 <nfsd_acceptable+296>: lmw r28,-16(r11)
0xc015f57c <nfsd_acceptable+300>: mr r1,r11
0xc015f580 <nfsd_acceptable+304>: mtlr r0
0xc015f584 <nfsd_acceptable+308>: blr
End of assembler dump.

> Could you try removing the 'static' declaration for nfsd_acceptable
> and recompile?
> Or maybe try a different compiler?

I will give these a try this evening.

--
Paul Collins
Wellington, New Zealand

Dag vijandelijk luchtschip de huismeester is dood
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/