have to remember to lock buffers before trying to grab them
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Wed, 16 Aug 1989 15:25:48 +0000 (07:25 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Wed, 16 Aug 1989 15:25:48 +0000 (07:25 -0800)
SCCS-vsn: sys/kern/vfs_bio.c 7.9
SCCS-vsn: sys/kern/vfs_cluster.c 7.9

usr/src/sys/kern/vfs_bio.c
usr/src/sys/kern/vfs_cluster.c

index a22e541..9801672 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)vfs_bio.c   7.8 (Berkeley) %G%
+ *     @(#)vfs_bio.c   7.9 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -727,13 +727,21 @@ binval(dev)
 {
        register struct buf *bp;
        register struct bufhd *hp;
 {
        register struct buf *bp;
        register struct bufhd *hp;
-       int dirty = 0;
+       int s, dirty = 0;
 #define dp ((struct buf *)hp)
 
        for (hp = bufhash; hp < &bufhash[BUFHSZ]; hp++) {
                for (bp = dp->b_forw; bp != dp; bp = bp->b_forw) {
                        if (bp->b_dev != dev || (bp->b_flags & B_INVAL))
                                continue;
 #define dp ((struct buf *)hp)
 
        for (hp = bufhash; hp < &bufhash[BUFHSZ]; hp++) {
                for (bp = dp->b_forw; bp != dp; bp = bp->b_forw) {
                        if (bp->b_dev != dev || (bp->b_flags & B_INVAL))
                                continue;
+               loop:
+                       s = splbio();
+                       if (bp->b_flags & B_BUSY) {
+                               bp->b_flags |= B_WANTED;
+                               sleep((caddr_t)bp, PRIBIO+1);
+                               splx(s);
+                               goto loop;
+                       }
                        notavail(bp);
                        if (bp->b_flags & B_DELWRI) {
                                (void) bawrite(bp);
                        notavail(bp);
                        if (bp->b_flags & B_DELWRI) {
                                (void) bawrite(bp);
index 7a83a48..c2c92cc 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)vfs_cluster.c       7.8 (Berkeley) %G%
+ *     @(#)vfs_cluster.c       7.9 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -727,13 +727,21 @@ binval(dev)
 {
        register struct buf *bp;
        register struct bufhd *hp;
 {
        register struct buf *bp;
        register struct bufhd *hp;
-       int dirty = 0;
+       int s, dirty = 0;
 #define dp ((struct buf *)hp)
 
        for (hp = bufhash; hp < &bufhash[BUFHSZ]; hp++) {
                for (bp = dp->b_forw; bp != dp; bp = bp->b_forw) {
                        if (bp->b_dev != dev || (bp->b_flags & B_INVAL))
                                continue;
 #define dp ((struct buf *)hp)
 
        for (hp = bufhash; hp < &bufhash[BUFHSZ]; hp++) {
                for (bp = dp->b_forw; bp != dp; bp = bp->b_forw) {
                        if (bp->b_dev != dev || (bp->b_flags & B_INVAL))
                                continue;
+               loop:
+                       s = splbio();
+                       if (bp->b_flags & B_BUSY) {
+                               bp->b_flags |= B_WANTED;
+                               sleep((caddr_t)bp, PRIBIO+1);
+                               splx(s);
+                               goto loop;
+                       }
                        notavail(bp);
                        if (bp->b_flags & B_DELWRI) {
                                (void) bawrite(bp);
                        notavail(bp);
                        if (bp->b_flags & B_DELWRI) {
                                (void) bawrite(bp);