Date: Mon, 19 Oct 2009 18:06:49 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r198240 - user/kmacy/releng_8_fcs/sys/kern Message-ID: <200910191806.n9JI6neU008725@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200910191806.n9JI6neU008725>