race in dmopen; bug report 4.3BSD/sys/78
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Tue, 23 Dec 1986 07:18:15 +0000 (23:18 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Tue, 23 Dec 1986 07:18:15 +0000 (23:18 -0800)
SCCS-vsn: sys/vax/uba/dh.c 7.3

usr/src/sys/vax/uba/dh.c

index eab165c..dad80b1 100644 (file)
@@ -3,7 +3,7 @@
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
- *     @(#)dh.c        7.2 (Berkeley) %G%
+ *     @(#)dh.c        7.3 (Berkeley) %G%
  */
 
 #include "dh.h"
  */
 
 #include "dh.h"
@@ -701,16 +701,19 @@ dmopen(dev)
        }
        addr = (struct dmdevice *)ui->ui_addr;
        s = spl5();
        }
        addr = (struct dmdevice *)ui->ui_addr;
        s = spl5();
-       addr->dmcsr &= ~DM_SE;
-       while (addr->dmcsr & DM_BUSY)
-               ;
-       addr->dmcsr = unit;
-       addr->dmlstat = DML_ON;
-       if ((addr->dmlstat&DML_CAR) || (dhsoftCAR[dm]&(1<<unit)))
-               tp->t_state |= TS_CARR_ON;
-       addr->dmcsr = DM_IE|DM_SE;
-       while ((tp->t_state&TS_CARR_ON)==0)
+       for (;;) {
+               addr->dmcsr &= ~DM_SE;
+               while (addr->dmcsr & DM_BUSY)
+                       ;
+               addr->dmcsr = unit;
+               addr->dmlstat = DML_ON;
+               if ((addr->dmlstat & DML_CAR) || (dhsoftCAR[dm] & (1 < unit)))
+                       tp->t_state |= TS_CARR_ON;
+               addr->dmcsr = DM_IE|DM_SE;
+               if (tp->t_state & TS_CARR_ON)
+                       break;
                sleep((caddr_t)&tp->t_rawq, TTIPRI);
                sleep((caddr_t)&tp->t_rawq, TTIPRI);
+       }
        splx(s);
 }
 
        splx(s);
 }