patch-2.4.0-test10 linux/drivers/block/floppy.c
Next file: linux/drivers/block/ll_rw_blk.c
Previous file: linux/drivers/block/cpqarray.c
Back to the patch index
Back to the overall index
- Lines: 40
- Date:
Thu Oct 26 23:35:47 2000
- Orig file:
v2.4.0-test9/linux/drivers/block/floppy.c
- Orig date:
Sun Oct 8 10:50:15 2000
diff -u --recursive --new-file v2.4.0-test9/linux/drivers/block/floppy.c linux/drivers/block/floppy.c
@@ -3435,6 +3435,7 @@
static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
unsigned long param)
{
+#define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
#define OUT(c,x) case c: outparam = (const char *) (x); break
#define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
@@ -3502,7 +3503,7 @@
return -EINVAL;
/* permission checks */
- if (((cmd & 0x40) && !(filp->f_mode & 2)) ||
+ if (((cmd & 0x40) && !FD_IOCTL_ALLOWED) ||
((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
return -EPERM;
@@ -3708,6 +3709,8 @@
return -EIO;
}
+ filp->private_data = (void*) 0;
+
drive = DRIVE(inode->i_rdev);
if (drive >= N_DRIVE ||
!(allowed_drive_mask & (1 << drive)) ||
@@ -3774,6 +3777,13 @@
buffer_track = -1;
invalidate_buffers(MKDEV(FLOPPY_MAJOR,old_dev));
}
+
+ /* Allow ioctls if we have write-permissions even if read-only open.
+ * Needed so that programs such as fdrawcmd still can work on write
+ * protected disks */
+ if ((filp->f_mode & 2) ||
+ (inode->i_sb && (permission(inode,2) == 0)))
+ filp->private_data = (void*) 8;
if (UFDCS->rawcmd == 1)
UFDCS->rawcmd = 2;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)