Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f58a3f0 authored by Diego Elio Pettenò's avatar Diego Elio Pettenò Committed by Greg Kroah-Hartman
Browse files

cdrom: respect device capabilities during opening action



[ Upstream commit 366ba7c71ef77c08d06b18ad61b26e2df7352338 ]

Reading the TOC only works if the device can play audio, otherwise
these commands fail (and possibly bring the device to an unhealthy
state.)

Similarly, cdrom_mmc3_profile() should only be called if the device
supports generic packet commands.

To: Jens Axboe <axboe@kernel.dk>
Cc: linux-kernel@vger.kernel.org
Cc: linux-scsi@vger.kernel.org
Signed-off-by: default avatarDiego Elio Pettenò <flameeyes@flameeyes.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 9abb8f60
Loading
Loading
Loading
Loading
+11 −1
Original line number Original line Diff line number Diff line
@@ -998,6 +998,12 @@ static void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype *tracks)
	tracks->xa = 0;
	tracks->xa = 0;
	tracks->error = 0;
	tracks->error = 0;
	cd_dbg(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n");
	cd_dbg(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n");

	if (!CDROM_CAN(CDC_PLAY_AUDIO)) {
		tracks->error = CDS_NO_INFO;
		return;
	}

	/* Grab the TOC header so we can see how many tracks there are */
	/* Grab the TOC header so we can see how many tracks there are */
	ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
	ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
	if (ret) {
	if (ret) {
@@ -1164,6 +1170,7 @@ int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev,
		ret = open_for_data(cdi);
		ret = open_for_data(cdi);
		if (ret)
		if (ret)
			goto err;
			goto err;
		if (CDROM_CAN(CDC_GENERIC_PACKET))
			cdrom_mmc3_profile(cdi);
			cdrom_mmc3_profile(cdi);
		if (mode & FMODE_WRITE) {
		if (mode & FMODE_WRITE) {
			ret = -EROFS;
			ret = -EROFS;
@@ -2873,6 +2880,9 @@ int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written)
	   it doesn't give enough information or fails. then we return
	   it doesn't give enough information or fails. then we return
	   the toc contents. */
	   the toc contents. */
use_toc:
use_toc:
	if (!CDROM_CAN(CDC_PLAY_AUDIO))
		return -ENOSYS;

	toc.cdte_format = CDROM_MSF;
	toc.cdte_format = CDROM_MSF;
	toc.cdte_track = CDROM_LEADOUT;
	toc.cdte_track = CDROM_LEADOUT;
	if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))
	if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))