Go to file
Etienne Dechamps b18019d2d8 Fix synchronicity for ZVOLs.
zvol_write() assumes that the write request must be written to stable storage
if rq_is_sync() is true. Unfortunately, this assumption is incorrect. Indeed,
"sync" does *not* mean what we think it means in the context of the Linux
block layer. This is well explained in linux/fs.h:

    WRITE:       A normal async write. Device will be plugged.
    WRITE_SYNC:  Synchronous write. Identical to WRITE, but passes down
                 the hint that someone will be waiting on this IO
                 shortly.
    WRITE_FLUSH: Like WRITE_SYNC but with preceding cache flush.
    WRITE_FUA:   Like WRITE_SYNC but data is guaranteed to be on
                 non-volatile media on completion.

In other words, SYNC does not *mean* that the write must be on stable storage
on completion. It just means that someone is waiting on us to complete the
write request. Thus triggering a ZIL commit for each SYNC write request on a
ZVOL is unnecessary and harmful for performance. To make matters worse, ZVOL
users have no way to express that they actually want data to be written to
stable storage, which means the ZIL is broken for ZVOLs.

The request for stable storage is expressed by the FUA flag, so we must
commit the ZIL after the write if the FUA flag is set. In addition, we must
commit the ZIL before the write if the FLUSH flag is set.

Also, we must inform the block layer that we actually support FLUSH and FUA.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
2012-02-07 16:23:06 -08:00
cmd Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
config Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
dracut Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
etc Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
include Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
lib Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
man Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
module Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
patches Add build system 2010-08-31 13:41:27 -07:00
scripts Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
udev Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
.gitignore Ignore unsigned module build products 2010-03-09 14:14:09 -08:00
AUTHORS Add "ashift" property to zpool create 2011-06-17 16:35:49 -07:00
autogen.sh Make autogen.sh executable 2011-07-26 10:15:35 -07:00
ChangeLog Add build system 2010-08-31 13:41:27 -07:00
configure Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
configure.ac Add make rule for building Arch Linux packages 2011-12-14 19:14:23 -08:00
COPYING Relocate COPYING+COPYRIGHT, remove README cruft 2008-12-01 15:34:53 -08:00
COPYRIGHT Update COPYRIGHT to reference zpios CDDL exceptions. 2010-05-18 14:25:28 -07:00
DISCLAIMER Update COPYRIGHT and DISCLAIMER. 2010-05-18 10:32:23 -07:00
Makefile.am Add the release component to headers 2012-01-18 12:19:47 -08:00
Makefile.in Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
META Prep zfs-0.6.0-rc6 tag 2011-10-06 14:10:45 -07:00
OPENSOLARIS.LICENSE Add CDDL license file 2008-12-01 14:49:34 -08:00
PKGBUILD-zfs-modules.in Add make rule for building Arch Linux packages 2011-12-14 19:14:23 -08:00
PKGBUILD-zfs.in Add make rule for building Arch Linux packages 2011-12-14 19:14:23 -08:00
README.markdown Fix markdown rendering 2010-09-15 09:09:37 -07:00
zfs_config.h.in Fix synchronicity for ZVOLs. 2012-02-07 16:23:06 -08:00
zfs-modules.spec.in Fix rpm dependencies 2012-01-18 12:19:52 -08:00
zfs-script-config.sh.in Unconditionally load core kernel modules 2010-11-11 11:38:25 -08:00
ZFS.RELEASE Update to onnv_147 2010-08-26 14:24:34 -07:00
zfs.spec.in Fix rpm dependencies 2012-01-18 12:19:52 -08:00

Native ZFS for Linux! ZFS is an advanced file system and volume manager which was originally developed for Solaris. It has been successfully ported to FreeBSD and now there is a functional Linux ZFS kernel port too. The port currently includes a fully functional and stable SPA, DMU, and ZVOL with a ZFS Posix Layer (ZPL) on the way!

$ ./configure
$ make pkg

Full documentation for building, configuring, and using ZFS can be found at: http://zfsonlinux.org