On Fri, 2018-01-26 at 17:58 +0100, Michal Suchanek wrote: > +static int cdrom_tray_close(struct cdrom_device_info *cdi) > +{ > + int ret; > + > + ret = cdi->ops->tray_move(cdi, 0); > + if (ret || !cdi->ops->drive_status) > + return ret; > + > + return poll_event_interruptible(CDS_TRAY_OPEN != > + cdi->ops->drive_status(cdi, CDSL_CURRENT), 500); > +} > + > static > int open_for_common(struct cdrom_device_info *cdi, tracktype *tracks) > { > @@ -1048,7 +1062,9 @@ int open_for_common(struct cdrom_device_info *cdi, tracktype *tracks) > if (CDROM_CAN(CDC_CLOSE_TRAY) && > cdi->options & CDO_AUTO_CLOSE) { > cd_dbg(CD_OPEN, "trying to close the tray\n"); > - ret = cdo->tray_move(cdi, 0); > + ret = cdrom_tray_close(cdi); > + if (ret == -ERESTARTSYS) > + return ret; > if (ret) { > cd_dbg(CD_OPEN, "bummer. tried to close the tray but failed.\n"); > /* Ignore the error from the low > @@ -2312,7 +2328,8 @@ static int cdrom_ioctl_closetray(struct cdrom_device_info *cdi) > > if (!CDROM_CAN(CDC_CLOSE_TRAY)) > return -ENOSYS; > - return cdi->ops->tray_move(cdi, 0); > + > + return cdrom_tray_close(cdi); > } So this patch changes code that does not wait into code that potentially waits forever? Sorry but I don't think that's ideal. Please make sure that after a certain time (a few seconds?) the loop finishes. Thanks, Bart.