Date: Mon, 4 Jan 1999 20:34:11 +0100 (MET) From: Luigi Rizzo <luigi@labinfo.iet.unipi.it> To: luigi@labinfo.iet.unipi.it (Luigi Rizzo) Cc: committers@FreeBSD.ORG Subject: proposed atapi-cd patch Message-ID: <199901041934.UAA00471@labinfo.iet.unipi.it> In-Reply-To: <199901041804.TAA00132@labinfo.iet.unipi.it> from "Luigi Rizzo" at Jan 4, 99 07:04:02 pm
next in thread | previous in thread | raw e-mail | index | archive | help
Hi, does anyone objects to the following patch for atapi-cd.c to be able to mount other than the first data track on one disk ? (note that mount_cd9660 -s XXX does not work because it assumes that later tracks know about the previous ones). It (in my opinion) very useful to have multiple data tracks on the same disk, e.g. for independent backups. Even more with CDRW media. This (very small) patch uses a few bits in the minor number to select the track, so you need additional device entries in /dev. A better approach would involve adding an ioctl to set the track offset and call this from mount_cd9660 -- a bit cleaner perhaps, a bit more intrusive. The same thing could be implemented in the SCSI equivalent i guess. luigi Index: atapi-cd.c =================================================================== RCS file: /home/ncvs/src/sys/i386/isa/atapi-cd.c,v retrieving revision 1.6 diff -u -r1.6 atapi-cd.c --- atapi-cd.c 1998/12/07 21:58:20 1.6 +++ atapi-cd.c 1999/01/04 13:38:17 @@ -123,6 +123,7 @@ ptr->flags = F_MEDIA_CHANGED; ptr->flags &= ~(F_WRITTEN|F_TRACK_PREP|F_TRACK_PREPED); ptr->block_size = 2048; + ptr->starting_lba = 0 ; ptr->refcnt = 0; ptr->slot = -1; ptr->changer_info = NULL; @@ -377,6 +378,7 @@ acdopen(dev_t dev, int flags, int fmt, struct proc *p) { int lun = dkunit(dev); + int track = dkslice(dev); /* XXX this is a hack... */ struct acd *cdp; if (lun >= acdnlun || !atapi_request_immediate) @@ -409,6 +411,11 @@ } } } + cdp->starting_lba = ntohl(cdp->toc.tab[track].addr.lba) ; + if (track != 0) { + printf("Warning, opening track %d at %ld\n", + track, cdp->starting_lba); + } return 0; } @@ -527,7 +534,8 @@ #ifdef NOTYET lba = bp->b_offset / cdp->block_size; #else - lba = bp->b_blkno / (cdp->block_size / DEV_BSIZE); + lba = bp->b_blkno / (cdp->block_size / DEV_BSIZE) + + cdp->starting_lba ; #endif else lba = cdp->next_writeable_lba + (bp->b_offset / cdp->block_size); @@ -1032,6 +1040,15 @@ error = EINVAL; printf("acd%d: sequence error (PREP_TRACK)\n", cdp->lun); } else { + /* + * if something has changed, synchronize track. + */ + if (cdp->flags & F_TRACK_PREPED && + (cdp->preptrack.audio != w->audio || + cdp->preptrack.preemp != w->preemp) ) { + error = acd_close_track(cdp); + cdp->flags &= ~(F_TRACK_PREPED | F_TRACK_PREP); + } cdp->flags |= F_TRACK_PREP; cdp->preptrack = *w; } Index: atapi-cd.h =================================================================== RCS file: /home/ncvs/src/sys/i386/isa/atapi-cd.h,v retrieving revision 1.2 diff -u -r1.2 atapi-cd.h --- atapi-cd.h 1998/10/15 08:11:55 1.2 +++ atapi-cd.h 1999/01/04 13:29:07 @@ -345,6 +345,8 @@ u_char speed; /* Select drive speed */ u_int next_writeable_lba; /* Next writable position */ struct wormio_prepare_track preptrack; /* Scratch region */ + + u_long starting_lba; /* for multitrack */ #ifdef DEVFS void *ra_devfs_token; void *rc_devfs_token; To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199901041934.UAA00471>