[PATCH RESEND] mdev: fix sysfs traversal with CONFIG_SYSFS_DEPRECATED_V2=y

Gregory Fong gregory.0xf0 at gmail.com
Mon Aug 3 21:17:50 UTC 2015


On Mon, Aug 3, 2015 at 9:07 AM, Denys Vlasenko <vda.linux at googlemail.com> wrote:
> On Wed, Jul 15, 2015 at 11:10 PM, Gregory Fong <gregory.0xf0 at gmail.com> wrote:
>> From: Simon Edlund <simon at edlund.nl>
>>
>> When mdev -s traverses the /sys directory looking for "dev" files, it
>> starts with the block devices under /sys/block, and will find the "dev"
>> file through the symlink, and create a block device node.  In the next
>> stage it will scan the /sys/class looking for char devices, and will
>> find mtdX/dev again, but this time the mknod will fail because there is
>> already a device node with that name.
>
> By swapping  recursive_action("/sys/class") and
> recursive_action("/sys/block"), now the same thing will happen
> when the second scan is done.
>
> Why this is better?

This is better because if you're using a newer kernel with both
CONFIG_SYSFS_DEPRECATED=y (and CONFIG_SYSFS_DEPRECATED_V2=y to enable
it), then where traversing /sys/block with the deprecated layout:
- /sys/block/mtdblock0 is not a symlink, but an actual directory
- /sys/block/mtdblock0/device is a symlink to mtd0

IOW, on deprecated sysfs:
# ls -l /sys/block/mtdblock0
-r--r--r--    1 root     root          4096 Jan  1 00:00 alignment_offset
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 bdi ->
../../devices/virtual/bdi/31:0
-r--r--r--    1 root     root          4096 Jan  1 00:00 capability
-r--r--r--    1 root     root          4096 Jan  1 00:00 dev
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 device ->
../../devices/platform/brcmnand.0/mtd/mtd0
-r--r--r--    1 root     root          4096 Jan  1 00:00 discard_alignment
-r--r--r--    1 root     root          4096 Jan  1 00:00 ext_range
drwxr-xr-x    2 root     root             0 Jan  1 00:00 holders
-r--r--r--    1 root     root          4096 Jan  1 00:00 inflight
drwxr-xr-x    2 root     root             0 Jan  1 00:00 power
drwxr-xr-x    3 root     root             0 Jan  1 00:00 queue
-r--r--r--    1 root     root          4096 Jan  1 00:00 range
-r--r--r--    1 root     root          4096 Jan  1 00:00 removable
-r--r--r--    1 root     root          4096 Jan  1 00:00 ro
-r--r--r--    1 root     root          4096 Jan  1 00:00 size
drwxr-xr-x    2 root     root             0 Jan  1 00:00 slaves
-r--r--r--    1 root     root          4096 Jan  1 00:00 stat
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 subsystem ->
../../block
-rw-r--r--    1 root     root          4096 Jan  1 00:00 uevent

On non-deprecated sysfs:
# ls -l /sys/block/mtdblock0
lrwxrwxrwx    1 root     root             0 Jan  3 18:57
/sys/block/mtdblock0 ->
../devices/platform/rdb/f03e2800.nand/mtd/mtd0/mtdblock0



Now, I hadn't really investigated the problem carefully enough until
now.  This patch simply solved a real problem for us when using
CONFIG_SYSFS_DEPRECATED, and I figured that submitting it would be at
least a good starting point for someone who actually understands this
better to figure out a better fix.

But let's see... since recursive_action is called with
ACTION_FOLLOWLINKS, it will end up checking both
/sys/block/mtdblock0/dev and /sys/block/mtdblock0/device/dev and
creating block devices for both of those.  That's not correct.  So I
think I now have a real fix here, which is to change the
recursive_action call that will only be invoked if
CONFIG_SYSFS_DEPRECATED=y.  In that case, we _shouldn't_ need to follow
symlinks because everything in the top level of /sys/block/ will be a
real directory, and following them will result in the aforementioned problem.

It was a bit surprising to me that this problem isn't also seen with
/sys/class/block, since that has the same hierarchy where it could
follow the link and get to /sys/class/block/mtdblock0/device/dev, but
looking at recursive_action(), it appears that links are only followed
where depth == 0, which would explain that.

I'm stuck using the gmail interface right now and so can't copy and
paste the new patch inline... will send to the list shortly.

Best regards,
Gregory

>
>> [gregory: added commit message to patch from BZ #6806]
>> Signed-off-by: Gregory Fong <gregory.0xf0 at gmail.com>
>> ---
>>  util-linux/mdev.c | 6 +++---
>>  1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/util-linux/mdev.c b/util-linux/mdev.c
>> index ca4b915..4495b0a 100644
>> --- a/util-linux/mdev.c
>> +++ b/util-linux/mdev.c
>> @@ -1063,6 +1063,9 @@ int mdev_main(int argc UNUSED_PARAM, char **argv)
>>
>>                 putenv((char*)"ACTION=add");
>>
>> +               recursive_action("/sys/class",
>> +                       ACTION_RECURSE | ACTION_FOLLOWLINKS,
>> +                       fileAction, dirAction, temp, 0);
>>                 /* ACTION_FOLLOWLINKS is needed since in newer kernels
>>                  * /sys/block/loop* (for example) are symlinks to dirs,
>>                  * not real directories.
>> @@ -1079,9 +1082,6 @@ int mdev_main(int argc UNUSED_PARAM, char **argv)
>>                                 ACTION_RECURSE | ACTION_FOLLOWLINKS | ACTION_QUIET,
>>                                 fileAction, dirAction, temp, 0);
>>                 }
>> -               recursive_action("/sys/class",
>> -                       ACTION_RECURSE | ACTION_FOLLOWLINKS,
>> -                       fileAction, dirAction, temp, 0);
>>         } else {
>>                 char *fw;
>>                 char *seq;
>> --
>> 1.9.1
>>
>> _______________________________________________
>> busybox mailing list
>> busybox at busybox.net
>> http://lists.busybox.net/mailman/listinfo/busybox


More information about the busybox mailing list