]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Add backing_device_info per-filesystem
authorBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 2 Aug 2011 01:24:40 +0000 (18:24 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 4 Aug 2011 20:37:38 +0000 (13:37 -0700)
For a long time now the kernel has been moving away from using the
pdflush daemon to write 'old' dirty pages to disk.  The primary reason
for this is because the pdflush daemon is single threaded and can be
a limiting factor for performance.  Since pdflush sequentially walks
the dirty inode list for each super block any delay in processing can
slow down dirty page writeback for all filesystems.

The replacement for pdflush is called bdi (backing device info).  The
bdi system involves creating a per-filesystem control structure each
with its own private sets of queues to manage writeback.  The advantage
is greater parallelism which improves performance and prevents a single
filesystem from slowing writeback to the others.

For a long time both systems co-existed in the kernel so it wasn't
strictly required to implement the bdi scheme.  However, as of
Linux 2.6.36 kernels the pdflush functionality has been retired.

Since ZFS already bypasses the page cache for most I/O this is only
an issue for mmap(2) writes which must go through the page cache.
Even then adding this missing support for newer kernels was overlooked
because there are other mechanisms which can trigger writeback.

However, there is one critical case where not implementing the bdi
functionality can cause problems.  If an application handles a page
fault it can enter the balance_dirty_pages() callpath.  This will
result in the application hanging until the number of dirty pages in
the system drops below the dirty ratio.

Without a registered backing_device_info for the filesystem the
dirty pages will not get written out.  Thus the application will hang.
As mentioned above this was less of an issue with older kernels because
pdflush would eventually write out the dirty pages.

This change adds a backing_device_info structure to the zfs_sb_t
which is already allocated per-super block.  It is then registered
when the filesystem mounted and unregistered on unmount.  It will
not be registered for mounted snapshots which are read-only.  This
change will result in flush-<pool> thread being dynamically created
and destroyed per-mounted filesystem for writeback.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #174

61 files changed:
Makefile.in
cmd/Makefile.in
cmd/mount_zfs/Makefile.in
cmd/sas_switch_id/Makefile.in
cmd/zdb/Makefile.in
cmd/zfs/Makefile.in
cmd/zinject/Makefile.in
cmd/zpios/Makefile.in
cmd/zpool/Makefile.in
cmd/zpool_id/Makefile.in
cmd/zpool_layout/Makefile.in
cmd/ztest/Makefile.in
cmd/zvol_id/Makefile.in
config/kernel-bdi.m4 [new file with mode: 0644]
config/kernel.m4
configure
dracut/90zfs/Makefile.in
dracut/Makefile.in
etc/Makefile.in
etc/init.d/Makefile.in
etc/udev/Makefile.in
etc/udev/rules.d/Makefile.in
etc/zfs/Makefile.in
include/Makefile.in
include/linux/Makefile.in
include/linux/vfs_compat.h
include/sys/Makefile.in
include/sys/fm/Makefile.in
include/sys/fm/fs/Makefile.in
include/sys/fs/Makefile.in
include/sys/zfs_vfsops.h
lib/Makefile.in
lib/libavl/Makefile.in
lib/libefi/Makefile.in
lib/libnvpair/Makefile.in
lib/libshare/Makefile.in
lib/libspl/Makefile.in
lib/libspl/asm-generic/Makefile.in
lib/libspl/asm-i386/Makefile.in
lib/libspl/asm-x86_64/Makefile.in
lib/libspl/include/Makefile.in
lib/libspl/include/ia32/Makefile.in
lib/libspl/include/ia32/sys/Makefile.in
lib/libspl/include/rpc/Makefile.in
lib/libspl/include/sys/Makefile.in
lib/libspl/include/sys/dktp/Makefile.in
lib/libspl/include/sys/sysevent/Makefile.in
lib/libspl/include/util/Makefile.in
lib/libunicode/Makefile.in
lib/libuutil/Makefile.in
lib/libzfs/Makefile.in
lib/libzpool/Makefile.in
man/Makefile.in
man/man8/Makefile.in
module/zfs/zfs_vfsops.c
scripts/Makefile.in
scripts/zpios-profile/Makefile.in
scripts/zpios-test/Makefile.in
scripts/zpool-config/Makefile.in
scripts/zpool-layout/Makefile.in
zfs_config.h.in

index 1e38611119cb3a357923636f9dc0afd60562ae6d..dc46e32ab34817bdc3462a9b579ba444cb7ee835 100644 (file)
@@ -56,6 +56,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 379fbf9135c017c258b26e5be37f528f530d57f7..7d868d8a6c857e12196e7832c7b55b5884683900 100644 (file)
@@ -41,6 +41,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 97aa72952980fa01934d65281175e0eeceec6c5c..ccd7a15de36670e2570c6b3f01fac1e4054c5bb6 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index bb6c03a096e26f544d6219bd18ad7133ccc3b402..34bb462df5c7a51556606e34f6400d0a7477fccb 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index c0db5455ba060b7f8c9f85395652b1ba5d171c06..bc78a755c324755bbbefe4dabfc439f0f1e4a4a8 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 42a4884184b7b7348587ff48cb6d1f18bc2b0f2c..7a111898e89732cbdc418684bf94cd4fb75feb5e 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index b0210f8dea16397b9034839aa785c870c44ab9c4..1897fd0675a5e297faf9b668eb598ae5f92d5442 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 363617f486d2de6037160cd27d83f71150af4956..ade9237bdeb05bdcae78b0d37f4d02bae3af7fcb 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 4d2340e163e1fb7b72b06a116e8d9f9808d30b9b..89c7aac14c3f7dd9ab7e63078878f9f5f9e332c7 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index b4d250a74edb96345b600ba5fd8b2824e3c9b870..f4e837c2decf9fb0cade612b309d856fa88ef50e 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 3445915a610daff53131b19997595684d73c0661..e38308a90ceef053811daa0204ff9743b3c90110 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 5e8d4517d45013652d4ce2334a5d55e8d3b8ff08..a9460c6f1b1dc52c702a486c4ffad7f717d9cb23 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 114fa20a5ec1384d3442de9671c2cb0bb849ee4c..ed80d404fbe80d13d09d7c584c58b1a69ad0e916 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
diff --git a/config/kernel-bdi.m4 b/config/kernel-bdi.m4
new file mode 100644 (file)
index 0000000..34ffaab
--- /dev/null
@@ -0,0 +1,18 @@
+dnl #
+dnl # 2.6.32 API change
+dnl # Private backing_device_info interfaces available
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_BDI], [
+       AC_MSG_CHECKING([whether super_block has s_bdi])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/fs.h>
+       ],[
+               struct super_block sb __attribute__ ((unused));
+               sb.s_bdi = NULL;
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_BDI, 1, [struct super_block has s_bdi])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
index 5eaa4d87952c2ebc3560d773e85fb9298c488f3f..87c49a82ce5a9c02b4e73cd4344e9d7c9e66d393 100644 (file)
@@ -40,6 +40,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_TRUNCATE_SETSIZE
        ZFS_AC_KERNEL_6ARGS_SECURITY_INODE_INIT_SECURITY
        ZFS_AC_KERNEL_MOUNT_NODEV
