sa: write returns 0 = LEOM?
Dustin J. Mitchell
dustin at zmanda.com
Wed Jun 16 23:20:14 UTC 2010
I'm investigating a user bug report in Amanda:
http://forums.zmanda.com/showthread.php?t=2832
The problem boils down to a write(2) call for a SCSI tape device
(/dev/nsa0) returning 0 after quite a bit of data and a number of
filemarks have been written. Jean-Louis suspected that this was an
early warning EOM indication, and that a subsequent write() would
succeed, with Amanda having been duly warned that a physical EOM is
coming up. But looking at scsi_sa.c, this doesn't seem to be the
case. It looks like an early warning would result in a successful
write instead, because resid is set to zero.
cam/scsi/scsi_sa.c:
2418 /*
2419 * Handle filemark, end of tape, mismatched record sizes....
2420 * From this point out, we're only handling read/write cases.
2421 * Handle writes && reads differently.
2422 */
2423
2424 if (csio->cdb_io.cdb_bytes[0] == SA_WRITE) {
2425 if (sense_key == SSD_KEY_VOLUME_OVERFLOW) {
2426 csio->resid = resid;
2427 error = ENOSPC;
2428 } else if (sense->flags & SSD_EOM) {
2429 softc->flags |= SA_FLAG_EOM_PENDING;
2430 /*
2431 * Grotesque as it seems, the few times
2432 * I've actually seen a non-zero resid,
2433 * the tape drive actually lied and had
2434 * written all the data!.
2435 */
2436 csio->resid = 0;
2437 }
That said, I don't know my way around the kernel source, so I'm
probably missing something obvious. So:
1. What could cause a write syscall to return 0?
2. Since we will be using early warning in the next version of Amanda,
hints as to the best way to handle early warning from userspace would
be appreciated.
Thanks for any pointers!
Dustin
--
Open Source Storage Engineer
http://www.zmanda.com
More information about the freebsd-scsi
mailing list