patch-2.4.0-test8 linux/drivers/cdrom/cdrom.c
Next file: linux/drivers/cdrom/sbpcd.c
Previous file: linux/drivers/block/xor.c
Back to the patch index
Back to the overall index
- Lines: 153
- Date:
Tue Sep 5 13:46:15 2000
- Orig file:
v2.4.0-test7/linux/drivers/cdrom/cdrom.c
- Orig date:
Mon Jul 10 16:47:22 2000
diff -u --recursive --new-file v2.4.0-test7/linux/drivers/cdrom/cdrom.c linux/drivers/cdrom/cdrom.c
@@ -291,11 +291,13 @@
#endif
/* These are used to simplify getting data in from and back to user land */
-#define IOCTL_IN(arg, type, in) \
- copy_from_user_ret(&in, (type *) arg, sizeof in, -EFAULT)
+#define IOCTL_IN(arg, type, in) \
+ if (copy_from_user(&in, (type *) arg, sizeof in)) \
+ return -EFAULT;
#define IOCTL_OUT(arg, type, out) \
- copy_to_user_ret((type *) arg, &out, sizeof out, -EFAULT)
+ if (copy_to_user((type *) arg, &out, sizeof out)) \
+ return -EFAULT;
/* The (cdo->capability & ~cdi->mask & CDC_XXX) construct was used in
a lot of places. This macro makes the code more clear. */
@@ -784,6 +786,8 @@
if (!CDROM_CAN(CDC_SELECT_DISC))
return -EDRIVE_CANT_DO_THIS;
+ (void) cdi->ops->media_changed(cdi, slot);
+
if (slot == CDSL_NONE) {
/* set media changed bits, on both queues */
cdi->mc_flags = 0x3;
@@ -851,8 +855,8 @@
if (cdi == NULL || cdi->ops->media_changed == NULL)
return 0;
if (!CDROM_CAN(CDC_MEDIA_CHANGED))
- return 0;
- return (media_changed(cdi, 0));
+ return 0;
+ return media_changed(cdi, 0);
}
/* badly broken, I know. Is due for a fixup anytime. */
@@ -872,8 +876,7 @@
return;
}
/* Grab the TOC header so we can see how many tracks there are */
- ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
- if (ret) {
+ if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header))) {
if (ret == -ENOMEDIUM)
tracks->error = CDS_NO_DISC;
else
@@ -1516,12 +1519,13 @@
cdinfo(CD_DO_IOCTL, "entering CDROM_MEDIA_CHANGED\n");
if (!CDROM_CAN(CDC_MEDIA_CHANGED))
return -ENOSYS;
+
+ /* cannot select disc or select current disc */
if (!CDROM_CAN(CDC_SELECT_DISC) || arg == CDSL_CURRENT)
- /* cannot select disc or select current disc */
return media_changed(cdi, 1);
- if ((unsigned int)arg >= cdi->capacity) {
+
+ if ((unsigned int)arg >= cdi->capacity)
return -EINVAL;
- }
if ((ret = cdrom_read_mech_status(cdi, &info)))
return ret;
@@ -1570,10 +1574,10 @@
if (!CDROM_CAN(CDC_SELECT_DISC))
return -ENOSYS;
- if ((arg != CDSL_CURRENT) && (arg != CDSL_NONE)) {
- if ((int)arg >= cdi->capacity)
- return -EINVAL;
- }
+ if ((arg != CDSL_CURRENT) && (arg != CDSL_NONE))
+ if ((int)arg >= cdi->capacity)
+ return -EINVAL;
+
/* cdo->select_disc is a hook to allow a driver-specific
* way of seleting disc. However, since there is no
* equiv hook for cdrom_slot_status this may not
@@ -1601,8 +1605,9 @@
if (!CDROM_CAN(CDC_LOCK))
return -EDRIVE_CANT_DO_THIS;
keeplocked = arg ? 1 : 0;
- /* don't unlock the door on multiple opens */
- if ((cdi->use_count != 1) && !arg)
+ /* don't unlock the door on multiple opens,but allow root
+ * to do so */
+ if ((cdi->use_count != 1) && !arg && !capable(CAP_SYS_ADMIN))
return -EBUSY;
return cdo->lock_door(cdi, arg);
}
@@ -1834,7 +1839,6 @@
struct cdrom_device_ops *cdo = cdi->ops;
struct cdrom_generic_command cgc;
struct modesel_head mh;
- int ret;
memset(&mh, 0, sizeof(mh));
mh.block_desc_length = 0x08;
@@ -1852,14 +1856,7 @@
mh.block_length_med = (size >> 8) & 0xff;
mh.block_length_lo = size & 0xff;
- ret = cdo->generic_packet(cdi, &cgc);
- if (ret) {
- printk("switch_blocksize failed, ret %x ", ret);
- if (cgc.sense)
- printk("sense %02x.%02x.%02x", cgc.sense->sense_key, cgc.sense->asc, cgc.sense->ascq);
- printk("\n");
- }
- return ret;
+ return cdo->generic_packet(cdi, &cgc);
}
static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
@@ -1916,16 +1913,10 @@
}
cgc.sense = NULL;
ret = cdrom_read_cd(cdi, &cgc, lba, blocksize, 1);
- if (ret) {
- printk("read_cd failed, ret %x ", ret);
- if (cgc.sense)
- printk("sense %02x.%02x.%02x", cgc.sense->sense_key, cgc.sense->asc, cgc.sense->ascq);
- printk("\n");
- }
ret |= cdrom_switch_blocksize(cdi, blocksize);
}
if (!ret && copy_to_user((char *)arg, cgc.buffer, blocksize))
- ret = -EFAULT;
+ ret = -EFAULT;
kfree(cgc.buffer);
return ret;
}
@@ -1989,19 +1980,6 @@
IOCTL_OUT(arg, struct cdrom_subchnl, q);
/* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */
return 0;
- }
- case CDROMPLAYTRKIND: {
- struct cdrom_ti ti;
-
- cdinfo(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n");
- IOCTL_IN(arg, struct cdrom_ti, ti);
-
- cgc.cmd[0] = GPCMD_PLAY_AUDIO_TI;
- cgc.cmd[4] = ti.cdti_trk0;
- cgc.cmd[5] = ti.cdti_ind0;
- cgc.cmd[7] = ti.cdti_trk1;
- cgc.cmd[8] = ti.cdti_ind1;
- return cdo->generic_packet(cdi, &cgc);
}
case CDROMPLAYMSF: {
struct cdrom_msf msf;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)