{
dmu_replay_record_t *drr;
void *buf = zfs_alloc(hdl, SPA_MAXBLOCKSIZE);
+ uint64_t payload_size;
char errbuf[1024];
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
- "cannot receive:"));
+ "cannot receive"));
/* XXX would be great to use lseek if possible... */
drr = buf;
drr->drr_u.drr_object.drr_bonuslen =
BSWAP_32(drr->drr_u.drr_object.
drr_bonuslen);
+ drr->drr_u.drr_object.drr_raw_bonuslen =
+ BSWAP_32(drr->drr_u.drr_object.
+ drr_raw_bonuslen);
}
- (void) recv_read(hdl, fd, buf,
- P2ROUNDUP(drr->drr_u.drr_object.drr_bonuslen, 8),
+
+ payload_size =
+ DRR_OBJECT_PAYLOAD_SIZE(&drr->drr_u.drr_object);
+ (void) recv_read(hdl, fd, buf, payload_size,
B_FALSE, NULL);
break;
BSWAP_64(
drr->drr_u.drr_write.drr_compressed_size);
}
- uint64_t payload_size =
+ payload_size =
DRR_WRITE_PAYLOAD_SIZE(&drr->drr_u.drr_write);
(void) recv_read(hdl, fd, buf,
payload_size, B_FALSE, NULL);
if (byteswap) {
drr->drr_u.drr_spill.drr_length =
BSWAP_64(drr->drr_u.drr_spill.drr_length);
+ drr->drr_u.drr_spill.drr_compressed_size =
+ BSWAP_64(drr->drr_u.drr_spill.
+ drr_compressed_size);
}
- (void) recv_read(hdl, fd, buf,
- drr->drr_u.drr_spill.drr_length, B_FALSE, NULL);
+
+ payload_size =
+ DRR_SPILL_PAYLOAD_SIZE(&drr->drr_u.drr_spill);
+ (void) recv_read(hdl, fd, buf, payload_size,
+ B_FALSE, NULL);
break;
case DRR_WRITE_EMBEDDED:
if (byteswap) {
}
if (flags->dryrun) {
+ void *buf = zfs_alloc(hdl, SPA_MAXBLOCKSIZE);
+
+ /*
+ * We have read the DRR_BEGIN record, but we have
+ * not yet read the payload. For non-dryrun sends
+ * this will be done by the kernel, so we must
+ * emulate that here, before attempting to read
+ * more records.
+ */
+ err = recv_read(hdl, infd, buf, drr->drr_payloadlen,
+ flags->byteswap, NULL);
+ free(buf);
+ if (err != 0)
+ goto out;
+
err = recv_skip(hdl, infd, flags->byteswap);
goto out;
}