Commit cdccaa94 authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Jens Axboe

cdrom: move shared static to cdrom_device_info

The keeplocked variable in the cdrom driver is shared across multiple
drives, but set in per-device ioctls.  Move it to the per-device struct,
avoiding that the setting on one drive affects the driver's behavior
when closing another.

[ Impact: limit udev's confusion to one drive when a CD burning program
  unlocks the CD door at the end of burning. ]
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 37b40adf
...@@ -286,8 +286,6 @@ ...@@ -286,8 +286,6 @@
/* used to tell the module to turn on full debugging messages */ /* used to tell the module to turn on full debugging messages */
static bool debug; static bool debug;
/* used to keep tray locked at all times */
static int keeplocked;
/* default compatibility mode */ /* default compatibility mode */
static bool autoclose=1; static bool autoclose=1;
static bool autoeject; static bool autoeject;
...@@ -1204,7 +1202,7 @@ void cdrom_release(struct cdrom_device_info *cdi, fmode_t mode) ...@@ -1204,7 +1202,7 @@ void cdrom_release(struct cdrom_device_info *cdi, fmode_t mode)
cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name); cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name);
cdrom_dvd_rw_close_write(cdi); cdrom_dvd_rw_close_write(cdi);
if ((cdo->capability & CDC_LOCK) && !keeplocked) { if ((cdo->capability & CDC_LOCK) && !cdi->keeplocked) {
cdinfo(CD_CLOSE, "Unlocking door!\n"); cdinfo(CD_CLOSE, "Unlocking door!\n");
cdo->lock_door(cdi, 0); cdo->lock_door(cdi, 0);
} }
...@@ -1371,7 +1369,7 @@ static int cdrom_select_disc(struct cdrom_device_info *cdi, int slot) ...@@ -1371,7 +1369,7 @@ static int cdrom_select_disc(struct cdrom_device_info *cdi, int slot)
curslot = info->hdr.curslot; curslot = info->hdr.curslot;
kfree(info); kfree(info);
if (cdi->use_count > 1 || keeplocked) { if (cdi->use_count > 1 || cdi->keeplocked) {
if (slot == CDSL_CURRENT) { if (slot == CDSL_CURRENT) {
return curslot; return curslot;
} else { } else {
...@@ -2289,7 +2287,7 @@ static int cdrom_ioctl_eject(struct cdrom_device_info *cdi) ...@@ -2289,7 +2287,7 @@ static int cdrom_ioctl_eject(struct cdrom_device_info *cdi)
if (!CDROM_CAN(CDC_OPEN_TRAY)) if (!CDROM_CAN(CDC_OPEN_TRAY))
return -ENOSYS; return -ENOSYS;
if (cdi->use_count != 1 || keeplocked) if (cdi->use_count != 1 || cdi->keeplocked)
return -EBUSY; return -EBUSY;
if (CDROM_CAN(CDC_LOCK)) { if (CDROM_CAN(CDC_LOCK)) {
int ret = cdi->ops->lock_door(cdi, 0); int ret = cdi->ops->lock_door(cdi, 0);
...@@ -2316,7 +2314,7 @@ static int cdrom_ioctl_eject_sw(struct cdrom_device_info *cdi, ...@@ -2316,7 +2314,7 @@ static int cdrom_ioctl_eject_sw(struct cdrom_device_info *cdi,
if (!CDROM_CAN(CDC_OPEN_TRAY)) if (!CDROM_CAN(CDC_OPEN_TRAY))
return -ENOSYS; return -ENOSYS;
if (keeplocked) if (cdi->keeplocked)
return -EBUSY; return -EBUSY;
cdi->options &= ~(CDO_AUTO_CLOSE | CDO_AUTO_EJECT); cdi->options &= ~(CDO_AUTO_CLOSE | CDO_AUTO_EJECT);
...@@ -2447,7 +2445,7 @@ static int cdrom_ioctl_lock_door(struct cdrom_device_info *cdi, ...@@ -2447,7 +2445,7 @@ static int cdrom_ioctl_lock_door(struct cdrom_device_info *cdi,
if (!CDROM_CAN(CDC_LOCK)) if (!CDROM_CAN(CDC_LOCK))
return -EDRIVE_CANT_DO_THIS; return -EDRIVE_CANT_DO_THIS;
keeplocked = arg ? 1 : 0; cdi->keeplocked = arg ? 1 : 0;
/* /*
* Don't unlock the door on multiple opens by default, but allow * Don't unlock the door on multiple opens by default, but allow
......
...@@ -952,7 +952,8 @@ struct cdrom_device_info { ...@@ -952,7 +952,8 @@ struct cdrom_device_info {
char name[20]; /* name of the device type */ char name[20]; /* name of the device type */
/* per-device flags */ /* per-device flags */
__u8 sanyo_slot : 2; /* Sanyo 3 CD changer support */ __u8 sanyo_slot : 2; /* Sanyo 3 CD changer support */
__u8 reserved : 6; /* not used yet */ __u8 keeplocked : 1; /* CDROM_LOCKDOOR status */
__u8 reserved : 5; /* not used yet */
int cdda_method; /* see flags */ int cdda_method; /* see flags */
__u8 last_sense; __u8 last_sense;
__u8 media_written; /* dirty flag, DVD+RW bookkeeping */ __u8 media_written; /* dirty flag, DVD+RW bookkeeping */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment