The loop device doesnt seem to reset it's read-only status after it
gets used on a file that is on a read-only filesystem.
[6.]
(Pretty chopped up, but it demonstrates the problem)
# mount
/dev/hda1 on / type reiserfs (rw)
/dev/scd0 on /mnt/cdrom type iso9660 (ro,noexec,nosuid,nodev,sync,unhide)
# list /mnt/cdrom/floppy.img
-r--r--r-- 1 root root 1474560 Dec 16 15:40 /mnt/cdrom/floppy.img
# cp /mnt/cdrom/floppy.img /
# mount -o loop=/dev/loop0 /floppy.img /mnt/disk
# mount
/floppy.img on /mnt/disk type ext2 (rw,loop=/dev/loop0)
# umount /mnt/disk
# mount -o ro,loop=/dev/loop0 /floppy.img /mnt/disk
# mount
/floppy.img on /mnt/disk type ext2 (ro,loop=/dev/loop0)
# umount /mnt/disk
# mount -o rw,loop=/dev/loop0 /floppy.img /mnt/disk
# mount
/floppy.img on /mnt/disk type ext2 (rw,loop=/dev/loop0)
# umount /mnt/disk
(All that above is normal)
# mount -o loop=/dev/loop0 /mnt/cdrom/floppy.img /mnt/disk
# mount
/mnt/cdrom/floppy.img on /mnt/disk type ext2 (ro,loop=/dev/loop0)
# umount /mnt/disk
(Now loop0 is screwed)
# mount -o loop=/dev/loop0 /floppy.img /mnt/disk
mount: floppy.img is write-protected, mounting read-only
# mount
/floppy.img on /mnt/disk type ext2 (ro,loop=/dev/loop0)
# umount /mnt/disk
# mount -o rw,loop=/dev/loop0 /floppy.img /mnt/disk
mount: floppy.img is write-protected, mounting read-only
# mount
/floppy.img on /mnt/disk type ext2 (ro,loop=/dev/loop0)
# umount /mnt/disk
The same behavior as shown above is exhibited by:
losetup /dev/loop1 /mnt/cdrom/floppy.img
losetup -d /dev/loop1
now loop1 thinks it is always read-only.
[7.1.]
Linux dave 2.4.0 #1 i586 unknown
Kernel modules 2.4.0
Gnu C 2.95.2
Gnu Make 3.79.1
Binutils 2.10.1
Linux C Library 2.2
Dynamic linker ldd: version 1.9.9
Procps 2.0.7
Mount 2.10r
Net-tools 1.57
Console-tools 0.2.3
Sh-utils 2.0
Modules Loaded
[X.]
This patch seems to fix the problem on my machine.
--- linux/drivers/block/loop.c.orig Tue Jan 9 12:16:02 2001
+++ linux/drivers/block/loop.c Tue Jan 9 12:16:57 2001
@@ -412,13 +412,14 @@
error = -EINVAL;
inode = file->f_dentry->d_inode;
+ lo->lo_flags = 0;
+
if (S_ISBLK(inode->i_mode)) {
/* dentry will be wired, so... */
error = blkdev_get(inode->i_bdev, file->f_mode,
file->f_flags, BDEV_FILE);
lo->lo_device = inode->i_rdev;
- lo->lo_flags = 0;
/* Backed by a block device - don't need to hold onto
a file structure */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/