Re: [PATCH] usb gadget: remove size limitation for storage cdrom

Dave Young
2015-03-09T05:34:15Z

On 03/08/15 at 11:29am, Alan Stern wrote:
> On Sun, 8 Mar 2015, Dave Young wrote:
>
> > I used usb cdrom emulation to play video dvd for my daughter, but I got below
> > error:
> >
> > [dave@darkstar tmp]$ cat /mnt/sr1/VIDEO_TS/VTS_01_5.VOB >/dev/null
> > cat: /mnt/sr1/VIDEO_TS/VTS_01_5.VOB: Input/output error
> > [dave@darkstar tmp]$ dmesg|tail -1
> > [ 3349.371857] sr1: rw=0, want=8028824, limit=4607996
> >
> > The assumption of cdrom size is not right, we can create data dvd large then
> > 4G, also mkisofs can create an iso with only one blank directory, the size is
> > less than 300 sectors. The size limit does not make sense, thus remove them.
> >
> > Signed-off-by: Dave Young <dyoung@redhat.com>
> > ---
> > drivers/usb/gadget/function/storage_common.c | 9 ---------
> > 1 file changed, 9 deletions(-)
> >
> > --- linux.orig/drivers/usb/gadget/function/storage_common.c
> > +++ linux/drivers/usb/gadget/function/storage_common.c
> > @@ -247,15 +247,6 @@ int fsg_lun_open(struct fsg_lun *curlun,
> >
> > num_sectors = size >> blkbits; /* File size in logic-block-size blocks */
> > min_sectors = 1;
> > - if (curlun->cdrom) {
> > - min_sectors = 300; /* Smallest track is 300 frames */
> > - if (num_sectors >= 256*60*75) {
> > - num_sectors = 256*60*75 - 1;
> > - LINFO(curlun, "file too big: %s\n", filename);
> > - LINFO(curlun, "using only first %d blocks\n",
> > - (int) num_sectors);
> > - }
> > - }
> > if (num_sectors < min_sectors) {
> > LINFO(curlun, "file too small: %s\n", filename);
> > rc = -ETOOSMALL;
>
> NAK. This patch is wrong, for a very simple reason. You wrote:
>
> > I used usb cdrom emulation to play video dvd for my daughter
>
> and this demonstrates the error quite plainly. You can't use _CD_
> emulation to imitate a _DVD_ -- they are different sorts of media.
> Just think of what happens when you try playing a DVD on a CD player.
>
> A more suitable approach would be to add DVD emulation to the driver.
>

They are both iso9660 images, aren't they? So from data image point
of view there's no difference, it is not worth to create another mode
for dvd data.

We should not emulate cd drive to support different cd media type,
it is far more better to support just iso9660 volume no matter how
large the size is as long as it is fit for iso9660 spec.

OTOH, the size limitation is a bug:
* isofs can be less than 300 sectors, the 300 sectors limitation is for
music cd I think. Try mkisofs a blank directory and burn it.

* There's 99 minutes dics even for cdrom, see:
http://en.wikipedia.org/wiki/CD-R
If we code to support different size discs, it will looks like a wrong way.

Thanks
Dave