+       ZFS_AC_KERNEL_BDI
 
        if test "$LINUX_OBJ" != "$LINUX"; then
                KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
index f46cc5110a133d22d78d24887d5b1e96f2468b5d..9f444638f2af9578a5c29d208bfcaca6f52e16b4 100755 (executable)
--- a/configure
+++ b/configure
@@ -14686,6 +14686,72 @@ _ACEOF
 
 
 
+       { $as_echo "$as_me:$LINENO: checking whether super_block has s_bdi" >&5
+$as_echo_n "checking whether super_block has s_bdi... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/fs.h>
+
+int
+main (void)
+{
+
+               struct super_block sb __attribute__ ((unused));
+               sb.s_bdi = NULL;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BDI 1
+_ACEOF
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+
+       rm -Rf build
+
+
+
+
        if test "$LINUX_OBJ" != "$LINUX"; then
                KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
        fi
@@ -18956,6 +19022,72 @@ _ACEOF
 
 
 
+       { $as_echo "$as_me:$LINENO: checking whether super_block has s_bdi" >&5
+$as_echo_n "checking whether super_block has s_bdi... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/fs.h>
+
+int
+main (void)
+{
+
+               struct super_block sb __attribute__ ((unused));
+               sb.s_bdi = NULL;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BDI 1
+_ACEOF
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+
+       rm -Rf build
+
+
+
+
        if test "$LINUX_OBJ" != "$LINUX"; then
                KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
        fi
index 33ac12c38d57484d348ff7da08db9e943ac986a1..d3959296ab61f64aa0445c79224c6abe66e2ea88 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 66ec11d7f499a94cc904cc4dcdb929ce6c331f9b..ee654dec9696b4fc9ecb0aa1c45f7b110f659b27 100644 (file)
@@ -41,6 +41,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index c3ed6f2601341fa88bf051f8c969792efb3d456a..4f012e50427c8ffb8b8982654791e560d77b6433 100644 (file)
@@ -41,6 +41,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 1ea6c623caed3eb1993fb0a9d791ba9260ef68ad..7fb9034f08bec510c4ce6e1478a1e2fef1ad5337 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 81ba8b215b724cb5b43a2762638b8bc6e50c7c9d..7a9a0c32fed00f3609bb90195fa9a25dcb8f3d36 100644 (file)
@@ -41,6 +41,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index f5dce7fba159adc38da5397d953abdbbc297b55c..852d44d8b5a36a81c6a900f7728ee386c7cbbc27 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 1f3db549c230129a712506d09347853e0ab72282..ffdd1a959a382543de036b52e208da236e72cb90 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 379657fbcb4a0509294092a04a9112e14abb8625..8764d09583fb8afd70d19e40716767beb59b7cf9 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index e0678c1efcab2fc656f17d24d519714ae22ab79f..3a901c33e1a50d50e9ced7539ab92f3cbeedbd89 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 1d8a523cd999082edc2650d93ec7de4000c61a1e..cbbf21e618b6ea5aa2c2230626a44d4f30ea2cc1 100644 (file)
@@ -62,4 +62,23 @@ truncate_setsize(struct inode *ip, loff_t new)
 }
 #endif /* HAVE_TRUNCATE_SETSIZE */
 
+/*
+ * 2.6.32 API change,
+ * Added backing_device_info (bdi) per super block interfaces.  When
+ * available a bdi must be configured when using a non-device backed
+ * filesystem for proper writeback.  It's safe to leave this code
+ * dormant for kernels which only support pdflush and not bdi.
+ */
+#ifdef HAVE_BDI
+#define        bdi_get_sb(sb)                          (sb->s_bdi)
+#define        bdi_put_sb(sb, bdi)                     (sb->s_bdi = bdi)
+#else
+#define        bdi_init(bdi)                           (0)
+#define        bdi_destroy(bdi)                        (0)
+#define        bdi_register(bdi, parent, fmt, args)    (0)
+#define        bdi_unregister(bdi)                     (0)
+#define        bdi_get_sb(sb)                          (0)
+#define        bdi_put_sb(sb, bdi)                     (0)
+#endif /* HAVE_BDI */
+
 #endif /* _ZFS_VFS_H */
index 53c721f67bf46a2f1d815a6795fd1f5925ee4b1e..4cf397cbaa6af71d62d0c983e671fbc63372bc83 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index fce681a1e0811be8232f086dfd74544638d38709..30d2c4aff12961ed8088ab867a434f7242554273 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 859972f52175fd20803e0c441fb78064e81db843..76a2157042fc6be405583d892570f79c0b7f831c 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 61c97ab10ba6cf3adf18a87e2703591f282af35c..8567e018626c54e4c6cf36437218589009083015 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index ae5f811c0a5f789b480ee3724680760bfabce3c2..c8861f6e2bd57cf70f983c8a73a5b530eae4ddd6 100644 (file)
@@ -43,6 +43,7 @@ struct znode;
 
 typedef struct zfs_sb {
        struct super_block *z_sb;       /* generic super_block */
+       struct backing_dev_info z_bdi;  /* generic backing dev info */
        struct zfs_sb   *z_parent;      /* parent fs */
        objset_t        *z_os;          /* objset reference */
        uint64_t        z_flags;        /* super_block flags */
index 001235471b3deee478066a26f361d1340a8b3902..2f8d492cd8b7c8ceb0a6da0c721b517a93b88932 100644 (file)
@@ -41,6 +41,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 05a76d4714067e1454baaa8fc1ef5747be958d5c..33484b3ab8b19ac9593768615aff8fea875e1867 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 17cf684578ab71d9eb1e35ce1d01d607b046e24e..ec4e14aa185a291831016235f67f9d598f3f4e7d 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 02c35119894b5c8741db07f607c59f5fab2660d9..7d3eaa433e6d9beeff5e8a06fc73ffc0e03a431d 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index b2af5fdc33451eaced97dbd1aa4aeb1ac03b61f2..6254a97b775507377949d3614c2bb5b5ae83b00c 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 11b517ae5ba40b8be95f0298d4e6ef5a34e6e594..238ab009a7942f2fc7066750aba411572e3f2c7b 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 4356f51f629f044a192ca794df6f08824e09ef48..6fe820cd71ec9dc326b2d0fa7dd9ffd1d6705afc 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 4346d0d219d528d28e29a34b4abffb3c5519cbad..1f951adfedeb411b2496b59685f00e3a192679ff 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index e9bab0719a7bc7bb7e21de431ee504d00cfe150d..10226a96eb48ff0129fbe41384c427524e6a936c 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 4990f24b9ebca3f41dbb74ce78ecc98df830ee9d..88b8404951be8983c335178a614ed0cb4a403f54 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index e54dd3be538dc960e9ab6af61f7bd46cb6fd0be3..36af1a80b76e2b380d79fca74683fe85d98ed74c 100644 (file)
@@ -41,6 +41,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index cbcc2e4c3c194b3e221c5082e34c24f2e2fcb204..ff11b1de4e8f1167cf03aa4797373ed08fd89d32 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 13366459844fc7da62efcc7c8869d2286f2e8bc6..e2ae91cf9c6643c701d09d475975cc13b73cc083 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index ae28b4245ca4237e4d5f2559e6e48a3b9c208dd0..eeaca9be189f83d717c314d03b673a045f940177 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 0d33f468cead57878e448d18eb2bebb50d18b875..c9b011530507c93f22e19255fa11bf322a7fd0c4 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 99d2433e6fa42653c42fe96f16751fd4d55a9797..c37669fc40caa1359fb96279b34c1717f95f76ef 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 5539378026fd5e1210754a98e4f19f940883a6e7..70ce9733b3a8e83f30148ad0111323bad5fe85cf 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index faa940e3de093e7cdb1db4eacfddc3daa9fae880..6b5d575907dd5ab1f7db82a294ddb9c426bc1773 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 45c4e84f53ac481b93c72efe886cf94500408446..2c2c8e5a3305765d9d02f2ce853c5820ce7b3b52 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 5dc7d3570691901e40ba6c3aa37637a6b64518d9..ad31c720a248aacb66f95f4c67140a8f27f26e33 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 212c964d0a4fc5df9fe3e011774fa0ab62fdcce2..1b60fe324c645415f9a8c3cef4c3dbee87c5c5f2 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 3c9e7a3702f9016e5443f13f013004ddfb58d69a..068617beb8ff840d0439636caea8476c9ea0a059 100644 (file)
@@ -41,6 +41,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 1c18675a62cd9766af913c528aaa96f8f0435cdc..f9fe5fb80049605c9a52ec3f42d2ab22050e3c31 100644 (file)
@@ -41,6 +41,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index e0987e9191026a023946a0249f17d2acebcf893f..31692f4379d80e0a41d287f3ee494bd1ac7a8066 100644 (file)
@@ -600,6 +600,12 @@ zfs_sb_create(const char *osname, zfs_sb_t **zsbp)
        zsb->z_show_ctldir = ZFS_SNAPDIR_VISIBLE;
        zsb->z_os = os;
 
+       error = -bdi_init(&zsb->z_bdi);
+       if (error) {
+               kmem_free(zsb, sizeof (zfs_sb_t));
+               return (error);
+       }
+
        error = zfs_get_zplprop(os, ZFS_PROP_VERSION, &zsb->z_version);
        if (error) {
                goto out;
@@ -799,6 +805,7 @@ zfs_sb_free(zfs_sb_t *zsb)
 
        zfs_fuid_destroy(zsb);
 
+       bdi_destroy(&zsb->z_bdi);
        mutex_destroy(&zsb->z_znodes_lock);
        mutex_destroy(&zsb->z_lock);
        list_destroy(&zsb->z_all_znodes);
@@ -1077,6 +1084,10 @@ zfsvfs_teardown(zfs_sb_t *zsb, boolean_t unmounting)
        return (0);
 }
 
+#ifdef HAVE_BDI
+static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0);
+#endif /* HAVE_BDI */
+
 int
 zfs_domount(struct super_block *sb, void *data, int silent)
 {
@@ -1102,6 +1113,7 @@ zfs_domount(struct super_block *sb, void *data, int silent)
        sb->s_time_gran = 1;
        sb->s_blocksize = recordsize;
        sb->s_blocksize_bits = ilog2(recordsize);
+       bdi_put_sb(sb, NULL);
 
        /* Set callback operations for the file system. */
        sb->s_op = &zpl_super_operations;
@@ -1126,6 +1138,16 @@ zfs_domount(struct super_block *sb, void *data, int silent)
                dmu_objset_set_user(zsb->z_os, zsb);
                mutex_exit(&zsb->z_os->os_user_ptr_lock);
        } else {
+               /* Disable Linux read-ahead handled by lower layers */
+               zsb->z_bdi.ra_pages = 0;
+
+               error = -bdi_register(&zsb->z_bdi, NULL, "zfs-%d",
+                   atomic_long_inc_return(&bdi_seq));
+               if (error)
+                       goto out;
+
+               bdi_put_sb(sb, &zsb->z_bdi);
+
                error = zfs_sb_setup(zsb, B_TRUE);
 #ifdef HAVE_SNAPSHOT
                (void) zfs_snap_create(zsb);
@@ -1166,6 +1188,11 @@ zfs_umount(struct super_block *sb)
        VERIFY(zfsvfs_teardown(zsb, B_TRUE) == 0);
        os = zsb->z_os;
 
+       if (bdi_get_sb(sb)) {
+               bdi_unregister(bdi_get_sb(sb));
+               bdi_put_sb(sb, NULL);
+       }
+
        /*
         * z_os will be NULL if there was an error in
         * attempting to reopen zsb.
index 51dadb4581dba8a9ccd10260148fd151b6e32a29..3e0c8f9041ecdbd57bc1e36f5e5b330446a700f8 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 550fab69fa688cfa35cb571b2b9663188efa313d..cef88fb46e0aad55f023a4e75eaa5e96c43bebc6 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index d8627109db532b458441dccb3d9eef59d620ba0c..8dbaa6b3de085375144767d6e3e1b7366ff35dc1 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 530fb233270acc3fb9422360de92227e114d0bc6..3a8d836dd2f39ebe4b7cc9591e5bf6a6d70bf9cd 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index 2a000783c2ab077e1a3d0847b5bd697f5e6251ae..e34d0dce8e15d000e40d1e3eef1942ad95af4f36 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/always-no-unused-but-set-variable.m4 \
        $(top_srcdir)/config/kernel-bdev-block-device-operations.m4 \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
+       $(top_srcdir)/config/kernel-bdi.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
        $(top_srcdir)/config/kernel-bio-failfast.m4 \
index d244ac3832481fb18837025b20e7780241b0c31f..cf3c25c46b68a334209b57e36e33040cce969a32 100644 (file)
@@ -18,6 +18,9 @@
 /* bdev_logical_block_size() is available */
 #undef HAVE_BDEV_LOGICAL_BLOCK_SIZE
 
+/* struct super_block has s_bdi */
+#undef HAVE_BDI
+
 /* bio_empy_barrier() is defined */
 #undef HAVE_BIO_EMPTY_BARRIER