On Thu, Mar 17, 2011 at 06:47:14PM -0700, Matthew Dempsky wrote:
> I noticed that stdetach() doesn't quite do the right thing.  The
> consequences should only be relevant if you have more than one st(4)
> device and detach one while using it or another st(4).
> 
> I'd appreciate a quick test that this doesn't break st(4) in any
> obvious ways.  If you're a particularly savvy user with access to two
> or more detachable tape drives, I can provide some more specific tests
> for you to run.
> 
> Thanks.

And here's one that actually compiles...

Index: st.c
===================================================================
RCS file: /cvs/src/sys/scsi/st.c,v
retrieving revision 1.116
diff -u -p st.c
--- st.c        24 Dec 2010 02:45:33 -0000      1.116
+++ st.c        18 Mar 2011 02:12:07 -0000
@@ -369,22 +369,14 @@ stdetach(struct device *self, int flags)
        bufq_drain(&st->sc_bufq);
 
        /* Locate the lowest minor number to be detached. */
-       mn = STUNIT(self->dv_unit);
+       mn = self->dv_unit << 4;
 
        for (bmaj = 0; bmaj < nblkdev; bmaj++)
-               if (bdevsw[bmaj].d_open == stopen) {
-                       vdevgone(bmaj, mn, mn + 0, VBLK);
-                       vdevgone(bmaj, mn, mn + 1, VBLK);
-                       vdevgone(bmaj, mn, mn + 2, VBLK);
-                       vdevgone(bmaj, mn, mn + 3, VBLK);
-               }
+               if (bdevsw[bmaj].d_open == stopen)
+                       vdevgone(bmaj, mn, mn + 15, VBLK);
        for (cmaj = 0; cmaj < nchrdev; cmaj++)
-               if (cdevsw[cmaj].d_open == stopen) {
-                       vdevgone(cmaj, mn, mn + 0, VCHR);
-                       vdevgone(cmaj, mn, mn + 1, VCHR);
-                       vdevgone(cmaj, mn, mn + 2, VCHR);
-                       vdevgone(cmaj, mn, mn + 3, VCHR);
-               }
+               if (cdevsw[cmaj].d_open == stopen)
+                       vdevgone(cmaj, mn, mn + 15, VCHR);
 
        bufq_destroy(&st->sc_bufq);

Reply via email to