Skip to content

Commit

Permalink
zvol: sync with upstream block cloning commit
Browse files Browse the repository at this point in the history
Signed-off-by: Ameer Hamza <ahamza@ixsystems.com>
  • Loading branch information
ixhamza committed Jan 8, 2025
1 parent 83e855f commit 7a354f3
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 49 deletions.
2 changes: 0 additions & 2 deletions include/sys/zvol.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@ extern int zvol_set_ro(const char *, boolean_t);
extern zvol_state_handle_t *zvol_suspend(const char *);
extern int zvol_resume(zvol_state_handle_t *);
extern void *zvol_tag(zvol_state_handle_t *);
extern int zvol_clone_range(zvol_state_handle_t *, uint64_t,
zvol_state_handle_t *, uint64_t, uint64_t);

extern int zvol_init(void);
extern void zvol_fini(void);
Expand Down
8 changes: 5 additions & 3 deletions include/sys/zvol_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,14 +83,16 @@ void zvol_log_truncate(zvol_state_t *zv, dmu_tx_t *tx, uint64_t off,
uint64_t len);
void zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, uint64_t offset,
uint64_t size, boolean_t commit);
void zvol_log_clone_range(zilog_t *zilog, dmu_tx_t *tx, int txtype,
uint64_t off, uint64_t len, uint64_t blksz, const blkptr_t *bps,
size_t nbps);
int zvol_get_data(void *arg, uint64_t arg2, lr_write_t *lr, char *buf,
struct lwb *lwb, zio_t *zio);
int zvol_init_impl(void);
void zvol_fini_impl(void);
void zvol_wait_close(zvol_state_t *zv);
int zvol_clone_range(zvol_state_handle_t *, uint64_t,
zvol_state_handle_t *, uint64_t, uint64_t);
void zvol_log_clone_range(zilog_t *zilog, dmu_tx_t *tx, int txtype,
uint64_t off, uint64_t len, uint64_t blksz, const blkptr_t *bps,
size_t nbps);

/*
* platform dependent functions exported to platform independent code
Expand Down
88 changes: 44 additions & 44 deletions module/zfs/zvol.c
Original file line number Diff line number Diff line change
Expand Up @@ -752,6 +752,50 @@ zvol_clone_range(zvol_state_t *zv_src, uint64_t inoff, zvol_state_t *zv_dst,
return (SET_ERROR(error));
}

/*
* Handles TX_CLONE_RANGE transactions.
*/
void
zvol_log_clone_range(zilog_t *zilog, dmu_tx_t *tx, int txtype, uint64_t off,
uint64_t len, uint64_t blksz, const blkptr_t *bps, size_t nbps)
{
itx_t *itx;
lr_clone_range_t *lr;
uint64_t partlen, max_log_data;
size_t partnbps;

if (zil_replaying(zilog, tx))
return;

max_log_data = zil_max_log_data(zilog, sizeof (lr_clone_range_t));

while (nbps > 0) {
partnbps = MIN(nbps, max_log_data / sizeof (bps[0]));
partlen = partnbps * blksz;
ASSERT3U(partlen, <, len + blksz);
partlen = MIN(partlen, len);

itx = zil_itx_create(txtype,
sizeof (*lr) + sizeof (bps[0]) * partnbps);
lr = (lr_clone_range_t *)&itx->itx_lr;
lr->lr_foid = ZVOL_OBJ;
lr->lr_offset = off;
lr->lr_length = partlen;
lr->lr_blksz = blksz;
lr->lr_nbps = partnbps;
memcpy(lr->lr_bps, bps, sizeof (bps[0]) * partnbps);

zil_itx_assign(zilog, itx, tx);

bps += partnbps;
ASSERT3U(nbps, >=, partnbps);
nbps -= partnbps;
off += partlen;
ASSERT3U(len, >=, partlen);
len -= partlen;
}
}

static int
zvol_replay_err(void *arg1, void *arg2, boolean_t byteswap)
{
Expand Down Expand Up @@ -863,50 +907,6 @@ zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, uint64_t offset,
}
}

/*
* Handles TX_CLONE_RANGE transactions.
*/
void
zvol_log_clone_range(zilog_t *zilog, dmu_tx_t *tx, int txtype, uint64_t off,
uint64_t len, uint64_t blksz, const blkptr_t *bps, size_t nbps)
{
itx_t *itx;
lr_clone_range_t *lr;
uint64_t partlen, max_log_data;
size_t partnbps;

if (zil_replaying(zilog, tx))
return;

max_log_data = zil_max_log_data(zilog, sizeof (lr_clone_range_t));

while (nbps > 0) {
partnbps = MIN(nbps, max_log_data / sizeof (bps[0]));
partlen = partnbps * blksz;
ASSERT3U(partlen, <, len + blksz);
partlen = MIN(partlen, len);

itx = zil_itx_create(txtype,
sizeof (*lr) + sizeof (bps[0]) * partnbps);
lr = (lr_clone_range_t *)&itx->itx_lr;
lr->lr_foid = ZVOL_OBJ;
lr->lr_offset = off;
lr->lr_length = partlen;
lr->lr_blksz = blksz;
lr->lr_nbps = partnbps;
memcpy(lr->lr_bps, bps, sizeof (bps[0]) * partnbps);

zil_itx_assign(zilog, itx, tx);

bps += partnbps;
ASSERT3U(nbps, >=, partnbps);
nbps -= partnbps;
off += partlen;
ASSERT3U(len, >=, partlen);
len -= partlen;
}
}

/*
* Log a DKIOCFREE/free-long-range to the ZIL with TX_TRUNCATE.
*/
Expand Down

0 comments on commit 7a354f3

Please sign in to comment.