Date: Sat, 26 Sep 1998 13:55:23 +0200 (MET DST) From: Luigi Rizzo <luigi@labinfo.iet.unipi.it> To: sos@FreeBSD.ORG Cc: current@FreeBSD.ORG Subject: Re: cd9660 mounts... Message-ID: <199809261155.NAA14371@labinfo.iet.unipi.it> In-Reply-To: <199809261214.OAA24718@sos.freebsd.dk> from "Søren Schmidt" at Sep 26, 98 02:14:29 pm
next in thread | previous in thread | raw e-mail | index | archive | help
> > An alternative hack (which seems to work and requires very little
> > modification -- just 4 lines in the device driver!) is to use the
> > device minor number to identify the track, so that you can say
> >
> > mount -t cd9660 -o -s=3D0 /dev/wcd0tN /cdrom
> >
> > to mount the n-th track.
> >
> > In the above you _need_ to specify the "-s=3D0" option to mount_cd9660
> > because otherwise it tries to access the last data track on the disk.
> >
> > Opinions ? Is this something worth adding to the system ? It is totally
> > backward compatible and nonintrusive.
>
> I think this method is the best one, we can keep the mods in the
> atapi-cd devicedriver which still is sortof alpha code. That wont
> make it work for SCSI CDROM's, but that just too bad...
the diffs for wcd.c are below... atapi-cd.c has similar code, i
think it will not take more than five minutes to patch
the cdopen() and cdstart() functions in /sys/scsi ... (except that i
cannot find the code for cdopen() !)
luigi
--- wcd.c Tue Jul 7 05:23:28 1998
+++ /sys/i386/isa/wcd.c Sat Sep 26 09:13:54 1998
@@ -225,6 +225,7 @@
struct audiopage aumask; /* Audio page mask */
struct subchan subchan; /* Subchannel info */
char description[80]; /* Device description */
+ int starting_lba ;
#ifdef DEVFS
void *ra_devfs_token;
void *rc_devfs_token;
@@ -289,12 +290,12 @@
lun = t->lun = wcdnlun++;
t->param = ap;
t->flags = F_MEDIA_CHANGED;
+ t->starting_lba = 0;
t->refcnt = 0;
if (debug) {
t->flags |= F_DEBUG;
@@ -403,7 +401,7 @@
wcd_open (dev_t dev, int rawflag)
{
int lun = UNIT(dev);
+ int track = dkslice(dev); /* XXX */
struct wcd *t;
/* Check that the device number is legal
@@ -431,6 +458,11 @@
++t->refcnt;
else
t->flags |= F_BOPEN;
+ t->starting_lba = ntohl(t->toc.tab[track].addr.lba) ;
+ if (track != 0) {
+ printf("Warning, opening track %d at %d\n",
+ track, t->starting_lba);
+ }
return (0);
}
@@ -547,7 +578,7 @@
* First, translate the block to absolute and put it in terms of the
* logical blocksize of the device.
* What if something asks for 512 bytes not on a 2k boundary? */
- blkno = bp->b_blkno / (SECSIZE / 512);
+ blkno = t->starting_lba + bp->b_blkno / (SECSIZE / 512);
nblk = (bp->b_bcount + (SECSIZE - 1)) / SECSIZE;
atapi_request_callback (t->ata, t->unit, ATAPI_READ_BIG, 0,
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199809261155.NAA14371>
