On 01/21/2015 03:05 AM, Sabrina Dubroca wrote:
2015-01-21, 04:36:38 +0000, Al Viro wrote:
> On Tue, Jan 20, 2015 at 08:01:26PM -0800, Guenter Roeck wrote:
>> With this patch:
>>
>> sys_mkdir .:40775 returned -17
>> sys_mkdir usr:40775 returned 0
>> sys_mkdir usr/lib:40775 returned 0
>> sys_mkdir usr/share:40755 returned 0
>> sys_mkdir usr/share/udhcpc:40755 returned 0
>> sys_mkdir usr/bin:40775 returned 0
>> sys_mkdir usr/sbin:40775 returned 0
>> sys_mkdir mnt:40775 returned 0
>> sys_mkdir proc:40775 returned 0
>> sys_mkdir root:40775 returned 0
>> sys_mkdir lib:40775 returned 0
>> sys_mkdir lib/modules:40775 returned 0
>> ...
>>
>> and the problem is fixed.
This patch also works for me.
> ... except that it simply confirms that something's fishy with getname_kernel()
> of ->name of struct filename returned by getname(). IOW, I still do not
> understand the mechanism of breakage there.
I'm not so sure about that. I tried to copy name to a new string in
do_path_lookup and that didn't help.
Now, I've removed the
putname(filename);
line from do_path_lookup and I don't get the panic.
And BTW, I added Guenter's debugging to init/initramfs.c and got:
sys_mkdir dev:40755 returned 0
sys_mkdir root:40700 returned 0
even if it ends up panic'ing.
Another data point (though I have no idea if it is useful or what it means):
In the working case, path_init sets nd->flags to 0x50 or 0x51.
In the non-working case (ie for all files with a '/' in the name),
it sets nd->flags to 0x10 or 0x11, even though it is always called
with the LOOKUP_RCU bit set in flags.
Guenter