Author: kib
Date: Tue May  5 10:46:49 2009
New Revision: 191815
URL: http://svn.freebsd.org/changeset/base/191815

Log:
  MFC r191136:
  In flushbufqueues(), do not allocate sentinel buffer on the stack,
  struct buf is large. Use sleeping malloc(9) call, and zero the allocated
  buf as a debugging feature.

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/ath/ath_hal/   (props changed)
  stable/7/sys/dev/cxgb/   (props changed)
  stable/7/sys/kern/vfs_bio.c

Modified: stable/7/sys/kern/vfs_bio.c
==============================================================================
--- stable/7/sys/kern/vfs_bio.c Tue May  5 10:43:14 2009        (r191814)
+++ stable/7/sys/kern/vfs_bio.c Tue May  5 10:46:49 2009        (r191815)
@@ -2187,7 +2187,7 @@ static int
 flushbufqueues(struct vnode *lvp, int queue, int flushdeps)
 {
        struct thread *td = curthread;
-       struct buf sentinel;
+       struct buf *sentinel;
        struct vnode *vp;
        struct mount *mp;
        struct buf *bp;
@@ -2203,14 +2203,15 @@ flushbufqueues(struct vnode *lvp, int qu
                target = flushbufqtarget;
        flushed = 0;
        bp = NULL;
-       sentinel.b_qindex = QUEUE_SENTINEL;
+       sentinel = malloc(sizeof(struct buf), M_TEMP, M_WAITOK | M_ZERO);
+       sentinel->b_qindex = QUEUE_SENTINEL;
        mtx_lock(&bqlock);
-       TAILQ_INSERT_HEAD(&bufqueues[queue], &sentinel, b_freelist);
+       TAILQ_INSERT_HEAD(&bufqueues[queue], sentinel, b_freelist);
        while (flushed != target) {
-               bp = TAILQ_NEXT(&sentinel, b_freelist);
+               bp = TAILQ_NEXT(sentinel, b_freelist);
                if (bp != NULL) {
-                       TAILQ_REMOVE(&bufqueues[queue], &sentinel, b_freelist);
-                       TAILQ_INSERT_AFTER(&bufqueues[queue], bp, &sentinel,
+                       TAILQ_REMOVE(&bufqueues[queue], sentinel, b_freelist);
+                       TAILQ_INSERT_AFTER(&bufqueues[queue], bp, sentinel,
                            b_freelist);
                } else
                        break;
@@ -2303,8 +2304,9 @@ flushbufqueues(struct vnode *lvp, int qu
                vn_finished_write(mp);
                BUF_UNLOCK(bp);
        }
-       TAILQ_REMOVE(&bufqueues[queue], &sentinel, b_freelist);
+       TAILQ_REMOVE(&bufqueues[queue], sentinel, b_freelist);
        mtx_unlock(&bqlock);
+       free(sentinel, M_TEMP);
        return (flushed);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to