diff options
author | kib <kib@FreeBSD.org> | 2013-08-22 18:26:45 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2013-08-22 18:26:45 +0000 |
commit | e25f6a560e1e37654c030e8b907daf8ebfae9c40 (patch) | |
tree | efcf3b91736a972d4bd20694ca316b8ef94611b6 /sys/sys/buf.h | |
parent | 05a9dff802e2ec3a2f8ab5836657ced5977fca68 (diff) | |
download | FreeBSD-src-e25f6a560e1e37654c030e8b907daf8ebfae9c40.zip FreeBSD-src-e25f6a560e1e37654c030e8b907daf8ebfae9c40.tar.gz |
Both cluster_rbuild() and cluster_wbuild() sometimes set the pages
shared busy without first draining the hard busy state. Previously it
went unnoticed since VPO_BUSY and m->busy fields were distinct, and
vm_page_io_start() did not verified that the passed page has VPO_BUSY
flag cleared, but such page state is wrong. New implementation is
more strict and catched this case.
Drain the busy state as needed, before calling vm_page_sbusy().
Tested by: pho, jkim
Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'sys/sys/buf.h')
-rw-r--r-- | sys/sys/buf.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/sys/sys/buf.h b/sys/sys/buf.h index ffa6676..c384e18 100644 --- a/sys/sys/buf.h +++ b/sys/sys/buf.h @@ -501,6 +501,7 @@ void bufstrategy(struct bufobj *, struct buf *); void brelse(struct buf *); void bqrelse(struct buf *); int vfs_bio_awrite(struct buf *); +void vfs_drain_busy_pages(struct buf *bp); struct buf * getpbuf(int *); struct buf *incore(struct bufobj *, daddr_t); struct buf *gbincore(struct bufobj *, daddr_t); |