svn commit: r198240 - user/kmacy/releng_8_fcs/sys/kern

Kip Macy kmacy at FreeBSD.org
Mon Oct 19 18:06:50 UTC 2009


Author: kmacy
Date: Mon Oct 19 18:06:49 2009
New Revision: 198240
URL: http://svn.freebsd.org/changeset/base/198240

Log:
  Enable getblk to allocate buffers that will not be included in core dumps

Modified:
  user/kmacy/releng_8_fcs/sys/kern/vfs_bio.c

Modified: user/kmacy/releng_8_fcs/sys/kern/vfs_bio.c
==============================================================================
--- user/kmacy/releng_8_fcs/sys/kern/vfs_bio.c	Mon Oct 19 17:47:18 2009	(r198239)
+++ user/kmacy/releng_8_fcs/sys/kern/vfs_bio.c	Mon Oct 19 18:06:49 2009	(r198240)
@@ -94,6 +94,7 @@ struct buf *buf;		/* buffer header pool 
 
 static struct proc *bufdaemonproc;
 
+static int _allocbuf(struct buf *bp, int size, int flags);
 static int inmem(struct vnode *vp, daddr_t blkno);
 static void vm_hold_free_pages(struct buf *bp, vm_offset_t from,
 		vm_offset_t to);
@@ -2624,7 +2625,7 @@ loop:
 		 */
 
 		if (bp->b_bcount != size)
-			allocbuf(bp, size);
+			_allocbuf(bp, size, flags);
 
 		KASSERT(bp->b_offset != NOOFFSET, 
 		    ("getblk: no buffer offset"));
@@ -2744,7 +2745,7 @@ loop:
 			    bp, bp->b_bufobj->bo_object));
 		}
 
-		allocbuf(bp, size);
+		_allocbuf(bp, size, flags);
 		bp->b_flags &= ~B_DONE;
 	}
 	CTR4(KTR_BUF, "getblk(%p, %ld, %d) = %p", vp, (long)blkno, size, bp);
@@ -2770,7 +2771,7 @@ geteblk(int size, int flags)
 		    (curthread->td_pflags & TDP_BUFNEED) != 0)
 			return (NULL);
 	}
-	allocbuf(bp, size);
+	_allocbuf(bp, size, flags);
 	bp->b_flags |= B_INVAL;	/* b_dep cleared by getnewbuf() */
 	BUF_ASSERT_HELD(bp);
 	return (bp);
@@ -2792,17 +2793,21 @@ geteblk(int size, int flags)
  * B_CACHE for the non-VMIO case.
  */
 
-int
-allocbuf(struct buf *bp, int size)
+static int
+_allocbuf(struct buf *bp, int size, int flags)
 {
 	int newbsize, mbsize;
 	int i;
+	vm_prot_t prot = VM_PROT_ALL;
 
 	BUF_ASSERT_HELD(bp);
 
 	if (bp->b_kvasize < size)
 		panic("allocbuf: buffer too small");
 
+	if (flags & GB_NODUMP)
+		prot |= VM_PROT_EXCLUDE;
+	
 	if ((bp->b_flags & B_VMIO) == 0) {
 		caddr_t origbuf;
 		int origbufsize;
@@ -3062,10 +3067,11 @@ allocbuf(struct buf *bp, int size)
 
 			bp->b_data = (caddr_t)
 			    trunc_page((vm_offset_t)bp->b_data);
-			pmap_qenter(
-			    (vm_offset_t)bp->b_data,
-			    bp->b_pages, 
-			    bp->b_npages
+			pmap_qenter_prot(
+				(vm_offset_t)bp->b_data,
+				bp->b_pages, 
+				bp->b_npages,
+				prot
 			);
 			
 			bp->b_data = (caddr_t)((vm_offset_t)bp->b_data | 
@@ -3079,6 +3085,13 @@ allocbuf(struct buf *bp, int size)
 	return 1;
 }
 
+int
+allocbuf(struct buf *bp, int size)
+{
+
+	return (_allocbuf(bp, size, 0));
+}
+
 void
 biodone(struct bio *bp)
 {


More information about the svn-src-user mailing list