* st: Fixup -ENOMEDIUM
@ 2006-10-05 9:26 Hannes Reinecke
2006-10-05 19:59 ` Kai Makisara
0 siblings, 1 reply; 3+ messages in thread
From: Hannes Reinecke @ 2006-10-05 9:26 UTC (permalink / raw)
To: SCSI Mailing List; +Cc: Kai.Makisara
[-- Attachment #1: Type: text/plain, Size: 624 bytes --]
Hi all,
currently the tape driver doesn't believe in ENOMEDIUM. Even if the
sense code from TUR indicates that no tape is present the command will
be retried; maybe the user is fast enough to slip a medium in in the
meantime ...
And even if not, it will return 'EIO' in any case.
This patch fixes the ENOMEDIUM handling: TUR will _not_ be retried if no
medium is present and the correct error number ENOMEDIUM will be set on
exit.
Please apply.
Cheers,
Hannes
--
Dr. Hannes Reinecke hare@suse.de
SuSE Linux Products GmbH S390 & zSeries
Maxfeldstraße 5 +49 911 74053 688
90409 Nürnberg http://www.suse.de
[-- Attachment #2: st-no-tape.diff --]
[-- Type: text/x-patch, Size: 1539 bytes --]
st: Fix no medium handling
Currently the 'st' driver doesn't believe in -ENOMEDIUM.
Whenever the sense code indicates 'No tape' we might as well
return that status instead of retrying for ages.
And even then we really should return that error code to userland.
Signed-off-by: Hannes Reinecke <hare@suse.de>
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index 7f669b6..b77fd61 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -877,6 +877,12 @@ static int test_ready(struct scsi_tape *
}
if (scode == NOT_READY) {
+ if ((STp->device)->scsi_level >= SCSI_2 &&
+ cmdstatp->sense_hdr.asc == 0x3a) {
+ /* Early exit if there is no tape */
+ retval = CHKRES_NO_TAPE;
+ break;
+ }
if (waits < max_wait) {
if (msleep_interruptible(1000)) {
retval = (-EINTR);
@@ -885,14 +891,9 @@ static int test_ready(struct scsi_tape *
waits++;
continue;
}
- else {
- if ((STp->device)->scsi_level >= SCSI_2 &&
- cmdstatp->sense_hdr.asc == 0x3a) /* Check ASC */
- retval = CHKRES_NO_TAPE;
- else
- retval = CHKRES_NOT_READY;
- break;
- }
+ /* Accept we won't be getting anywhere */
+ retval = CHKRES_NOT_READY;
+ break;
}
}
@@ -1177,7 +1178,10 @@ static int st_open(struct inode *inode,
goto err_out;
if ((filp->f_flags & O_NONBLOCK) == 0 &&
retval != CHKRES_READY) {
- retval = (-EIO);
+ if (STp->ready == ST_NO_TAPE)
+ retval = (-ENOMEDIUM);
+ else
+ retval = (-EIO);
goto err_out;
}
return 0;
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: st: Fixup -ENOMEDIUM
2006-10-05 9:26 st: Fixup -ENOMEDIUM Hannes Reinecke
@ 2006-10-05 19:59 ` Kai Makisara
2006-10-06 9:19 ` Hannes Reinecke
0 siblings, 1 reply; 3+ messages in thread
From: Kai Makisara @ 2006-10-05 19:59 UTC (permalink / raw)
To: Hannes Reinecke; +Cc: SCSI Mailing List
On Thu, 5 Oct 2006, Hannes Reinecke wrote:
> Hi all,
>
> currently the tape driver doesn't believe in ENOMEDIUM. Even if the sense code
> from TUR indicates that no tape is present the command will be retried; maybe
> the user is fast enough to slip a medium in in the meantime ...
> And even if not, it will return 'EIO' in any case.
>
The driver implements (up to a point) the Single Unix Specification: if
O_NONBLOCK is clear, open() shall wait until the device is ready or
available. It does not wait indefinitely but implements a timeout. This is
the behaviour I found experimentally in some other Unices.
> This patch fixes the ENOMEDIUM handling: TUR will _not_ be retried if no
> medium is present and the correct error number ENOMEDIUM will be set on exit.
>
It is true that st_open() does not currently return ENOMEDIUM and your fix
for this is correct.
> Please apply.
>
I don't think that the first and second parts should be applied. The third
part fixes a bug and it should be applied. I include at the end a diff
containing only that part.
Thanks,
Kai
-----------8<--------------------
Fix st_open() to return -ENOMEDIUM instead of -EIO if no medium is
found.
Signed-off-by: Kai Makisara <kai.makisara@kolumbus.fi>
--- linux-2.6.18/drivers/scsi/st.c.org 2006-10-05 22:36:15.000000000 +0300
+++ linux-2.6.18/drivers/scsi/st.c 2006-10-05 22:46:12.000000000 +0300
@@ -1177,7 +1177,10 @@ static int st_open(struct inode *inode,
goto err_out;
if ((filp->f_flags & O_NONBLOCK) == 0 &&
retval != CHKRES_READY) {
- retval = (-EIO);
+ if (STp->ready == NO_TAPE)
+ retval = (-ENOMEDIUM);
+ else
+ retval = (-EIO);
goto err_out;
}
return 0;
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: st: Fixup -ENOMEDIUM
2006-10-05 19:59 ` Kai Makisara
@ 2006-10-06 9:19 ` Hannes Reinecke
0 siblings, 0 replies; 3+ messages in thread
From: Hannes Reinecke @ 2006-10-06 9:19 UTC (permalink / raw)
To: Kai Makisara; +Cc: SCSI Mailing List
Kai Makisara wrote:
> On Thu, 5 Oct 2006, Hannes Reinecke wrote:
>
>> Hi all,
>>
>> currently the tape driver doesn't believe in ENOMEDIUM. Even if the sense code
>> from TUR indicates that no tape is present the command will be retried; maybe
>> the user is fast enough to slip a medium in in the meantime ...
>> And even if not, it will return 'EIO' in any case.
>>
> The driver implements (up to a point) the Single Unix Specification: if
> O_NONBLOCK is clear, open() shall wait until the device is ready or
> available. It does not wait indefinitely but implements a timeout. This is
> the behaviour I found experimentally in some other Unices.
>
Ah. Ok; you're the maintainer, you get to decide.
>> This patch fixes the ENOMEDIUM handling: TUR will _not_ be retried if no
>> medium is present and the correct error number ENOMEDIUM will be set on exit.
>>
> It is true that st_open() does not currently return ENOMEDIUM and your fix
> for this is correct.
>
>> Please apply.
>>
> I don't think that the first and second parts should be applied. The third
> part fixes a bug and it should be applied. I include at the end a diff
> containing only that part.
>
Right. Thanks.
> -----------8<--------------------
>
> Fix st_open() to return -ENOMEDIUM instead of -EIO if no medium is
> found.
>
> Signed-off-by: Kai Makisara <kai.makisara@kolumbus.fi>
>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke hare@suse.de
SuSE Linux Products GmbH S390 & zSeries
Maxfeldstraße 5 +49 911 74053 688
90409 Nürnberg http://www.suse.de
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2006-10-06 9:19 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-10-05 9:26 st: Fixup -ENOMEDIUM Hannes Reinecke
2006-10-05 19:59 ` Kai Makisara
2006-10-06 9:19 ` Hannes Reinecke
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox