]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
UBUNTU: SAUCE: Fix non-prefaulted page deadlock (LP: #1754584)
authorColin Ian King <colin.king@canonical.com>
Wed, 28 Mar 2018 15:42:00 +0000 (17:42 +0200)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Tue, 3 Apr 2018 15:54:47 +0000 (17:54 +0200)
BugLink: https://bugs.launchpad.net/bugs/1754584
Fix mmap'd libaio read on non-prefaulted page deadlock. This is a hot fix
from ZFS upstream that ensure pages do not deadlock.

Performing a read with the target data in a mmap'd page that is map'd into
the same blocks that are being read causes a lock on the page and a further
lock on the same page when the page is being faulted in, causing deadlock.

Signed-off-by: Colin Ian King <colin.king@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
15 files changed:
zfs/META
zfs/Makefile.in
zfs/aclocal.m4
zfs/config/user-libaio.m4 [new file with mode: 0644]
zfs/config/user.m4
zfs/config/zfs-build.m4
zfs/configure
zfs/include/Makefile.in
zfs/include/linux/Makefile.in
zfs/include/sys/Makefile.in
zfs/include/sys/fm/Makefile.in
zfs/include/sys/fm/fs/Makefile.in
zfs/include/sys/fs/Makefile.in
zfs/module/zfs/zfs_vnops.c
zfs/zfs_config.h.in

index 476e914de33066a07c498142957b7ddb58cdff37..8d835fa50f8b551693ea725508dfa33a9daba270 100644 (file)
--- a/zfs/META
+++ b/zfs/META
@@ -2,7 +2,7 @@ Meta:         1
 Name:         zfs
 Branch:       1.0
 Version:      0.6.5.11
-Release:      1ubuntu3.2
+Release:      1ubuntu3.3
 Release-Tags: relext
 License:      CDDL
 Author:       OpenZFS on Linux
index 0793205bb13e2d3cfd036848c301beb5581711dc..3089589768f684910836b318a983cd327e890d1f 100644 (file)
@@ -184,6 +184,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
        $(top_srcdir)/config/user-arch.m4 \
        $(top_srcdir)/config/user-dracut.m4 \
        $(top_srcdir)/config/user-frame-larger-than.m4 \
+       $(top_srcdir)/config/user-libaio.m4 \
        $(top_srcdir)/config/user-libblkid.m4 \
        $(top_srcdir)/config/user-libuuid.m4 \
        $(top_srcdir)/config/user-makedev.m4 \
@@ -412,6 +413,7 @@ KERNELCPPFLAGS = @KERNELCPPFLAGS@
 KERNELMAKE_PARAMS = @KERNELMAKE_PARAMS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
+LIBAIO = @LIBAIO@
 LIBBLKID = @LIBBLKID@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
index 4be369660e9c393acc3fa34680b5aaff9f17cb22..a27355f6352f5e5b6a30f6f18e9e64bf99b41298 100644 (file)
@@ -1292,6 +1292,7 @@ m4_include([config/mount-helper.m4])
 m4_include([config/user-arch.m4])
 m4_include([config/user-dracut.m4])
 m4_include([config/user-frame-larger-than.m4])
+m4_include([config/user-libaio.m4])
 m4_include([config/user-libblkid.m4])
 m4_include([config/user-libuuid.m4])
 m4_include([config/user-makedev.m4])
diff --git a/zfs/config/user-libaio.m4 b/zfs/config/user-libaio.m4
new file mode 100644 (file)
index 0000000..d7a7cb5
--- /dev/null
@@ -0,0 +1,14 @@
+dnl #
+dnl # Check for libaio - only used for libaiot test cases.
+dnl #
+AC_DEFUN([ZFS_AC_CONFIG_USER_LIBAIO], [
+       LIBAIO=
+
+       AC_CHECK_HEADER([libaio.h], [
+           user_libaio=yes
+           AC_SUBST([LIBAIO], ["-laio"])
+           AC_DEFINE([HAVE_LIBAIO], 1, [Define if you have libaio])
+       ], [
+           user_libaio=no
+       ])
+])
index 87323937a58993ded149fc43f1dfc5371c36c0af..29c81cd81e5fb10fefdc62778e85e23e09a09148 100644 (file)
@@ -5,6 +5,7 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [
        ZFS_AC_DKMS_INHIBIT
        ZFS_AC_CONFIG_USER_MOUNT_HELPER
        ZFS_AC_CONFIG_USER_UDEV
+       ZFS_AC_CONFIG_USER_LIBAIO
        ZFS_AC_CONFIG_USER_SYSTEMD
        ZFS_AC_CONFIG_USER_SYSVINIT
        ZFS_AC_CONFIG_USER_DRACUT
index facd30282701a642e920d9e9e2a9568fa37a6029..65325ceae24c39ef454f67c3d395ee296640621b 100644 (file)
@@ -103,6 +103,8 @@ AC_DEFUN([ZFS_AC_CONFIG], [
        AM_CONDITIONAL([CONFIG_KERNEL],
                       [test "$ZFS_CONFIG" = kernel -o "$ZFS_CONFIG" = all] &&
                       [test "x$enable_linux_builtin" != xyes ])
+       AM_CONDITIONAL([WANT_DEVNAME2DEVID], [test "x$user_libudev" = xyes ])
+       AM_CONDITIONAL([WANT_MMAP_LIBAIO], [test "x$user_libaio" = xyes ])
 ])
 
 dnl #
index 9634569bb611b413ea4d8d501fe1486a6ac3a4cf..02ce40717438f426b47a52ea7d85c7fe979ee1d1 100755 (executable)
@@ -636,6 +636,10 @@ DEBUG_DMU_TX
 DEBUG_ZFS
 DEBUG_STACKFLAGS
 DEBUG_CFLAGS
+WANT_MMAP_LIBAIO_FALSE
+WANT_MMAP_LIBAIO_TRUE
+WANT_DEVNAME2DEVID_FALSE
+WANT_DEVNAME2DEVID_TRUE
 CONFIG_KERNEL_FALSE
 CONFIG_KERNEL_TRUE
 CONFIG_USER_FALSE
@@ -662,6 +666,7 @@ systemdpresetdir
 systemdunitdir
 ZFS_MODULE_LOAD
 ZFS_INIT_SYSTEMD
+LIBAIO
 udevruledir
 udevdir
 mounthelperdir
 $as_echo "$udevdir;$udevruledir" >&6; }
 
 
+       LIBAIO=
+
+       ac_fn_c_check_header_mongrel "$LINENO" "libaio.h" "ac_cv_header_libaio_h" "$ac_includes_default"
+if test "x$ac_cv_header_libaio_h" = xyes; then :
+
+           user_libaio=yes
+           LIBAIO="-laio"
+
+
+$as_echo "#define HAVE_LIBAIO 1" >>confdefs.h
+
+
+else
+
+           user_libaio=no
+
+fi
+
+
+
+
        # Check whether --enable-systemd was given.
 if test "${enable_systemd+set}" = set; then :
   enableval=$enable_systemd;
 $as_echo "$udevdir;$udevruledir" >&6; }
 
 
