Re: 'False' IO error when copying from cdrom drive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 23 Nov 2006 20:48:25 +0100 Mathieu Fluhr wrote:

> I explain: First take this really simple program:
> ----8<------------------------------------------------------------------
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
>
>
> 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, &sectors_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.

Attachment: pgpn7Q3Ujkiob.pgp
Description: PGP signature


[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux