> >No. Insert CD, run cda /dev/rcd0c toc, error message in
 > >/var/log/messages. Eject CD reinsert it, same command, it works.
 > 
 > So it fails the first time after a reboot and never again
 > until reboot ?
 > 
 > Or is it just heads-or-tails everytime ?

The machine is normally up for several weeks at a time, so it's
head-or-tails, with it being ok most of the time. When it goes wrong it
goes wrong for several changes of CD"s, but all of a sudden it starts to
work again.

I'm sorry I can't be more precise, but the error occurs at random
places.

 > As you can see it would pass through the third block, but not
 > the two first, so if you could place a couple of strategic
 > printfs and see which one of these it fails on (only print on
 > the error, otherwise your printout will come en each and every
 > transfer.)

See attached diff against CURRENT in case any one else wants to have a
go at it.

 > Is this by any chance a mixed-cd, ie both sound&data tracks ?

Nope, off the shelf sound CD.

Nick

-- 
ISIS/STA, T.P.270, Joint Research Centre, 21020 Ispra, Italy


--- subr_diskslice.c.orig       Thu Sep  2 18:21:33 1999
+++ subr_diskslice.c    Thu Sep  2 18:37:48 1999
@@ -173,22 +173,38 @@
        sp = &ssp->dss_slices[dkslice(bp->b_dev)];
        lp = sp->ds_label;
        if (ssp->dss_secmult == 1) {
-               if (bp->b_bcount % (u_long)DEV_BSIZE)
+               if (bp->b_bcount % (u_long)DEV_BSIZE) {
+                       printf("PHK1 bp->b_bcount(=%ld) %% %d != 0\n",
+                               bp->b_bcount, DEV_BSIZE);
                        goto bad_bcount;
+               }
                secno = blkno;
                nsec = bp->b_bcount >> DEV_BSHIFT;
        } else if (ssp->dss_secshift != -1) {
-               if (bp->b_bcount & (ssp->dss_secsize - 1))
+               if (bp->b_bcount & (ssp->dss_secsize - 1)) {
+                       printf("PHK2 bp->b_bcount(=%ld) & (ssp->dss_secsize - 1)(=%d) 
+!= 0\n",
+                                bp->b_bcount, ssp->dss_secsize - 1);
                        goto bad_bcount;
-               if (blkno & (ssp->dss_secmult - 1))
+               }
+               if (blkno & (ssp->dss_secmult - 1)) {
+                       printf("PHK3 blkno(=%d) & (ssp->dss_secmult - 1)(=
+%d) != 0\n",
+                               blkno, ssp->dss_secmult - 1);
                        goto bad_blkno;
+               }
                secno = blkno >> ssp->dss_secshift;
                nsec = bp->b_bcount >> (DEV_BSHIFT + ssp->dss_secshift);
        } else {
-               if (bp->b_bcount % ssp->dss_secsize)
+               if (bp->b_bcount % ssp->dss_secsize) {
+                       printf("PHK4 bp->b_bcount(=%ld) %% ssp->dss_secsize(=%d) != 
+0\n",
+                                bp->b_bcount, ssp->dss_secsize - 1);
                        goto bad_bcount;
-               if (blkno % ssp->dss_secmult)
+               }
+               if (blkno % ssp->dss_secmult) {
+                       printf("PHK5 blkno(=%d) %% ssp->dss_secmult(=%d) != 0\n",
+                               blkno, ssp->dss_secmult);
                        goto bad_blkno;
+               }
                secno = blkno / ssp->dss_secmult;
                nsec = bp->b_bcount / ssp->dss_secsize;
        }

Reply via email to