+       LIBAIO=
+
+       ac_fn_c_check_header_mongrel "$LINENO" "libaio.h" "ac_cv_header_libaio_h" "$ac_includes_default"
+if test "x$ac_cv_header_libaio_h" = xyes; then :
+
+           user_libaio=yes
+           LIBAIO="-laio"
+
+
+$as_echo "#define HAVE_LIBAIO 1" >>confdefs.h
+
+
+else
+
+           user_libaio=no
+
+fi
+
+
+
+
        # Check whether --enable-systemd was given.
 if test "${enable_systemd+set}" = set; then :
   enableval=$enable_systemd;
@@ -37899,6 +37946,22 @@ else
   CONFIG_KERNEL_FALSE=
 fi
 
+        if test "x$user_libudev" = xyes ; then
+  WANT_DEVNAME2DEVID_TRUE=
+  WANT_DEVNAME2DEVID_FALSE='#'
+else
+  WANT_DEVNAME2DEVID_TRUE='#'
+  WANT_DEVNAME2DEVID_FALSE=
+fi
+
+        if test "x$user_libaio" = xyes ; then
+  WANT_MMAP_LIBAIO_TRUE=
+  WANT_MMAP_LIBAIO_FALSE='#'
+else
+  WANT_MMAP_LIBAIO_TRUE='#'
+  WANT_MMAP_LIBAIO_FALSE=
+fi
+
 
 
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether debugging is enabled" >&5
@@ -38120,6 +38183,14 @@ if test -z "${CONFIG_KERNEL_TRUE}" && test -z "${CONFIG_KERNEL_FALSE}"; then
   as_fn_error $? "conditional \"CONFIG_KERNEL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${WANT_DEVNAME2DEVID_TRUE}" && test -z "${WANT_DEVNAME2DEVID_FALSE}"; then
