On Thu, 23 Nov 2006 20:48:25 +0100 Mathieu Fluhr wrote: > I explain: First take this really simple program: > ----8<------------------------------------------------------------------ > #include > #include > #include > > > int main(int argc, char **argv) > { > if(argc < 2) > return 0; > > int iFD = open(argv[1], O_RDONLY | O_NONBLOCK); > if(iFD == -1) > perror("open"); > > while(1) > sleep(1); > > return 0; > } > ----8<----------------------------------------------------------------- [..] > Ok. Now take a full DVD (I tested DVD+R, +RW and -R), with more than > 4 300 000 000 bytes (very important :), and perform the following: > > 0. Open the tray of your recorder > 1. Launch this small program above, passing the recorder device file as > argument and let it run in background. At this time the following code in drivers/ide/ide-cd.c:cdrom_read_toc() is executed: /* Try to get the total cdrom capacity and sector size. */ stat = cdrom_read_capacity(drive, &toc->capacity, §ors_per_frame, sense); if (stat) toc->capacity = 0x1fffff; set_capacity(info->disk, toc->capacity * sectors_per_frame); Obviously, with the tray open cdrom_read_capacity() won't succeed, therefore toc->capacity will be set to 0x1fffff. > 2. then put the disc in the device and mount it > 3. try to copy to whole content on the hard drive > > -> You will get an error like the following: > > kernel: attempt to access beyond end of device > > kernel: hdb: rw=0, want=8388612, limit=8388604 0x1fffff * 2048/512 == 8388604 Your background program is keeping the device open, which prevents revalidation of capacity and other media information on subsequent device opens. When HAL polls CD-ROM devices to detect newly inserted media, it does not keep the device open forever - instead, it opens and closes the device every time. Your program should either do the same thing, or just depend on HAL events.