From e0d29d18a0b2f7a5b0796edcf6f8bbac0a7773fd Mon Sep 17 00:00:00 2001 From: kib Date: Tue, 8 Feb 2011 09:28:28 +0000 Subject: [PATCH] MFC r217946: Add support for BIO_DELETE on swap-backed md(4). git-svn-id: svn://svn.freebsd.org/base/stable/8@218431 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/dev/md/md.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index 3947ab14c..1558bf864 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -648,7 +648,6 @@ mdstart_swap(struct md_s *sc, struct bio *bp) } bcopy(p, (void *)(sf_buf_kva(sf) + offs), len); m->valid = VM_PAGE_BITS_ALL; -#if 0 } else if (bp->bio_cmd == BIO_DELETE) { if (len != PAGE_SIZE && m->valid != VM_PAGE_BITS_ALL) rv = vm_pager_get_pages(sc->object, &m, 1, 0); @@ -658,16 +657,21 @@ mdstart_swap(struct md_s *sc, struct bio *bp) vm_page_wakeup(m); break; } - bzero((void *)(sf_buf_kva(sf) + offs), len); - vm_page_dirty(m); - m->valid = VM_PAGE_BITS_ALL; -#endif + if (len != PAGE_SIZE) { + bzero((void *)(sf_buf_kva(sf) + offs), len); + vm_page_clear_dirty(m, offs, len); + m->valid = VM_PAGE_BITS_ALL; + } else + vm_pager_page_unswapped(m); } sf_buf_free(sf); sched_unpin(); vm_page_wakeup(m); vm_page_lock_queues(); - vm_page_activate(m); + if (bp->bio_cmd == BIO_DELETE && len == PAGE_SIZE) + vm_page_free(m); + else + vm_page_activate(m); if (bp->bio_cmd == BIO_WRITE) vm_page_dirty(m); vm_page_unlock_queues(); -- 2.45.2