2010-02-15 22:32:51

by Roel Kluin

[permalink] [raw]
Subject: [PATCH] USB: misplaced parenthesis

The parenthesis was misplaced

Signed-off-by: Roel Kluin <[email protected]>
---
Is this maybe, as the comment states, why blanking a cdrw at speed 4
was unreliable?

diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
index b62a288..b958db5 100644
--- a/drivers/usb/storage/shuttle_usbat.c
+++ b/drivers/usb/storage/shuttle_usbat.c
@@ -1645,8 +1645,8 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)

if ((result = usbat_write_block(us,
USBAT_ATA, srb->cmnd, 12,
- (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0) !=
- USB_STOR_TRANSPORT_GOOD)) {
+ (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0)) !=
+ USB_STOR_TRANSPORT_GOOD) {
return result;
}


2010-02-15 22:44:11

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH] USB: misplaced parenthesis

On Mon, 2010-02-15 at 23:40 +0100, Roel Kluin wrote:
> The parenthesis was misplaced
>
> Signed-off-by: Roel Kluin <[email protected]>
> ---
> Is this maybe, as the comment states, why blanking a cdrw at speed 4
> was unreliable?
>
> diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
> index b62a288..b958db5 100644
> --- a/drivers/usb/storage/shuttle_usbat.c
> +++ b/drivers/usb/storage/shuttle_usbat.c
> @@ -1645,8 +1645,8 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)
>
> if ((result = usbat_write_block(us,
> USBAT_ATA, srb->cmnd, 12,
> - (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0) !=
> - USB_STOR_TRANSPORT_GOOD)) {
> + (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0)) !=
> + USB_STOR_TRANSPORT_GOOD) {
> return result;
> }

I think it'd be better if you hoisted the set'n'test out of the if()

Isn't this the current logic?

result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
result = result != USB_STOR_TRANSPORT_GOOD;
if (result)
return result;

I wonder if it should be:

result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
if (result != USB_STOR_TRANSPORT_GOOD)
return result;

2010-02-16 11:09:00

by Roel Kluin

[permalink] [raw]
Subject: Re: [PATCH] USB: misplaced parenthesis

> I think it'd be better if you hoisted the set'n'test out of the if()

ok, I agree.

> Isn't this the current logic?
>
> result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
> srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
> result = result != USB_STOR_TRANSPORT_GOOD;
> if (result)
> return result;

Thanks for your comments, Yes that was the current logic, which I thought
was wrong, but now I think it could also be obscurely written but right:

in drivers/usb/storage/transport.h line 100 note the definitions:

#define USB_STOR_TRANSPORT_GOOD 0 /* Transport good, command good */
#define USB_STOR_TRANSPORT_FAILED 1 /* Transport good, command failed */
#define USB_STOR_TRANSPORT_NO_SENSE 2 /* Command failed, no auto-sense */
#define USB_STOR_TRANSPORT_ERROR 3 /* Transport bad (i.e. device dead) */

With the current logic usbat_hp8200e_transport() returns TRANSPORT_FAILED,
even if usbat_write_block() returned TRANSPORT_NO_SENSE or TRANSPORT_ERROR.

This could be intended, but then the author chose a very obscure way to write:

if (usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0) !=
USB_STOR_TRANSPORT_GOOD)
return USB_STOR_TRANSPORT_FAILED;

Or was the parenthesis misplaced and should it really be:

result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);

if (result != USB_STOR_TRANSPORT_GOOD)
return result;

Maybe someone with the specs/more knowledge of this driver could look into
this?

Thanks, Roel

2010-02-16 15:52:22

by Alan Stern

[permalink] [raw]
Subject: Re: [PATCH] USB: misplaced parenthesis

On Tue, 16 Feb 2010, Roel Kluin wrote:

