]> err.no Git - util-linux/commitdiff
losetup: handle symlinks in /dev/loop/
authorMike Frysinger <vapier@gentoo.org>
Sun, 10 May 2009 20:57:31 +0000 (16:57 -0400)
committerKarel Zak <kzak@redhat.com>
Mon, 11 May 2009 08:54:41 +0000 (10:54 +0200)
The loop_scandir() expects all the files in /dev/loop/ to be actual
devices and not symlinks to devices.  However, udev by default sets up
symlinks in /dev/loop/ thereby breaking the fallback scan logic when
looking for devices more than the default number of 8.

Simple way to reproduce is:
 - <detach all devices>
 - cd /dev/loop
 - rm -f [2-7]
 - losetup 0 autogen.sh
 - mv 1 8
 - for n in {1..7} ; do ln -s 0 $n ; done
 - losetup -f
<error but should have found /dev/loop/8>

[kay.sievers@vrfy.org:
       just a note, udev does not do that by default. It is
       devfs-nonsense, which the "default" never did.]

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Reported-by: Mario Bachmann <grafgrimm77@gmx.de>
mount/lomount.c

index d62198ef242701db9ae100a0d30107b67bdc6ae3..c173409ec2b1e424e4519d5846b55103d700273c 100644 (file)
@@ -256,7 +256,7 @@ loop_scandir(const char *dirname, int **ary, int hasprefix)
        *ary = NULL;
 
        while((d = readdir(dir))) {
-               if (d->d_type != DT_BLK && d->d_type != DT_UNKNOWN)
+               if (d->d_type != DT_BLK && d->d_type != DT_UNKNOWN && d->d_type != DT_LNK)
                        continue;
                n = name2minor(hasprefix, d->d_name);
                if (n == -1 || n < NLOOPS_DEFAULT)