PROBLEM: loop device doesnt reset it's flags

From: David Tritscher (ameuba@dingoblue.net.au)
Date: Tue Jan 09 2001 - 06:24:56 EST


[1.]

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/



This archive was generated by hypermail 2b29 : Mon Jan 15 2001 - 21:00:20 EST