[comp.bugs.4bsd] Race in "open" code for TU78 device driver

ggs@ulysses.homer.nj.att.com (Griff Smith) (08/11/87)

Index:	/sys/vaxmba/mt.c 4.3BSD

Description:
	It is possible for two processes to open the same TU78 tape
	if the second "open" request runs while the first is waiting
	for a "sense" to complete.
Repeat-By:
	Very unlikely.
Fix:
	Set the sc_openf flag before waiting for the "sense"; clear
	the flag later if the "open" fails for some reason.  Context
	diff follows.

*** /source/sys/vaxmba/mt.c	Thu Jun  5 04:32:57 1986
--- /sys/vaxmba/mt.c	Tue Aug 11 14:50:13 1987
***************
*** 174,191 ****
--- 175,196 ----
  		return (ENXIO);
  	if ((sc = &mu_softc[muunit])->sc_openf)
  		return (EBUSY);
+ 	sc->sc_openf = 1;
  	sc->sc_dens = (minor(dev) & H_6250BPI) ? MT_GCR : 0;
  	mtcommand(dev, MT_SENSE, 1);
  	if ((sc->sc_dsreg & MTDS_ONL) == 0) {
  		uprintf("mu%d: not online\n", muunit);
+ 		sc->sc_openf = 0;
  		return (EIO);
  	}
  	if ((sc->sc_dsreg & MTDS_AVAIL) == 0) {
  		uprintf("mu%d: not online (port selector)\n", muunit);
+ 		sc->sc_openf = 0;
  		return (EIO);
  	}
  	if ((flag & FWRITE) && (sc->sc_dsreg & MTDS_FPT)) {
  		uprintf("mu%d: no write ring\n", muunit);
+ 		sc->sc_openf = 0;
  		return (EIO);
  	}
  	if (   ((sc->sc_dsreg & MTDS_BOT) == 0)
***************
*** 195,203 ****
  		|| (   (sc->sc_dens != MT_GCR)
  		    && ((sc->sc_dsreg & MTDS_PE) == 0)))) {
  		uprintf("mu%d: can't change density in mid-tape\n", muunit);
  		return (EIO);
  	}
- 	sc->sc_openf = 1;
  	sc->sc_blkno = (daddr_t)0;
  
  	/* Since cooked I/O may do a read-ahead before a write, trash	*/
--- 200,208 ----
  		|| (   (sc->sc_dens != MT_GCR)
  		    && ((sc->sc_dsreg & MTDS_PE) == 0)))) {
  		uprintf("mu%d: can't change density in mid-tape\n", muunit);
+ 		sc->sc_openf = 0;
  		return (EIO);
  	}
  	sc->sc_blkno = (daddr_t)0;
  
  	/* Since cooked I/O may do a read-ahead before a write, trash	*/
-- 
Griff Smith	AT&T (Bell Laboratories), Murray Hill
Phone:		1-201-582-7736
UUCP:		{allegra|ihnp4}!ulysses!ggs
Internet:	ggs@ulysses.uucp