summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_cluster.c
diff options
context:
space:
mode:
authormckusick <mckusick@FreeBSD.org>2013-02-16 14:51:30 +0000
committermckusick <mckusick@FreeBSD.org>2013-02-16 14:51:30 +0000
commitc04f4382b34d7ae4606db6e725d3613fd952a0e4 (patch)
tree818f7322d46b65c6033f7e8e58cf52d3ebff3771 /sys/kern/vfs_cluster.c
parentdcbeb7acb186d90fbec3caed228b522c0b41ad64 (diff)
downloadFreeBSD-src-c04f4382b34d7ae4606db6e725d3613fd952a0e4.zip
FreeBSD-src-c04f4382b34d7ae4606db6e725d3613fd952a0e4.tar.gz
Add barrier write capability to the VFS buffer interface. A barrier
write is a disk write request that tells the disk that the buffer being written must be committed to the media along with any writes that preceeded it before any future blocks may be written to the drive. Barrier writes are provided by adding the functions bbarrierwrite (bwrite with barrier) and babarrierwrite (bawrite with barrier). Following a bbarrierwrite the client knows that the requested buffer is on the media. It does not ensure that buffers written before that buffer are on the media. It only ensure that buffers written before that buffer will get to the media before any buffers written after that buffer. A flush command must be sent to the disk to ensure that all earlier written buffers are on the media. Reviewed by: kib Tested by: Peter Holm
Diffstat (limited to 'sys/kern/vfs_cluster.c')
-rw-r--r--sys/kern/vfs_cluster.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/kern/vfs_cluster.c b/sys/kern/vfs_cluster.c
index 19ee05f..663b66f 100644
--- a/sys/kern/vfs_cluster.c
+++ b/sys/kern/vfs_cluster.c
@@ -944,11 +944,17 @@ cluster_wbuild(vp, size, start_lbn, len)
}
bp->b_bcount += size;
bp->b_bufsize += size;
- bundirty(tbp);
- tbp->b_flags &= ~B_DONE;
- tbp->b_ioflags &= ~BIO_ERROR;
+ /*
+ * If any of the clustered buffers have their
+ * B_BARRIER flag set, transfer that request to
+ * the cluster.
+ */
+ bp->b_flags |= (tbp->b_flags & B_BARRIER);
+ tbp->b_flags &= ~(B_DONE | B_BARRIER);
tbp->b_flags |= B_ASYNC;
+ tbp->b_ioflags &= ~BIO_ERROR;
tbp->b_iocmd = BIO_WRITE;
+ bundirty(tbp);
reassignbuf(tbp); /* put on clean list */
bufobj_wref(tbp->b_bufobj);
BUF_KERNPROC(tbp);
OpenPOWER on IntegriCloud