cdrom: track if a cdrom_device_info was opened for data
authorChristoph Hellwig <hch@lst.de>
Thu, 8 Jun 2023 11:02:33 +0000 (13:02 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 12 Jun 2023 14:04:03 +0000 (08:04 -0600)
Set a flag when a cdrom_device_info is opened for writing, instead of
trying to figure out this at release time.  This will allow to eventually
remove the mode argument to the ->release block_device_operation as
nothing but the CDROM drivers uses that argument.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Phillip Potter <phil@philpotter.co.uk>
Acked-by: Christian Brauner <brauner@kernel.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Link: https://lore.kernel.org/r/20230608110258.189493-6-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/cdrom/cdrom.c
include/linux/cdrom.h

index 08abf1ffede0020adfc2fc81d93c75cb60d1fff2..adebac1bd210d92f03b8257f41ab94a62d92b57f 100644 (file)
@@ -1172,6 +1172,7 @@ int cdrom_open(struct cdrom_device_info *cdi, fmode_t mode)
                        ret = 0;
                        cdi->media_written = 0;
                }
+               cdi->opened_for_data = true;
        }
 
        if (ret)
@@ -1252,7 +1253,6 @@ static int check_for_audio_disc(struct cdrom_device_info *cdi,
 void cdrom_release(struct cdrom_device_info *cdi, fmode_t mode)
 {
        const struct cdrom_device_ops *cdo = cdi->ops;
-       int opened_for_data;
 
        cd_dbg(CD_CLOSE, "entering cdrom_release\n");
 
@@ -1270,14 +1270,12 @@ void cdrom_release(struct cdrom_device_info *cdi, fmode_t mode)
                }
        }
 
-       opened_for_data = !(cdi->options & CDO_USE_FFLAGS) ||
-               !(mode & FMODE_NDELAY);
-
        cdo->release(cdi);
-       if (cdi->use_count == 0) {      /* last process that closes dev*/
-               if (opened_for_data &&
-                   cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
+
+       if (cdi->use_count == 0 && cdi->opened_for_data) {
+               if (cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
                        cdo->tray_move(cdi, 1);
+               cdi->opened_for_data = false;
        }
 }
 EXPORT_SYMBOL(cdrom_release);
index 0a5db0b0c958a1b3269985d3559e28849bdb4e55..adcc9f2beb265356a2cc8d79bb4b70d70f43d461 100644 (file)
@@ -63,6 +63,7 @@ struct cdrom_device_info {
        unsigned short mmc3_profile;    /* current MMC3 profile */
        int (*exit)(struct cdrom_device_info *);
        int mrw_mode_page;
+       bool opened_for_data;
        __s64 last_media_change_ms;
 };