X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Fvdev_disk.c;h=9ae8fbc18b47b9153ef85d9f820a9718072ffbc9;hb=312c07edfdbdbabfab7f721797bba8eade5dcdeb;hp=dbf9b08e763aee6ddf0949b3ac21ad8b9f01a993;hpb=60101509ee73c6e61e50c0a4079097f31bb39f4b;p=zfs.git diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c index dbf9b08..9ae8fbc 100644 --- a/module/zfs/vdev_disk.c +++ b/module/zfs/vdev_disk.c @@ -91,6 +91,17 @@ bdev_capacity(struct block_device *bdev) return get_capacity(bdev->bd_disk); } +static void +vdev_disk_error(zio_t *zio) +{ +#ifdef ZFS_DEBUG + printk("ZFS: zio error=%d type=%d offset=%llu " + "size=%llu flags=%x\n", zio->io_error, zio->io_type, + (u_longlong_t)zio->io_offset, (u_longlong_t)zio->io_size, + zio->io_flags); +#endif +} + static int vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *ashift) { @@ -133,9 +144,19 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *ashift) vd->vd_bdev = bdev; block_size = vdev_bdev_block_size(bdev); - /* Check if this is a whole device. When bdev->bd_contains == - * bdev we have a whole device and not simply a partition. */ - v->vdev_wholedisk = !!(bdev->bd_contains == bdev); + /* We think the wholedisk property should always be set when this + * function is called. ASSERT here so if any legitimate cases exist + * where it's not set, we'll find them during debugging. If we never + * hit the ASSERT, this and the following conditional statement can be + * removed. */ + ASSERT3S(v->vdev_wholedisk, !=, -1ULL); + + /* The wholedisk property was initialized to -1 in vdev_alloc() if it + * was unspecified. In that case, check if this is a whole device. + * When bdev->bd_contains == bdev we have a whole device and not simply + * a partition. */ + if (v->vdev_wholedisk == -1ULL) + v->vdev_wholedisk = (bdev->bd_contains == bdev); /* Clear the nowritecache bit, causes vdev_reopen() to try again. */ v->vdev_nowritecache = B_FALSE; @@ -222,6 +243,9 @@ vdev_disk_dio_put(dio_request_t *dr) if (zio) { zio->io_error = error; + ASSERT3S(zio->io_error, >=, 0); + if (zio->io_error) + vdev_disk_error(zio); zio_interrupt(zio); } } @@ -249,10 +273,10 @@ BIO_END_IO_PROTO(vdev_disk_physio_completion, bio, size, error) #endif /* HAVE_2ARGS_BIO_END_IO_T */ if (error == 0 && !test_bit(BIO_UPTODATE, &bio->bi_flags)) - error = EIO; + error = -EIO; if (dr->dr_error == 0) - dr->dr_error = error; + dr->dr_error = -error; /* Drop reference aquired by __vdev_disk_physio */ rc = vdev_disk_dio_put(dr); @@ -424,6 +448,9 @@ BIO_END_IO_PROTO(vdev_disk_io_flush_completion, bio, size, rc) zio->io_vd->vdev_nowritecache = B_TRUE; bio_put(bio); + ASSERT3S(zio->io_error, >=, 0); + if (zio->io_error) + vdev_disk_error(zio); zio_interrupt(zio); BIO_END_IO_RETURN(0);