Skip to content

Commit d88f6f1

Browse files
author
Paul Dagnelie
committed
endianness?
Signed-off-by: Paul Dagnelie <[email protected]>
1 parent 423b21b commit d88f6f1

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

module/zfs/vdev_anyraid.c

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,13 @@ anyraid_open_existing(vdev_t *vd, uint64_t child, uint16_t **child_capacities)
592592
map_buf = abd_borrow_buf(map_abds[next_map],
593593
SPA_MAXBLOCKSIZE);
594594
map = next_map;
595+
596+
#ifdef _ZFS_BIG_ENDIAN
597+
uint32_t length = map_length -
598+
next_map * SPA_MAXBLOCKSIZE;
599+
byteswap_uint32_array(map_buf, length <
600+
SPA_MAXBLOCKSIZE ? length : SPA_MAXBLOCKSIZE);
601+
#endif
595602
}
596603
anyraid_map_entry_t *entry =
597604
(anyraid_map_entry_t *)(map_buf + (off % SPA_MAXBLOCKSIZE));
@@ -1244,9 +1251,16 @@ anyraid_map_write_done(zio_t *zio)
12441251
}
12451252

12461253
static void
1247-
map_write_issue(zio_t *zio, vdev_t *vd, uint64_t base_offset, uint8_t idx,
1248-
abd_t *abd, zio_eck_t *cksum_out, int flags)
1254+
map_write_issue(zio_t *zio, vdev_t *vd, uint64_t base_offset,
1255+
uint8_t idx, uint32_t length, abd_t *abd, zio_eck_t *cksum_out,
1256+
int flags)
12491257
{
1258+
#ifdef _ZFS_BIG_ENDIAN
1259+
byteswap_uint32_array(abd, length);
1260+
#else
1261+
(void) length;
1262+
#endif
1263+
12501264
zio_nowait(zio_write_phys(zio, vd, base_offset +
12511265
idx * VDEV_ANYRAID_MAP_SIZE +
12521266
VDEV_ANYRAID_MAP_HEADER_SIZE(vd->vdev_ashift), SPA_MAXBLOCKSIZE,
@@ -1317,7 +1331,7 @@ vdev_anyraid_write_map_sync(vdev_t *vd, zio_t *pio, uint64_t txg,
13171331
break;
13181332
abd_return_buf_copy(map_abd, buf, SPA_MAXBLOCKSIZE);
13191333
map_write_issue(zio, vd, base_offset, written,
1320-
map_abd, &cksums[written], flags);
1334+
buf_offset, map_abd, &cksums[written], flags);
13211335

13221336
map_abd = abd_alloc_linear(SPA_MAXBLOCKSIZE, B_TRUE);
13231337
written++;
@@ -1352,7 +1366,7 @@ vdev_anyraid_write_map_sync(vdev_t *vd, zio_t *pio, uint64_t txg,
13521366
rw_exit(&var->vd_lock);
13531367

13541368
abd_return_buf_copy(map_abd, buf, SPA_MAXBLOCKSIZE);
1355-
map_write_issue(zio, vd, base_offset, written, map_abd,
1369+
map_write_issue(zio, vd, base_offset, written, buf_offset, map_abd,
13561370
&cksums[written], flags);
13571371

13581372
if (zio_wait(zio))
@@ -1385,7 +1399,9 @@ vdev_anyraid_write_map_sync(vdev_t *vd, zio_t *pio, uint64_t txg,
13851399
var->vd_checkpoint_tile);
13861400
}
13871401
size_t packed_size;
1388-
char *packed = fnvlist_pack(header, &packed_size);
1402+
char *packed;
1403+
VERIFY0(nvlist_pack(header, &packed, &packed_size, NV_ENCODE_XDR,
1404+
KM_SLEEP));
13891405
ASSERT3U(packed_size, <, nvl_bytes);
13901406
memcpy(header_buf, packed, packed_size);
13911407
fnvlist_pack_free(packed, packed_size);

0 commit comments

Comments
 (0)