#794868 dvd+rw-tools: Burn failure of growisofs on DVD-R[W] with write type DAO

Package:
dvd+rw-tools
Source:
dvd+rw-tools
Description:
DVD+-RW/R tools
Submitter:
"Thomas Schmitt"
Date:
2025-03-04 20:18:02 UTC
Severity:
important
Tags:
#794868#5
Date:
2015-08-07 12:59:38 UTC
From:
To:
Dear Maintainer,

This bug wastes DVD-R media. Frontends K3B and cdw trigger it.

Discovered by Honza Horak <hhorak@redhat.com> in april 2012.
https://lists.debian.org/cdwrite/2012/04/msg00010.html
It shows up only on contemporary kernels. 2.6. was immune.

Eike Lantzsch experiences it on Stretch (testing).
I can reproduce it on Jessie 8.1. See thread
https://lists.debian.org/debian-user/2015/08/msg00138.html
----------------------------------------------------------------
How to reproduce:

Burn an image of a size that is not divisible by 32 KB to DVD-R[W]
with write type DAO:

  growisofs -use-the-force-luke=dao \
             -Z /dev/sr1=debian-7.4.0-mips-netinst.iso

This yields a slightly mislead error message:

    216236032/216250368 (100.0%) @0.0x, remaining 0:00 RBU   0.1% UBU 100.0%
  :-[ WRITE@LBA=19c70h failed with SK=0h/ASC=00h/ACQ=03h]: Input/output error
  :-( write failed: Input/output error

and an unreadable medium.

Eike Lantzsch sees in system logs:

  Aug  3 08:55:37 lxcl01 kernel: [244027.061869] sr 5:0:0:0: [sr0] unaligned transfer

I see (on Jessie's vanilla kernel 3.16):

  Aug  7 00:04:27 ts6 kernel: [4444491.622938] sr 3:0:0:0: [sr1] CDB:
  Aug  7 00:04:27 ts6 kernel: [4444491.622941] Write(10): 2a 00 00 01 9c 70 00 00 07 00
  Aug  7 00:04:27 ts6 kernel: [4444491.622976] ata4: hard resetting link


https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755466
shows the preconditions (DVD-R DAO, not 32 KB aligned) but
there the medium was readable afterwards.
This difference might depend on burner drive and/or bus hardware.
---------------------------------------------------------------- Diagnosis: The cause is that the last SCSI command WRITE(10) of the burn tells the correct number of blocks (less than 16), but in the API struct sg_io_hdr of ioctl(SG_IO), component .dxfer_len is set to 16. Old kernels obviously interpreted the WRITE(10) CDB, whereas newer kernels at least partly rely on sg_io_hdr.dxfer_len. This leads to error indication Key B, ASC 0, ASCQ 0 presented in sense code format "Descriptor" (SPC-3 4.5.2.1, table 13) rather than in format "Fixed" (SPC-3 4.5.3, table 26). growisofs does only expect "Fixed" and thus picks the wrong bytes from the sense code string to show them in the error message.
------------------------------------------------------------------- Remedy for the wrong last WRITE transaction: ------------------------------------------------------------------- --- growisofs_mmc-7.1-11.cpp 2015-08-07 13:07:52.000000000 +0200 +++ growisofs_mmc.cpp 2015-08-07 14:06:31.375597960 +0200 @@ -540,7 +540,7 @@ ssize_t poor_mans_pwrite64 (int fd,const // own higher HZ value and disrespects the user-land one. // Sending them down as milliseconds is just safer... // - if (!(errcode=cmd.transport (WRITE,(void *)buff,size))) + if (!(errcode=cmd.transport (WRITE,(void *)buff,nbl*2048))) break; //--- WRITE failed ---// ------------------------------------------------------------------- With the patch applied, the burn run succeeds, the medium is readable, and diff detects no alterations. This remedy for the final WRITE transaction is part of Fedora since april 2012: http://pkgs.fedoraproject.org/cgit/dvd+rw-tools.git/commit/?id=981ab65695e09f778bdb9d256e78dc8537fe1a4a correcting a first try of a remedy http://pkgs.fedoraproject.org/cgit/dvd+rw-tools.git/commit/?id=8d3deadb30c071cc9aafd277b6b903791ab048dc
---------------------------------------------------------------- Remedy for the wrong error code display: ---------------------------------------------------------------- --- transport-7.1-11.hxx 2015-08-07 13:07:52.000000000 +0200 +++ transport.hxx 2015-08-07 13:43:02.759592641 +0200 @@ -70,7 +70,12 @@ inline long getmsecs() #ifndef FATAL_START #define FATAL_START(er) (0x80|(er)) #endif -#define ERRCODE(s) ((((s)[2]&0x0F)<<16)|((s)[12]<<8)|((s)[13])) +#define ERRCODE_FIXED(s) ((((s)[2]&0x0F)<<16)|((s)[12]<<8)|((s)[13])) +#define ERRCODE_DESCR(s) ((((s)[1]&0x0F)<<16)|((s)[2]<<8)|((s)[3])) +#define ERRCODE(s) ((s)[0] == 0x70 || (s)[0] == 0x71 ? \ + ERRCODE_FIXED(s) : \ + ((s)[0] == 0x72 || (s)[0] == 0x73 ? \ + ERRCODE_DESCR(s) : 0)) #define SK(errcode) (((errcode)>>16)&0xF) #define ASC(errcode) (((errcode)>>8)&0xFF) ---------------------------------------------------------------- The error message on my Debian 8.1, burner LG GH24NSC0, SATA of mainboard ASUS P9D WS, is then correctly reported: :-[ WRITE@LBA=19c70h failed with SK=Bh/NO ADDITIONAL SENSE INFORMATION]: Input/output error Something which one could look up in e.g. https://en.wikipedia.org/wiki/Key_Code_Qualifier other than the fantasy error triple SK=0h/ASC=00h/ACQ=03h (Of course, i see the error only if the remedy for DAO is not applied.)
------------------------------------------------------------------- Side note about dash (see also https://wiki.debian.org/DashAsBinSh): When manually running "make" after apt-get source dvd+rw-tools, i see the error message /bin/sh: 1: [: 1000: unexpected operator which stems from a bashism in Makefile.m4 minus_o:=$(shell [[ `id -u` == 0 ]] && echo "-o root") I propose this more portable alternative minus_o:=$(shell test `id -u` = 0 && echo "-o root")
------------------------------------------------------------------- Have a nice day :) Thomas
#794868#10
Date:
2015-08-08 02:59:43 UTC
From:
To:
Hi Debian team!

I applied the patches mentioned in the bug report by Thomas Schmitt
and the DAO-burn with unaligned iso-images works OK now on Debian testing

All the best
EIke

Patches added for clarity:
------------------------------------------------------------------- Remedy for the wrong last WRITE transaction: ------------------------------------------------------------------- --- growisofs_mmc-7.1-11.cpp 2015-08-07 13:07:52.000000000 +0200 +++ growisofs_mmc.cpp 2015-08-07 14:06:31.375597960 +0200 @@ -540,7 +540,7 @@ ssize_t poor_mans_pwrite64 (int fd,const // own higher HZ value and disrespects the user-land one. // Sending them down as milliseconds is just safer... // - if (!(errcode=cmd.transport (WRITE,(void *)buff,size))) + if (!(errcode=cmd.transport (WRITE,(void *)buff,nbl*2048))) break; //--- WRITE failed ---// ------------------------------------------------------------------- I can confirm this.
---------------------------------------------------------------- Remedy for the wrong error code display: ---------------------------------------------------------------- --- transport-7.1-11.hxx 2015-08-07 13:07:52.000000000 +0200 +++ transport.hxx 2015-08-07 13:43:02.759592641 +0200 @@ -70,7 +70,12 @@ inline long getmsecs() #ifndef FATAL_START #define FATAL_START(er) (0x80|(er)) #endif -#define ERRCODE(s) ((((s)[2]&0x0F)<<16)|((s)[12]<<8)|((s)[13])) +#define ERRCODE_FIXED(s) ((((s)[2]&0x0F)<<16)|((s)[12]<<8)|((s)[13])) +#define ERRCODE_DESCR(s) ((((s)[1]&0x0F)<<16)|((s)[2]<<8)|((s)[3])) +#define ERRCODE(s) ((s)[0] == 0x70 || (s)[0] == 0x71 ? \ + ERRCODE_FIXED(s) : \ + ((s)[0] == 0x72 || (s)[0] == 0x73 ? \ + ERRCODE_DESCR(s) : 0)) #define SK(errcode) (((errcode)>>16)&0xF) #define ASC(errcode) (((errcode)>>8)&0xFF) ----------------------------------------------------------------
------------------------------------------------------------------- This fix works OK.
#794868#17
Date:
2025-03-04 20:03:02 UTC
From:
To:
Dear Maintainer,

this bug still exists in Debian Stable.
The patch proposed by Thomas Schmitt ten years ago still works.

It would be great if you could include that patch into packaging.


All the best
Bernhard