diff options
author | Lukas Wunner <[email protected]> | 2015-09-23 17:55:15 +0200 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2015-09-25 12:44:54 -0700 |
commit | 784a7fe5d9a0c02e96f3ae019a08ecebee2a7018 (patch) | |
tree | 2a2c0491137685e4d89014930ca9cd2aac2a898c /module | |
parent | 4a4809faab83be1bc723086ad44816bacf646ae3 (diff) |
Linux 4.3 compat: bio_end_io_t / BIO_UPTODATE
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 <[email protected]>
Signed-off-by: Lukas Wunner <[email protected]>
Issue #3799
Diffstat (limited to 'module')
-rw-r--r-- | module/zfs/vdev_disk.c | 31 | ||||
-rw-r--r-- | module/zfs/zvol.c | 2 |
2 files changed, 16 insertions, 17 deletions
diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c index e7e2b3b93..eac0f296e 100644 --- a/module/zfs/vdev_disk.c +++ b/module/zfs/vdev_disk.c @@ -424,21 +424,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); @@ -446,8 +446,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 @@ -624,9 +622,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; @@ -638,8 +639,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 diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index 37c39d19a..c81f02a39 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -752,7 +752,7 @@ zvol_request(struct request_queue *q, struct bio *bio) out2: generic_end_io_acct(rw, &zv->zv_disk->part0, start); out1: - bio_endio(bio, -error); + BIO_END_IO(bio, -error); spl_fstrans_unmark(cookie); #ifdef HAVE_MAKE_REQUEST_FN_RET_INT return (0); |