- ba.drr = drr;
- ba.vp = vp;
- ba.os = tosnap;
- ba.off = off;
- ba.toguid = ds->ds_phys->ds_guid;
- ZIO_SET_CHECKSUM(&ba.zc, 0, 0, 0, 0);
- ba.pending_op = PENDING_NONE;
-
- if (dump_bytes(&ba, drr, sizeof (dmu_replay_record_t)) != 0) {
- kmem_free(drr, sizeof (dmu_replay_record_t));
- return (ba.err);
+ dsp = kmem_zalloc(sizeof (dmu_sendarg_t), KM_SLEEP);
+
+ dsp->dsa_drr = drr;
+ dsp->dsa_vp = vp;
+ dsp->dsa_outfd = outfd;
+ dsp->dsa_proc = curproc;
+ dsp->dsa_os = tosnap;
+ dsp->dsa_off = off;
+ dsp->dsa_toguid = ds->ds_phys->ds_guid;
+ ZIO_SET_CHECKSUM(&dsp->dsa_zc, 0, 0, 0, 0);
+ dsp->dsa_pending_op = PENDING_NONE;
+
+ mutex_enter(&ds->ds_sendstream_lock);
+ list_insert_head(&ds->ds_sendstreams, dsp);
+ mutex_exit(&ds->ds_sendstream_lock);
+
+ if (dump_bytes(dsp, drr, sizeof (dmu_replay_record_t)) != 0) {
+ err = dsp->dsa_err;
+ goto out;