burncd 'blank' not terminating ?
Luigi Rizzo
rizzo at icir.org
Mon Dec 25 08:47:46 PST 2006
On Mon, Dec 25, 2006 at 05:12:04PM +0200, Dmitry Pryanishnikov wrote:
>
> Hello!
>
> On Fri, 22 Dec 2006, Sergey N. Voronkov wrote:
> >> just noticed, after upgrading to 6.2RC1, that
> >>
> >> luigi# burncd -f /dev/acd0 -v blank
> >> blanking CD, please wait..
> >>
> >> stays there forever. Eventually i gave up and ctrl-C and
> >> the application terminates, and i was able to write to
> >> the disk a valid image, which probably means that the
> >> disk had been blanked.
>
> Yes, well known RELENG_4 -> 6 (maybe even 5) regression. Same here with
>
> acd0: CDRW <CD-W540E/1.0C> at ata1-master UDMA33
>
> Worked fine under RELENG_4, fails to wait for completion under RELENG_6.
indeed, the two routines are different: in RELENG_4
static int
acd_get_progress(struct acd_softc *cdp, int *finished)
{
int8_t ccb[16] = { ATAPI_READ_CAPACITY, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 };
struct atapi_reqsense *sense = cdp->device->result;
char tmp[8];
if (atapi_test_ready(cdp->device) != EBUSY) {
if (atapi_queue_cmd(cdp->device, ccb, tmp, sizeof(tmp),
ATPR_F_READ, 30, NULL, NULL) != EBUSY) {
*finished = 100;
return 0;
}
}
if (sense->sksv)
*finished =
((sense->sk_specific2 | (sense->sk_specific1 << 8)) * 100) / 65535;
else
*finished = 0;
return 0;
}
in RELENG_6
static int
acd_get_progress(device_t dev, int *finished)
{
int8_t ccb[16] = { ATAPI_READ_CAPACITY, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 };
struct ata_request *request;
int8_t dummy[8];
if (!(request = ata_alloc_request()))
return ENOMEM;
request->dev = dev;
bcopy(ccb, request->u.atapi.ccb, 16);
request->data = dummy;
request->bytecount = sizeof(dummy);
request->transfersize = min(request->bytecount, 65534);
request->flags = ATA_R_ATAPI | ATA_R_READ;
request->timeout = 30;
ata_queue_request(request);
if (!request->error && request->u.atapi.sense.error & ATA_SENSE_VALID)
*finished = ((request->u.atapi.sense.specific2 |
(request->u.atapi.sense.specific1 << 8)) * 100) / 65535;
else
*finished = 0;
ata_free_request(request);
return 0;
}
and the wait routine in usr.sbin/burncd/burncd.c is the following:
in RELENG_4:
while (1) {
sleep(1);
error = ioctl(fd, CDRIOCGETPROGRESS, &percent);
if (percent > 0 && !quiet)
fprintf(stderr,
"%sing CD - %d %% done \r",
blank == CDR_B_ALL ?
"eras" : "blank", percent);
if (error || percent == 100)
break;
}
in RELENG_6:
while (1) {
sleep(1);
if (ioctl(fd, CDRIOCGETPROGRESS, &pct) == -1)
err(EX_IOERR,"ioctl(CDRIOGETPROGRESS)");
if (pct > 0 && !quiet)
fprintf(stderr,
"%sing CD - %d %% done \r",
blank == CDR_B_ALL ?
"eras" : "blank", pct);
if (pct == 100 || (pct == 0 && last > 90))
break;
last = pct;
}
i think you could try experimenting with the return values of
your drive (with the patched atapi-cd.c)
in order to find a good way to detect completion of
the blank operation
cheers
luigi
More information about the freebsd-stable
mailing list