Date: Sat, 20 Dec 2008 11:50:05 GMT From: Jaakko Heinonen <jh@saunalahti.fi> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/95979: burncd(8) fails to fixate CDs Message-ID: <200812201150.mBKBo55n044624@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/95979; it has been noted by GNATS. From: Jaakko Heinonen <jh@saunalahti.fi> To: artboreb@yahoo.com, m.apitz@oclcpica.org, bug-followup@FreeBSD.org Cc: Alexander Best <alexbestms@math.uni-muenster.de> Subject: Re: bin/95979: burncd(8) fails to fixate CDs Date: Sat, 20 Dec 2008 13:45:11 +0200 On 2008-04-24, Jaakko Heinonen wrote: > The current default is 300 seconds for single speed write and the > patch increases it to 420 seconds. (The time is divided by burning > speed.) AFAIK cdrecord and wodim use also 420 seconds. Alexander Best reported that event 420 seconds is enough for his drive. I investigated the issue more and noticed that acd_test_ready() can really never return EBUSY which is expected in acd_fixate(). This causes acd_fixate() always to use method which just sleeps the expected fixation time. As we have seen this method is not very accurate. In sys/dev/ata/ata-queue.c (r186322) there's this piece of code: 397 if ((request->u.atapi.sense.key & ATA_SENSE_KEY_MASK ? 398 request->u.atapi.sense.key & ATA_SENSE_KEY_MASK : 399 request->error)) 400 request->result = EIO; The problem is that this code overwrites the old request->result value which might have been EBUSY. This is the reason for acd_test_ready() not reporting correctly the drive state. Here's a patch which changes it to set request->result only if it's not already set. --- patch begins here --- Index: sys/dev/ata/ata-queue.c =================================================================== --- sys/dev/ata/ata-queue.c (revision 186213) +++ sys/dev/ata/ata-queue.c (working copy) @@ -434,7 +434,8 @@ ata_completed(void *context, int dummy) printf("\n"); } - if ((request->u.atapi.sense.key & ATA_SENSE_KEY_MASK ? + if (!request->result && + (request->u.atapi.sense.key & ATA_SENSE_KEY_MASK ? request->u.atapi.sense.key & ATA_SENSE_KEY_MASK : request->error)) request->result = EIO; --- patch ends here --- This alone has been confirmed to fix the error with several drives: TSSTcorpCD/DVDW SH-S182D/SB02 SAMSUNG CD-R/RW SW-216B BS05 20010727/BS05 HL-DT-ST GCE-8481B/1.00 (LG) HL-DT-ST DVDRAM GSA-H10N/JL10 (LG) (Tested by: Alexander Best) I still think that it makes sense to also increase the timeout value. Here is a combined patch which also increases the timeout to 480 seconds: --- patch begins here --- Index: sys/dev/ata/atapi-cd.c =================================================================== --- sys/dev/ata/atapi-cd.c (revision 186354) +++ sys/dev/ata/atapi-cd.c (working copy) @@ -1067,7 +1067,7 @@ acd_fixate(device_t dev, int multisessio struct acd_softc *cdp = device_get_ivars(dev); int8_t ccb[16] = { ATAPI_CLOSE_TRACK, 0x01, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - int timeout = 5*60*2; + int timeout = 8*60*2; int error, dummy; struct write_param param; Index: sys/dev/ata/ata-queue.c =================================================================== --- sys/dev/ata/ata-queue.c (revision 186354) +++ sys/dev/ata/ata-queue.c (working copy) @@ -434,7 +434,8 @@ ata_completed(void *context, int dummy) printf("\n"); } - if ((request->u.atapi.sense.key & ATA_SENSE_KEY_MASK ? + if (!request->result && + (request->u.atapi.sense.key & ATA_SENSE_KEY_MASK ? request->u.atapi.sense.key & ATA_SENSE_KEY_MASK : request->error)) request->result = EIO; --- patch ends here --- -- Jaakko
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812201150.mBKBo55n044624>