Hi Gregory,
I tested your patch and reviewed it. It looks correct to me.
Here is some reasoning which is partly for my own benefit, but may be of use to
others following.
> Additionally, following symlinks causes a bug for mtd in this case, e.g.
> several
> people have been seeing that /dev/mtd0 was getting created by this traversal
> as a block device.
Me too.
> Subsequent investigation revealed that was caused by this pass following the
> /sys/block/mtdblock0/device symlink and resulting in both
> - /sys/block/mtdblock0/dev
> - /sys/block/mtdblock0/device/dev
> being used here, and the second results in that incorrect /dev/mtd0.
Yes. Here's the example on my system:
$ cat /sys/block/mtdblock0/dev
31:0
$ cat /sys/block/mtdblock0/device/dev
90:0
$ realpath /sys/block/mtdblock0/dev
/sys/block/mtdblock0/dev
$ realpath /sys/block/mtdblock0/device/dev
/sys/devices/platform/mxc_nand/mtd/mtd0/dev
It looks like following symlinks from /sys/block isn't right (and your patch is
correct) because in make_device() we see the following check:
if (strstr(path, "/block/") || (G.subsystem && strncmp(G.subsystem,
"block", 5) == 0))
type = S_IFBLK;
Prior to that we have dirAction() which sets G.subsystem during sysfs
traversal, but only when at depth 1:
static int FAST_FUNC dirAction, ...
int depth)
{
/* Extract device subsystem -- the name of the directory
* under /sys/class/ */
if (1 == depth) {
free(G.subsystem);
...
G.subsystem = strrchr(fileName, '/');
if (G.subsystem) {
G.subsystem = xstrdup(G.subsystem + 1);
...
}
}
return (depth >= MAX_SYSFS_DEPTH ? SKIP : TRUE);
}
So without using realpath() or other checks to determine the device type,
following symlinks during /sys/block creation isn't correct as G.subsystem may
then be wrongly set to "block".
> Change to not follow symlinks while traversing /sys/block to fix this.
In summary, I have tested this part of the patch, and it works for me.
The last part of the test was to check what happens with /sys/block/loopX. In
my system config they are real dirs, so the loopX devices correctly get made as
block devices. I suspect this is therefore okay.
Kind Regards,
Mike
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox