diff mbox series

[v2,2/8] cdrom: factor out common open_for_* code

Message ID da032629db4a770a5f98ff400b91b44873cbdf46.1571834862.git.msuchanek@suse.de (mailing list archive)
State New, archived
Headers show
Series Fix cdrom autoclose. | expand

Commit Message

Michal Suchanek Oct. 23, 2019, 12:52 p.m. UTC
The open_for_audio and open_for_data copies are bitrotten in different
ways already and will need to update the autoclose logic in both.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
---
 drivers/cdrom/cdrom.c | 96 +++++++++++++++----------------------------
 1 file changed, 34 insertions(+), 62 deletions(-)

Comments

Christoph Hellwig Oct. 24, 2019, 2:19 a.m. UTC | #1
>  static
> -int open_for_data(struct cdrom_device_info *cdi)
> +int open_for_common(struct cdrom_device_info *cdi, tracktype *tracks)

Please fix the coding style.  static never should be on a line of its
own..

>  			} else {
>  				cd_dbg(CD_OPEN, "bummer. this drive can't close the tray.\n");
> -				ret=-ENOMEDIUM;
> -				goto clean_up_and_return;
> +				return -ENOMEDIUM;

Can you revert the polarity of the if opening the block before and
return early for the -ENOMEDIUM case to save on leven of indentation?

>  			if ((ret == CDS_NO_DISC) || (ret==CDS_TRAY_OPEN)) {

If you touch the whole area please remove the inner braces and add the
proper spaces around the second ==.

> +static
> +int open_for_data(struct cdrom_device_info *cdi)

Same issue with the static here.
Michal Suchanek Oct. 24, 2019, 8:50 a.m. UTC | #2
On Wed, Oct 23, 2019 at 07:19:58PM -0700, Christoph Hellwig wrote:
> >  static
> > -int open_for_data(struct cdrom_device_info *cdi)
> > +int open_for_common(struct cdrom_device_info *cdi, tracktype *tracks)
> 
> Please fix the coding style.  static never should be on a line of its
> own..

That's fine.

> 
> >  			} else {
> >  				cd_dbg(CD_OPEN, "bummer. this drive can't close the tray.\n");
> > -				ret=-ENOMEDIUM;
> > -				goto clean_up_and_return;
> > +				return -ENOMEDIUM;
> 
> Can you revert the polarity of the if opening the block before and
> return early for the -ENOMEDIUM case to save on leven of indentation?

Then I will get complaints I do unrelated changes and it's hard to
review. The code gets removed later anyway.

Thanks

Michal
Matthew Wilcox Oct. 24, 2019, 1:23 p.m. UTC | #3
On Wed, Oct 23, 2019 at 07:19:58PM -0700, Christoph Hellwig wrote:
> >  static
> > -int open_for_data(struct cdrom_device_info *cdi)
> > +int open_for_common(struct cdrom_device_info *cdi, tracktype *tracks)
> 
> Please fix the coding style.  static never should be on a line of its
> own..

It's OK to have the static on a line by itself; it's having 'static int'
on a line by itself that Linus gets unhappy about because he can't use
grep to see the return type.

But there's no need for it to be on a line by itself here, it all fits fine
in 80 columns.
Christoph Hellwig Oct. 25, 2019, 2:38 a.m. UTC | #4
On Thu, Oct 24, 2019 at 06:23:14AM -0700, Matthew Wilcox wrote:
> On Wed, Oct 23, 2019 at 07:19:58PM -0700, Christoph Hellwig wrote:
> > >  static
> > > -int open_for_data(struct cdrom_device_info *cdi)
> > > +int open_for_common(struct cdrom_device_info *cdi, tracktype *tracks)
> > 
> > Please fix the coding style.  static never should be on a line of its
> > own..
> 
> It's OK to have the static on a line by itself; it's having 'static int'
> on a line by itself that Linus gets unhappy about because he can't use
> grep to see the return type.

Sorry, but independent of any preference just looking at the codebases
proves you wrong.  All on one line is the most common style, but not
by much, followed by static + type.  Just static is just in a few crazy
Christoph Hellwig Oct. 25, 2019, 2:39 a.m. UTC | #5
On Thu, Oct 24, 2019 at 10:50:14AM +0200, Michal Suchánek wrote:
> Then I will get complaints I do unrelated changes and it's hard to
> review. The code gets removed later anyway.

If you refactor you you pretty much have a card blanche for the
refactored code and the direct surroundings.
Michal Suchanek Oct. 25, 2019, 10:42 a.m. UTC | #6
On Thu, Oct 24, 2019 at 07:39:08PM -0700, Christoph Hellwig wrote:
> On Thu, Oct 24, 2019 at 10:50:14AM +0200, Michal Suchánek wrote:
> > Then I will get complaints I do unrelated changes and it's hard to
> > review. The code gets removed later anyway.
> 
> If you refactor you you pretty much have a card blanche for the
> refactored code and the direct surroundings.

This is different from what other reviewers say:

https://lore.kernel.org/lkml/1517245320.2687.14.camel@wdc.com/

Either way, this code is removed in a later patch so this discussion is
moot. It makes sense to have a bisection point here in case something
goes wrong but it is pointless to argue about the code structure
inherited from the previous revision.

Thanks

Michal
Finn Thain Oct. 26, 2019, 6:46 a.m. UTC | #7
On Fri, 25 Oct 2019, Michal Such?nek wrote:

> On Thu, Oct 24, 2019 at 07:39:08PM -0700, Christoph Hellwig wrote:
> > On Thu, Oct 24, 2019 at 10:50:14AM +0200, Michal Such?nek wrote:
> > > Then I will get complaints I do unrelated changes and it's hard to
> > > review. The code gets removed later anyway.
> > 
> > If you refactor you you pretty much have a card blanche for the
> > refactored code and the direct surroundings.
> 
> This is different from what other reviewers say:
> 
> https://lore.kernel.org/lkml/1517245320.2687.14.camel@wdc.com/
> 

I don't see any inconsistency there. Both reviews are valuable.

In general, different reviewers may give contradictory advice. Reviewers 
probably even contradict themselves eventually. Yet it rarely happens that 
the same patch gets contradictory reviews. If it did, you might well 
complain.

> Either way, this code is removed in a later patch so this discussion is
> moot.
> 
> It makes sense to have a bisection point here in case something
> goes wrong but it is pointless to argue about the code structure
> inherited from the previous revision.

A patch may refactor some code only to have the next patch remove that 
code. This doesn't generally mean that the former patch is redundant.

The latter patch may end up committed and subsequently reverted. The 
latter patch may become easier to review because of the former. The former 
patch may be eligible for -stable. The former patch may be the result of 
an automatic process. And so on.

I don't know what Christoph had in mind here but he's usually right, so 
it's worth asking.
diff mbox series

Patch

diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c
index 2ad6b73482fe..f504ca70f93f 100644
--- a/drivers/cdrom/cdrom.c
+++ b/drivers/cdrom/cdrom.c
@@ -1046,12 +1046,12 @@  static void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype *tracks)
 }
 
 static
-int open_for_data(struct cdrom_device_info *cdi)
+int open_for_common(struct cdrom_device_info *cdi, tracktype *tracks)
 {
 	int ret;
 	const struct cdrom_device_ops *cdo = cdi->ops;
-	tracktype tracks;
-	cd_dbg(CD_OPEN, "entering open_for_data\n");
+
+	cd_dbg(CD_OPEN, "entering open_for_common\n");
 	/* Check if the driver can report drive status.  If it can, we
 	   can do clever things.  If it can't, well, we at least tried! */
 	if (cdo->drive_status != NULL) {
@@ -1071,37 +1071,45 @@  int open_for_data(struct cdrom_device_info *cdi)
 					couldn't close the tray.  We only care 
 					that there is no disc in the drive, 
 					since that is the _REAL_ problem here.*/
-					ret=-ENOMEDIUM;
-					goto clean_up_and_return;
+					return -ENOMEDIUM;
 				}
 			} else {
 				cd_dbg(CD_OPEN, "bummer. this drive can't close the tray.\n");
-				ret=-ENOMEDIUM;
-				goto clean_up_and_return;
+				return -ENOMEDIUM;
 			}
 			/* Ok, the door should be closed now.. Check again */
 			ret = cdo->drive_status(cdi, CDSL_CURRENT);
 			if ((ret == CDS_NO_DISC) || (ret==CDS_TRAY_OPEN)) {
 				cd_dbg(CD_OPEN, "bummer. the tray is still not closed.\n");
 				cd_dbg(CD_OPEN, "tray might not contain a medium\n");
-				ret=-ENOMEDIUM;
-				goto clean_up_and_return;
+				return -ENOMEDIUM;
 			}
 			cd_dbg(CD_OPEN, "the tray is now closed\n");
 		}
-		/* the door should be closed now, check for the disc */
-		ret = cdo->drive_status(cdi, CDSL_CURRENT);
-		if (ret!=CDS_DISC_OK) {
-			ret = -ENOMEDIUM;
-			goto clean_up_and_return;
-		}
+		if (ret != CDS_DISC_OK)
+			return -ENOMEDIUM;
 	}