+  as_fn_error $? "conditional \"WANT_DEVNAME2DEVID\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WANT_MMAP_LIBAIO_TRUE}" && test -z "${WANT_MMAP_LIBAIO_FALSE}"; then
+  as_fn_error $? "conditional \"WANT_MMAP_LIBAIO\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
 : "${CONFIG_STATUS=./config.status}"
 ac_write_fail=0
index bd90322d2ac23b7664db904797b41c724bce5eb6..7c77b15dce7451b4283a57358189bc71e32cc3af 100644 (file)
@@ -176,6 +176,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
        $(top_srcdir)/config/user-arch.m4 \
        $(top_srcdir)/config/user-dracut.m4 \
        $(top_srcdir)/config/user-frame-larger-than.m4 \
+       $(top_srcdir)/config/user-libaio.m4 \
        $(top_srcdir)/config/user-libblkid.m4 \
        $(top_srcdir)/config/user-libuuid.m4 \
        $(top_srcdir)/config/user-makedev.m4 \
@@ -387,6 +388,7 @@ KERNELCPPFLAGS = @KERNELCPPFLAGS@
 KERNELMAKE_PARAMS = @KERNELMAKE_PARAMS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
+LIBAIO = @LIBAIO@
 LIBBLKID = @LIBBLKID@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
index 9deb2b6f136dcfd8f78f2513976b95ca2008393b..b774eb2001dd095bad51fafc089581d32a9c1739 100644 (file)
@@ -176,6 +176,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
        $(top_srcdir)/config/user-arch.m4 \
        $(top_srcdir)/config/user-dracut.m4 \
        $(top_srcdir)/config/user-frame-larger-than.m4 \
+       $(top_srcdir)/config/user-libaio.m4 \
        $(top_srcdir)/config/user-libblkid.m4 \
        $(top_srcdir)/config/user-libuuid.m4 \
        $(top_srcdir)/config/user-makedev.m4 \
@@ -329,6 +330,7 @@ KERNELCPPFLAGS = @KERNELCPPFLAGS@
 KERNELMAKE_PARAMS = @KERNELMAKE_PARAMS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
+LIBAIO = @LIBAIO@
 LIBBLKID = @LIBBLKID@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
index 68f4a7bb5330bea9781b1e65cc9006e5b9045687..eb1b7d1e69e8394919ec2d4188c3a8b54376ba3b 100644 (file)
@@ -176,6 +176,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
        $(top_srcdir)/config/user-arch.m4 \
        $(top_srcdir)/config/user-dracut.m4 \
        $(top_srcdir)/config/user-frame-larger-than.m4 \
+       $(top_srcdir)/config/user-libaio.m4 \
        $(top_srcdir)/config/user-libblkid.m4 \
        $(top_srcdir)/config/user-libuuid.m4 \
        $(top_srcdir)/config/user-makedev.m4 \
@@ -561,6 +562,7 @@ KERNELCPPFLAGS = @KERNELCPPFLAGS@
 KERNELMAKE_PARAMS = @KERNELMAKE_PARAMS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
+LIBAIO = @LIBAIO@
 LIBBLKID = @LIBBLKID@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
