(timeout) error during cd fixation

Alexander Best alexbestms at math.uni-muenster.de
Sun Dec 14 14:40:30 UTC 2008

hi there,

i am getting the following error when using burncd to burn a regular data-iso:

burncd: ioctl(CDRIOCFIXATE): Input/output error

this is how i usually run burncd:

burncd -s max -e -f /dev/acd0 data xyz.iso fixate

however i'm able to mount the cd although fixation fails. running dd
if=/dev/acd0 of=check.iso bs=2048 gives me this warning:

dd: /dev/acd0: Input/output error

doing a diff between xyz.iso and check.iso reveals no differences. so the only
problem is the fixation of the cd. i believe this is a timeout problem,
because if i run burncd with speed set to 1 the cd gets fixated just fine (no
ioctl(CDRIOCFIXATE) error anymore). however the the dd-warning still comes up.
i don't really know why the dd-warning doesn't dissapear. maybe this is a
completly different issue? no idea.

as far as i remember this issue (ioctl(CDRIOCFIXATE): Input/output error) has
always been present in burncd (since RELENG4 oder RELENG5).

i found a PR in feedback state dealing with this problem
(http://www.freebsd.org/cgi/query-pr.cgi?pr=95979&cat=bin). the PR includes a
patch which i applied. however that didn't solve the issue.

the problem seems to be the timeout variable used in acd_fixate() in
sys/dev/ata/atapi-cd.c. it get's set to:

int timeout = 5*60*2;

changing timeout to a higher value doesn't make much of a difference though,
because it gets altered a bit further down in the src. that's the reason the
patch didn't fix the issue for me. this is the code where timout gets altered

    /* some drives just return ready, wait for the expected fixate time */
    if ((error = acd_test_ready(dev)) != EBUSY) {
        timeout = timeout / (cdp->cap.cur_write_speed / 177);
        pause("acdfix", timeout * hz / 2);
        return acd_test_ready(dev);

it seems my drive doesn't return EBUSY, although it's still busy. that's why
burncd runs this delay block. the problem seems to be that timeout gets set

    timeout / (cdp->cap.cur_write_speed / 177)

which in my case is too low.

maybe somebody can take a brief look an growisofs to see which timeout values
during fixation are being used.

unfortunately running burncd in test mode doesn't perform a fixation-check. so
to test any new timeout setting one has to actually burn a cd.

maybe somebody else is having the same problem and wants to try setting

    timeout = timeout / (cdp->cap.cur_write_speed / 177);


    timeout = timeout / ((cdp->cap.cur_write_speed / 177) / 2);

or some other vlaue.


More information about the freebsd-current mailing list