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 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;