> > I think it'd be better if you hoisted the set'n'test out of the if()
>
> ok, I agree.
>
> > Isn't this the current logic?
> >
> > result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
> > srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
> > result = result != USB_STOR_TRANSPORT_GOOD;
> > if (result)
> > return result;
>
> Thanks for your comments, Yes that was the current logic, which I thought
> was wrong, but now I think it could also be obscurely written but right:
>
> in drivers/usb/storage/transport.h line 100 note the definitions:
>
> #define USB_STOR_TRANSPORT_GOOD 0 /* Transport good, command good */
> #define USB_STOR_TRANSPORT_FAILED 1 /* Transport good, command failed */
> #define USB_STOR_TRANSPORT_NO_SENSE 2 /* Command failed, no auto-sense */
> #define USB_STOR_TRANSPORT_ERROR 3 /* Transport bad (i.e. device dead) */
>
> With the current logic usbat_hp8200e_transport() returns TRANSPORT_FAILED,
> even if usbat_write_block() returned TRANSPORT_NO_SENSE or TRANSPORT_ERROR.
>
> This could be intended, but then the author chose a very obscure way to write:
>
> if (usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
> srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0) !=
> USB_STOR_TRANSPORT_GOOD)
> return USB_STOR_TRANSPORT_FAILED;
>
> Or was the parenthesis misplaced and should it really be:
>
> result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
> srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
>
> if (result != USB_STOR_TRANSPORT_GOOD)
> return result;
>
> Maybe someone with the specs/more knowledge of this driver could look into
> this?

It seems pretty clear that your patch was correct and the parens were
misplaced. In usb-storage, transport routines like
usbat_hp8200e_transport() are supposed to return one of the
USB_STOR_TRANSPORT_* codes, not a Boolean value.

I do agree with Joe that it would be better form to separate the
function call and the "if" into two statements, as in your second
version above. Compare with the code a few lines higher:

if ( (result = usbat_multiple_write(us,
registers, data, 7)) != USB_STOR_TRANSPORT_GOOD) {
return result;
}

The meaning is clear, even though this also unnecessarily squeezes a
function call and a test into one statement and includes unneeded {}'s.

Alan Stern

2010-02-17 10:43:00

by Roel Kluin

[permalink] [raw]
Subject: Re: [PATCH] USB: misplaced parenthesis

Due to a misplaced parenthesis the usbat_write_block() return value was not
stored, but a boolean. USB_STOR_TRANSPORT_NO_SENSE and USB_STOR_TRANSPORT_ERROR
were returned as USB_STOR_TRANSPORT_FAILED.

Signed-off-by: Roel Kluin <[email protected]>
---
>> in drivers/usb/storage/transport.h line 100 note the definitions:
>>
>> #define USB_STOR_TRANSPORT_GOOD 0 /* Transport good, command good */
>> #define USB_STOR_TRANSPORT_FAILED 1 /* Transport good, command failed */
>> #define USB_STOR_TRANSPORT_NO_SENSE 2 /* Command failed, no auto-sense */
>> #define USB_STOR_TRANSPORT_ERROR 3 /* Transport bad (i.e. device dead) */

> It seems pretty clear that your patch was correct and the parens were
> misplaced. In usb-storage, transport routines like
> usbat_hp8200e_transport() are supposed to return one of the
> USB_STOR_TRANSPORT_* codes, not a Boolean value.
>
> I do agree with Joe that it would be better form to separate the
> function call and the "if" into two statements, as in your second
> version above.

Ok, thanks for comments, This should fix and separate the assignment as desired.

Roel

diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
index b62a288..bd3f415 100644
--- a/drivers/usb/storage/shuttle_usbat.c
+++ b/drivers/usb/storage/shuttle_usbat.c
@@ -1628,10 +1628,10 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)
return USB_STOR_TRANSPORT_ERROR;
}

- if ( (result = usbat_multiple_write(us,
- registers, data, 7)) != USB_STOR_TRANSPORT_GOOD) {
+ result = usbat_multiple_write(us, registers, data, 7);
+
+ if (result != USB_STOR_TRANSPORT_GOOD)
return result;
- }

/*
* Write the 12-byte command header.
@@ -1643,12 +1643,11 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)
* AT SPEED 4 IS UNRELIABLE!!!
*/

- if ((result = usbat_write_block(us,
- USBAT_ATA, srb->cmnd, 12,
- (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0) !=
- USB_STOR_TRANSPORT_GOOD)) {
+ result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
+ srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
+
+ if (result != USB_STOR_TRANSPORT_GOOD)
return result;
- }

/* If there is response data to be read in then do it here. */