mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
Linux 4.3 compat: bio_end_io_t / BIO_UPTODATE
Commit torvalds/linux@4246a0b63b
("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 37f9dac592 ("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
This commit is contained in:
committed by
Brian Behlendorf
parent
4a4809faab
commit
784a7fe5d9
+15
-16
@@ -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
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user