Package: mount Version: 2.12r-6 Severity: grave Justification: could lead to unexpected data loss or corruption
My daily locate cronjob started giving me funny warnings: /usr/bin/find: Filesystem loop detected; `//burnside-unstable' has the same device number and inode as a directory which is 1 level higher in the filesystem hierarchy. Weird. So I investigated further. I had just upgraded mount from version 2.12p-8 to 2.12r-6. My /etc/fstab reads as follows (unedited in case this is important): # /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/hda3 / ext3 defaults,errors=remount-ro 0 1 /dev/hda5 none swap sw 0 0 /dev/hdd /media/cdrom0 iso9660 ro,user,noauto 0 0 /dev/hdc /media/dvd iso9660 ro,user,noauto 0 0 /dev/hdc /media/dvdudf udf ro,user,noauto 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0 /dev/hda2 /burnside-unstable ext3 defaults 0 2 /dev/hda1 /ntfs ntfs ro,umask=0222 0 0 192.168.0.3:/ /polya nfs defaults,noauto 0 0 proc-sid /chroot/unstable/proc proc none 0 0 /dev/sda1 /mnt/memstick vfat rw,user,noauto 0 0 I ran the following commands: burnside:~ # ls -l /etc/apt/sources.list -rw-r--r-- 1 root root 916 Dec 8 23:30 /burnside-unstable/etc/apt/sources.list burnside:~ # umount /burnside-unstable/ burnside:~ # strace -f mount /burnside-unstable/ > /tmp/mount.fstab 2>&1 burnside:~ # ls -l /burnside-unstable/etc/apt/sources.list -rw-r--r-- 1 root root 916 Dec 8 23:30 /burnside-unstable/etc/apt/sources.list burnside:~ # umount /burnside-unstable/ burnside:~ # strace -f mount -t ext3 /dev/hda2 /burnside-unstable > /tmp/mount.cmd 2>&1 burnside:~ # ls -l /burnside-unstable/etc/apt/sources.list -rw-r--r-- 1 root root 916 Dec 8 23:30 /burnside-unstable/etc/apt/sources.list burnside:~ # mount /dev/hda3 on / type ext3 (rw,errors=remount-ro) /dev/hda1 on /ntfs type ntfs (ro,umask=0222) proc-sid on /chroot/unstable/proc type proc (rw,none) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw) usbfs on /proc/bus/usb type usbfs (rw) tmpfs on /dev type tmpfs (rw,size=10M,mode=0755) /dev/hda2 on /burnside-unstable type ext3 (rw) burnside:~ # perl -e 'print join(":",stat("/burnside-unstable/etc/apt/sources.list")),"\n"' 770:2883606:33188:1:0:0:0:916:1140557993:1134084657:1134084657:4096:8 burnside:~ # perl -e 'print join(":",stat("/etc/apt/sources.list")),"\n"' 770:2883606:33188:1:0:0:0:916:1140557993:1134084657:1134084657:4096:8 So even though /dev/hda2 and /dev/hda3 are different devices, mount is ending up mounting /dev/hda3 instead of /dev/hda2. The strace output is included. The output of cfdisk -P s is: Partition Table for /dev/hda First Last # Type Sector Sector Offset Length Filesystem Type (ID) Flag -- ------- ----------- ----------- ------ ----------- -------------------- ---- 1 Primary 0 51199154 63 51199155 HPFS/NTFS (07) Boot 2 Primary 51199155 119555729 0 68356575 Linux (83) None None 119555730 135171791* 0 15616062*Unusable None 3 Primary 135171792* 155252159 0 20080368*Linux (83) None 4 Primary 155252160 156296384 0 1044225 W95 Ext'd (LBA) (0F) None 5 Logical 155252160 156296384 63 1044225 Linux swap / So (82) None $ uname -a Linux burnside 2.6.15-1-k7 #1 Fri Feb 10 16:09:44 UTC 2006 i686 GNU/Linux It's also slightly sporadic: I managed to mount /dev/hda2 correctly from a command line once this evening, but it failed every other time with exactly the same error. Mystified, Julian
execve("/bin/mount", ["mount", "/burnside-unstable/"], [/* 11 vars */]) = 0 uname({sys="Linux", node="burnside", ...}) = 0 brk(0) = 0x805a000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=92674, ...}) = 0 old_mmap(NULL, 92674, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f13000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/libblkid.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\36\0\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0644, st_size=28556, ...}) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f12000 old_mmap(NULL, 31576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7f0a000 old_mmap(0xb7f11000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0xb7f11000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/libuuid.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320\n\0"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0644, st_size=8696, ...}) = 0 old_mmap(NULL, 11680, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7f07000 old_mmap(0xb7f09000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0xb7f09000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260O\1"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1262704, ...}) = 0 old_mmap(NULL, 1268668, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7dd1000 old_mmap(0xb7efd000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12c000) = 0xb7efd000 old_mmap(0xb7f05000, 7100, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7f05000 close(3) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dd0000 mprotect(0xb7efd000, 20480, PROT_READ) = 0 set_thread_area({entry_number:-1 -> 6, base_addr:0xb7dd06c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 munmap(0xb7f13000, 92674) = 0 brk(0) = 0x805a000 brk(0x807b000) = 0x807b000 umask(022) = 022 open("/dev/null", O_RDWR|O_LARGEFILE) = 3 close(3) = 0 getuid32() = 0 geteuid32() = 0 getgid32() = 0 getegid32() = 0 prctl(0x3, 0, 0, 0, 0) = 1 open("/etc/blkid.tab", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=72, ...}) = 0 fcntl64(3, F_GETFL) = 0 (flags O_RDONLY) fstat64(3, {st_mode=S_IFREG|0644, st_size=72, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f29000 _llseek(3, 0, [0], SEEK_CUR) = 0 read(3, "<device DEVNO=\"0x0305\" TIME=\"113"..., 4096) = 72 read(3, "", 4096) = 0 close(3) = 0 munmap(0xb7f29000, 4096) = 0 getuid32() = 0 geteuid32() = 0 lstat64("/etc/mtab", {st_mode=S_IFREG|0644, st_size=325, ...}) = 0 readlink("/burnside-unstable", 0xbff3a5fb, 4096) = -1 EINVAL (Invalid argument) umask(077) = 022 open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3 umask(022) = 077 fstat64(3, {st_mode=S_IFREG|0644, st_size=887, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f29000 read(3, "# /etc/fstab: static file system"..., 4096) = 887 read(3, "", 4096) = 0 close(3) = 0 munmap(0xb7f29000, 4096) = 0 stat64("/sbin/mount.ext3", 0xbff3c40c) = -1 ENOENT (No such file or directory) rt_sigprocmask(SIG_BLOCK, ~[TRAP SEGV RTMIN RT_1], NULL, 8) = 0 mount("/dev/hda2", "/burnside-unstable", "ext3", MS_POSIXACL|MS_ACTIVE|MS_NOUSER|0xec0000, 0x805a300) = 0 readlink("/dev", 0xbff3a46b, 4096) = -1 EINVAL (Invalid argument) readlink("/dev/hda2", 0xbff3a46b, 4096) = -1 EINVAL (Invalid argument) readlink("/burnside-unstable", 0xbff3a46b, 4096) = -1 EINVAL (Invalid argument) open("/etc/mtab", O_RDWR|O_CREAT|O_LARGEFILE, 0644) = 3 close(3) = 0 rt_sigaction(SIGHUP, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGINT, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGQUIT, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGILL, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGTRAP, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGABRT, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGBUS, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGFPE, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGKILL, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = -1 EINVAL (Invalid argument) rt_sigaction(SIGUSR1, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGSEGV, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGUSR2, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGPIPE, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGALRM, {0x804de1e, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGTERM, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 rt_sigaction(SIGSTKFLT, {0x804ddfe, ~[RTMIN RT_1], 0}, NULL, 8) = 0 getpid() = 23368 open("/etc/mtab~23368", O_WRONLY|O_CREAT|O_LARGEFILE, 0600) = 3 close(3) = 0 link("/etc/mtab~23368", "/etc/mtab~") = 0 unlink("/etc/mtab~23368") = 0 open("/etc/mtab~", O_WRONLY|O_LARGEFILE) = 3 fcntl64(3, F_SETLK64, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}, 0xbff3c400) = 0 close(3) = 0 umask(077) = 022 open("/etc/mtab", O_RDWR|O_APPEND|O_CREAT|O_LARGEFILE, 0666) = 3 umask(022) = 077 fstat64(3, {st_mode=S_IFREG|0644, st_size=325, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f29000 fstat64(3, {st_mode=S_IFREG|0644, st_size=325, ...}) = 0 _llseek(3, 0, [0], SEEK_SET) = 0 read(3, "/dev/hda3 / ext3 rw,errors=remou"..., 325) = 325 write(3, "/dev/hda2 /burnside-unstable ext"..., 41) = 41 close(3) = 0 munmap(0xb7f29000, 4096) = 0 unlink("/etc/mtab~") = 0 rt_sigprocmask(SIG_UNBLOCK, ~[TRAP SEGV RTMIN RT_1], NULL, 8) = 0 exit_group(0) = ?