index aaa8bf9eed137200491085e0fcc600f8afaa00b0..8ef54373a89e82e8dc476b2e8044c44a7309233a 100644 (file)
@@ -176,6 +176,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
        $(top_srcdir)/config/user-arch.m4 \
        $(top_srcdir)/config/user-dracut.m4 \
        $(top_srcdir)/config/user-frame-larger-than.m4 \
+       $(top_srcdir)/config/user-libaio.m4 \
        $(top_srcdir)/config/user-libblkid.m4 \
        $(top_srcdir)/config/user-libuuid.m4 \
        $(top_srcdir)/config/user-makedev.m4 \
@@ -369,6 +370,7 @@ KERNELCPPFLAGS = @KERNELCPPFLAGS@
 KERNELMAKE_PARAMS = @KERNELMAKE_PARAMS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
+LIBAIO = @LIBAIO@
 LIBBLKID = @LIBBLKID@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
index a0a9a7e3d3507d94f08cef655429713b71709a63..e1277f730e473bd5ea6cb8fac0e6b7b7bf9e7574 100644 (file)
@@ -176,6 +176,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
        $(top_srcdir)/config/user-arch.m4 \
        $(top_srcdir)/config/user-dracut.m4 \
        $(top_srcdir)/config/user-frame-larger-than.m4 \
+       $(top_srcdir)/config/user-libaio.m4 \
        $(top_srcdir)/config/user-libblkid.m4 \
        $(top_srcdir)/config/user-libuuid.m4 \
        $(top_srcdir)/config/user-makedev.m4 \
@@ -325,6 +326,7 @@ KERNELCPPFLAGS = @KERNELCPPFLAGS@
 KERNELMAKE_PARAMS = @KERNELMAKE_PARAMS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
+LIBAIO = @LIBAIO@
 LIBBLKID = @LIBBLKID@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
index c556d057ceb57d9e281250eefd24c7da2a789712..1016d242d3da674d4e199821b575d54c15f259c1 100644 (file)
@@ -176,6 +176,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
        $(top_srcdir)/config/user-arch.m4 \
        $(top_srcdir)/config/user-dracut.m4 \
        $(top_srcdir)/config/user-frame-larger-than.m4 \
+       $(top_srcdir)/config/user-libaio.m4 \
        $(top_srcdir)/config/user-libblkid.m4 \
        $(top_srcdir)/config/user-libuuid.m4 \
        $(top_srcdir)/config/user-makedev.m4 \
@@ -325,6 +326,7 @@ KERNELCPPFLAGS = @KERNELCPPFLAGS@
 KERNELMAKE_PARAMS = @KERNELMAKE_PARAMS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
+LIBAIO = @LIBAIO@
 LIBBLKID = @LIBBLKID@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
index 437a63a638d1c6f386cd0fbac51c28e183c86dbd..2a5b76d79f2faf24bdab861bfb58d1b24ae47878 100644 (file)
@@ -391,6 +391,7 @@ mappedread(struct inode *ip, int nbytes, uio_t *uio)
                pp = find_lock_page(mp, start >> PAGE_SHIFT);
                if (pp) {
                        ASSERT(PageUptodate(pp));
+                       unlock_page(pp);
 
                        pb = kmap(pp);
                        error = uiomove(pb + off, bytes, UIO_READ, uio);
@@ -400,7 +401,6 @@ mappedread(struct inode *ip, int nbytes, uio_t *uio)
                                flush_dcache_page(pp);
 
                        mark_page_accessed(pp);
-                       unlock_page(pp);
                        put_page(pp);
                } else {
                        error = dmu_read_uio_dbuf(sa_get_db(zp->z_sa_hdl),
index 94bbeb9e6216eeb6c8a78f4afb75323618600d60..679f31a90a2d61569dedacbfca4162a72e9eb5ea 100644 (file)
 /* kernel has large stacks */
 #undef HAVE_LARGE_STACKS
 
+/* Define if you have libaio */
+#undef HAVE_LIBAIO
+
 /* Define if you have libblkid */
 #undef HAVE_LIBBLKID