-	cdrom_count_tracks(cdi, &tracks);
-	if (tracks.error == CDS_NO_DISC) {
+	cdrom_count_tracks(cdi, tracks);
+	if (tracks->error == CDS_NO_DISC) {
 		cd_dbg(CD_OPEN, "bummer. no disc.\n");
-		ret=-ENOMEDIUM;
-		goto clean_up_and_return;
+		return -ENOMEDIUM;
 	}
+
+	return 0;
+}
+
+static
+int open_for_data(struct cdrom_device_info *cdi)
+{
+	int ret;
+	const struct cdrom_device_ops *cdo = cdi->ops;
+	tracktype tracks;
+
+	cd_dbg(CD_OPEN, "entering open_for_data\n");
+	ret = open_for_common(cdi, &tracks);
+	if (ret)
+		goto clean_up_and_return;
+
 	/* CD-Players which don't use O_NONBLOCK, workman
 	 * for example, need bit CDO_CHECK_TYPE cleared! */
 	if (tracks.data==0) {
@@ -1208,53 +1216,17 @@  int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev,
 /* This code is similar to that in open_for_data. The routine is called
    whenever an audio play operation is requested.
 */
-static int check_for_audio_disc(struct cdrom_device_info *cdi,
-				const struct cdrom_device_ops *cdo)
+static int check_for_audio_disc(struct cdrom_device_info *cdi)
 {
         int ret;
 	tracktype tracks;
 	cd_dbg(CD_OPEN, "entering check_for_audio_disc\n");
 	if (!(cdi->options & CDO_CHECK_TYPE))
 		return 0;
-	if (cdo->drive_status != NULL) {
-		ret = cdo->drive_status(cdi, CDSL_CURRENT);
-		cd_dbg(CD_OPEN, "drive_status=%d\n", ret);
-		if (ret == CDS_TRAY_OPEN) {
-			cd_dbg(CD_OPEN, "the tray is open...\n");
-			/* can/may i close it? */
-			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);
-				if (ret) {
-					cd_dbg(CD_OPEN, "bummer. tried to close tray but failed.\n");
-					/* Ignore the error from the low
-					level driver.  We don't care why it
-					couldn't close the tray.  We only care 
-					that there is no disc in the drive, 
-					since that is the _REAL_ problem here.*/
-					return -ENOMEDIUM;
-				}
-			} else {
-				cd_dbg(CD_OPEN, "bummer. this driver can't close the tray.\n");
-				return -ENOMEDIUM;
-			}
-			/* Ok, the door should be closed now.. Check again */
-			ret = cdo->drive_status(cdi, CDSL_CURRENT);
-			if ((ret == CDS_NO_DISC) || (ret==CDS_TRAY_OPEN)) {
-				cd_dbg(CD_OPEN, "bummer. the tray is still not closed.\n");
-				return -ENOMEDIUM;
-			}	
-			if (ret!=CDS_DISC_OK) {
-				cd_dbg(CD_OPEN, "bummer. disc isn't ready.\n");
-				return -EIO;
-			}	
-			cd_dbg(CD_OPEN, "the tray is now closed\n");
-		}	
-	}
-	cdrom_count_tracks(cdi, &tracks);
-	if (tracks.error) 
-		return(tracks.error);
+
+	ret = open_for_common(cdi, &tracks);
+	if (ret)
+		return ret;
 
 	if (tracks.audio==0)
 		return -EMEDIUMTYPE;
@@ -2725,7 +2697,7 @@  static int cdrom_ioctl_play_trkind(struct cdrom_device_info *cdi,
 	if (copy_from_user(&ti, argp, sizeof(ti)))
 		return -EFAULT;
 
-	ret = check_for_audio_disc(cdi, cdi->ops);
+	ret = check_for_audio_disc(cdi);
 	if (ret)
 		return ret;
 	return cdi->ops->audio_ioctl(cdi, CDROMPLAYTRKIND, &ti);
@@ -2773,7 +2745,7 @@  static int cdrom_ioctl_audioctl(struct cdrom_device_info *cdi,
 
 	if (!CDROM_CAN(CDC_PLAY_AUDIO))
 		return -ENOSYS;
-	ret = check_for_audio_disc(cdi, cdi->ops);
+	ret = check_for_audio_disc(cdi);
 	if (ret)
 		return ret;
 	return cdi->ops->audio_ioctl(cdi, cmd, NULL);