Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Jun 2010 17:52:46 -0500
From:      "Dustin J. Mitchell" <dustin@zmanda.com>
To:        freebsd-scsi@freebsd.org
Cc:        Jean-Louis Martineau <martineau@zmanda.com>
Subject:   sa: write returns 0 = LEOM?
Message-ID:  <AANLkTikULvhu5TRVDNAY59UvKII-BuBYBvDe83jQFLXR@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTikULvhu5TRVDNAY59UvKII-BuBYBvDe83jQFLXR>