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);