]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
Linux 4.3 compat: bio_end_io_t / BIO_UPTODATE
authorLukas Wunner <lukas@wunner.de>
Wed, 23 Sep 2015 15:55:15 +0000 (17:55 +0200)
committerTim Gardner <tim.gardner@canonical.com>
Fri, 26 Feb 2016 02:44:02 +0000 (19:44 -0700)
Commit torvalds/linux@4246a0b63bd8f56a1469b12eafeb875b1041a451
("block: add a bi_error field to struct bio") dropped the error
argument from bio_endio in favor of newly introduced bio->bi_error.
This also replaces bio->bi_flags value BIO_UPTODATE.

bio_endio was a 3 argument function until Linux 2.6.24, which made it
a 2 argument function, and now the prototype has changed yet again to
a 1 argument function. Support for pre 2.6.24 kernels was already
dropped with 37f9dac592bf ("zvol processing should use struct bio")
which assumed the 2 argument version in zvol_request(). Remaining code
to support the 3 argument version is hereby removed.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Issue #3799

zfs/config/kernel-bio-end-io-t-args.m4
zfs/include/linux/blkdev_compat.h
zfs/module/zfs/vdev_disk.c

index 407e55cd0103ef3e96ab3a62c151d464491bb62b..c8c520f1ba8295be4762b0099f121f92c10df85f 100644 (file)
@@ -1,25 +1,23 @@
 dnl #
-dnl # 2.6.24 API change
-dnl # Size argument dropped from bio_endio and bi_end_io, because the
-dnl # bi_end_io is only called once now when the request is complete.
-dnl # There is no longer any need for a size argument.  This also means
-dnl # that partial IO's are no longer possibe and the end_io callback
-dnl # should not check bi->bi_size.  Finally, the return type was updated
-dnl # to void.
+dnl # 4.3 API change
+dnl # Error argument dropped from bio_endio in favor of newly introduced
+dnl # bio->bi_error. This also replaces bio->bi_flags value BIO_UPTODATE.
+dnl # Introduced by torvalds/linux@4246a0b63bd8f56a1469b12eafeb875b1041a451
+dnl # ("block: add a bi_error field to struct bio").
 dnl #
 AC_DEFUN([ZFS_AC_KERNEL_BIO_END_IO_T_ARGS], [
-       AC_MSG_CHECKING([whether bio_end_io_t wants 2 args])
+       AC_MSG_CHECKING([whether bio_end_io_t wants 1 arg])
        ZFS_LINUX_TRY_COMPILE([
                #include <linux/bio.h>
 
-               void wanted_end_io(struct bio *bio, int x) { return; }
+               void wanted_end_io(struct bio *bio) { return; }
 
                bio_end_io_t *end_io __attribute__ ((unused)) = wanted_end_io;
        ],[
        ],[
                AC_MSG_RESULT(yes)
-               AC_DEFINE(HAVE_2ARGS_BIO_END_IO_T, 1,
-                         [bio_end_io_t wants 2 args])
+               AC_DEFINE(HAVE_1ARG_BIO_END_IO_T, 1,
+                         [bio_end_io_t wants 1 arg])
        ],[
                AC_MSG_RESULT(no)
        ])
index 8566033fcfd22525254e0fd96ca864397df5a906..163e03d7bcd269b342b9e730fd3f6babce33786d 100644 (file)
@@ -377,20 +377,17 @@ bio_set_flags_failfast(struct block_device *bdev, int *flags)
 #endif /* DISK_NAME_LEN */
 
 /*
- * 2.6.24 API change,
- * The bio_end_io() prototype changed slightly.  These are helper
- * macro's to ensure the prototype and return value are handled.
+ * 4.3 API change
+ * The bio_endio() prototype changed slightly.  These are helper
+ * macro's to ensure the prototype and invocation are handled.
  */
-#ifdef HAVE_2ARGS_BIO_END_IO_T
-#define        BIO_END_IO_PROTO(fn, x, y, z)   static void fn(struct bio *x, int z)
-#define        BIO_END_IO_RETURN(rc)           return
+#ifdef HAVE_1ARG_BIO_END_IO_T
+#define        BIO_END_IO_PROTO(fn, x, z)      static void fn(struct bio *x)
+#define        BIO_END_IO(bio, error)          bio->bi_error = error; bio_endio(bio);
 #else
-#define        BIO_END_IO_PROTO(fn, x, y, z)   static int fn( \
-                                           struct bio *x, \
-                                           unsigned int y, \
-                                           int z)
-#define        BIO_END_IO_RETURN(rc)           return rc
-#endif /* HAVE_2ARGS_BIO_END_IO_T */
+#define        BIO_END_IO_PROTO(fn, x, z)      static void fn(struct bio *x, int z)
+#define        BIO_END_IO(bio, error)          bio_endio(bio, error);
+#endif /* HAVE_1ARG_BIO_END_IO_T */
 
 /*
  * 2.6.38 - 2.6.x API,
index a52d13a7450b81a241f6bf179e764dc8415b535a..c860e7cb6db8a7b4ce9ed261152b02666c91469b 100644 (file)
@@ -421,21 +421,21 @@ vdev_disk_dio_put(dio_request_t *dr)
        return (rc);
 }
 
-BIO_END_IO_PROTO(vdev_disk_physio_completion, bio, size, error)
+BIO_END_IO_PROTO(vdev_disk_physio_completion, bio, error)
 {
        dio_request_t *dr = bio->bi_private;
        int rc;
 
-#ifndef HAVE_2ARGS_BIO_END_IO_T
-       if (BIO_BI_SIZE(bio))
-               return (1);
-#endif /* HAVE_2ARGS_BIO_END_IO_T */
-
-       if (error == 0 && !test_bit(BIO_UPTODATE, &bio->bi_flags))
-               error = (-EIO);
-
-       if (dr->dr_error == 0)
-               dr->dr_error = -error;
+       if (dr->dr_error == 0) {
+#ifdef HAVE_1ARG_BIO_END_IO_T
+               dr->dr_error = -(bio->bi_error);
+#else
+               if (error)
+                       dr->dr_error = -(error);
+               else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
+                       dr->dr_error = EIO;
+#endif
+       }
 
        /* Drop reference aquired by __vdev_disk_physio */
        rc = vdev_disk_dio_put(dr);
@@ -443,8 +443,6 @@ BIO_END_IO_PROTO(vdev_disk_physio_completion, bio, size, error)
        /* Wake up synchronous waiter this is the last outstanding bio */
        if ((rc == 1) && vdev_disk_dio_is_sync(dr))
                complete(&dr->dr_comp);
-
-       BIO_END_IO_RETURN(0);
 }
 
 static inline unsigned long
@@ -605,9 +603,12 @@ vdev_disk_physio(struct block_device *bdev, caddr_t kbuf,
        return (__vdev_disk_physio(bdev, NULL, kbuf, size, offset, flags));
 }
 
-BIO_END_IO_PROTO(vdev_disk_io_flush_completion, bio, size, rc)
+BIO_END_IO_PROTO(vdev_disk_io_flush_completion, bio, rc)
 {
        zio_t *zio = bio->bi_private;
+#ifdef HAVE_1ARG_BIO_END_IO_T
+       int rc = bio->bi_error;
+#endif
 
        zio->io_delay = jiffies_64 - zio->io_delay;
        zio->io_error = -rc;
@@ -619,8 +620,6 @@ BIO_END_IO_PROTO(vdev_disk_io_flush_completion, bio, size, rc)
        if (zio->io_error)
                vdev_disk_error(zio);
        zio_interrupt(zio);
-
-       BIO_END_IO_RETURN(0);
 }
 
 static int