mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-27 04:32:16 +03:00
Illumos 4958 zdb trips assert on pools with ashift >= 0xe
4958 zdb trips assert on pools with ashift >= 0xe Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: Max Grossman <max.grossman@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Christopher Siden <christopher.siden@delphix.com> Approved by: Garrett D'Amore <garrett@damore.org> References: https://www.illumos.org/issues/4958 https://github.com/illumos/illumos-gate/commit/2a104a5 Porting notes: Keep the ZIO_FLAG_FASTWRITE define. This is for a feature present in Linux but not yet in *BSD. Ported by: Turbo Fredriksson <turbo@bayour.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #2697
This commit is contained in:
committed by
Brian Behlendorf
parent
adc90e9d94
commit
b02fe35d37
+23
-7
@@ -889,8 +889,8 @@ zio_read_phys(zio_t *pio, vdev_t *vd, uint64_t offset, uint64_t size,
|
||||
ASSERT3U(offset + size, <=, vd->vdev_psize);
|
||||
|
||||
zio = zio_create(pio, vd->vdev_spa, 0, NULL, data, size, done, private,
|
||||
ZIO_TYPE_READ, priority, flags, vd, offset, NULL,
|
||||
ZIO_STAGE_OPEN, ZIO_READ_PHYS_PIPELINE);
|
||||
ZIO_TYPE_READ, priority, flags | ZIO_FLAG_PHYSICAL, vd, offset,
|
||||
NULL, ZIO_STAGE_OPEN, ZIO_READ_PHYS_PIPELINE);
|
||||
|
||||
zio->io_prop.zp_checksum = checksum;
|
||||
|
||||
@@ -910,8 +910,8 @@ zio_write_phys(zio_t *pio, vdev_t *vd, uint64_t offset, uint64_t size,
|
||||
ASSERT3U(offset + size, <=, vd->vdev_psize);
|
||||
|
||||
zio = zio_create(pio, vd->vdev_spa, 0, NULL, data, size, done, private,
|
||||
ZIO_TYPE_WRITE, priority, flags, vd, offset, NULL,
|
||||
ZIO_STAGE_OPEN, ZIO_WRITE_PHYS_PIPELINE);
|
||||
ZIO_TYPE_WRITE, priority, flags | ZIO_FLAG_PHYSICAL, vd, offset,
|
||||
NULL, ZIO_STAGE_OPEN, ZIO_WRITE_PHYS_PIPELINE);
|
||||
|
||||
zio->io_prop.zp_checksum = checksum;
|
||||
|
||||
@@ -2642,7 +2642,9 @@ zio_vdev_io_start(zio_t *zio)
|
||||
|
||||
align = 1ULL << vd->vdev_top->vdev_ashift;
|
||||
|
||||
if (P2PHASE(zio->io_size, align) != 0) {
|
||||
if (!(zio->io_flags & ZIO_FLAG_PHYSICAL) &&
|
||||
P2PHASE(zio->io_size, align) != 0) {
|
||||
/* Transform logical writes to be a full physical block size. */
|
||||
uint64_t asize = P2ROUNDUP(zio->io_size, align);
|
||||
char *abuf = zio_buf_alloc(asize);
|
||||
ASSERT(vd == vd->vdev_top);
|
||||
@@ -2653,8 +2655,22 @@ zio_vdev_io_start(zio_t *zio)
|
||||
zio_push_transform(zio, abuf, asize, asize, zio_subblock);
|
||||
}
|
||||
|
||||
ASSERT(P2PHASE(zio->io_offset, align) == 0);
|
||||
ASSERT(P2PHASE(zio->io_size, align) == 0);
|
||||
/*
|
||||
* If this is not a physical io, make sure that it is properly aligned
|
||||
* before proceeding.
|
||||
*/
|
||||
if (!(zio->io_flags & ZIO_FLAG_PHYSICAL)) {
|
||||
ASSERT0(P2PHASE(zio->io_offset, align));
|
||||
ASSERT0(P2PHASE(zio->io_size, align));
|
||||
} else {
|
||||
/*
|
||||
* For physical writes, we allow 512b aligned writes and assume
|
||||
* the device will perform a read-modify-write as necessary.
|
||||
*/
|
||||
ASSERT0(P2PHASE(zio->io_offset, SPA_MINBLOCKSIZE));
|
||||
ASSERT0(P2PHASE(zio->io_size, SPA_MINBLOCKSIZE));
|
||||
}
|
||||
|
||||
VERIFY(zio->io_type != ZIO_TYPE_WRITE || spa_writeable(spa));
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user