Skip to content

Commit

Permalink
zfs_log_write: simplify data copying code for WR_COPIED records
Browse files Browse the repository at this point in the history
lr_write_t records that are WR_COPIED have the record data directly
appended to them (see lr_write_t type definition).

The data is copied from the debuf using dmu_read_by_dnode.

This function was called, only for WR_COPIED records, as part of a
short-circuiting if-statement's if-expression.

I found this side-effectful call to dmu_read_by_dnode pretty
hard to spot.
This patch improves readability by moving the call to its own line.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Wilson <gwilson@delphix.com>
Signed-off-by: Christian Schwarz <me@cschwarz.com>
Closes #10956
  • Loading branch information
problame authored Sep 25, 2020
1 parent 7b8363d commit a5c77dc
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions module/zfs/zfs_log.c
Original file line number Diff line number Diff line change
Expand Up @@ -584,15 +584,22 @@ zfs_log_write(zilog_t *zilog, dmu_tx_t *tx, int txtype,
(wr_state == WR_COPIED ? len : 0));
lr = (lr_write_t *)&itx->itx_lr;

DB_DNODE_ENTER(db);
if (wr_state == WR_COPIED && dmu_read_by_dnode(DB_DNODE(db),
off, len, lr + 1, DMU_READ_NO_PREFETCH) != 0) {
zil_itx_destroy(itx);
itx = zil_itx_create(txtype, sizeof (*lr));
lr = (lr_write_t *)&itx->itx_lr;
wr_state = WR_NEED_COPY;
/*
* For WR_COPIED records, copy the data into the lr_write_t.
*/
if (wr_state == WR_COPIED) {
int err;
DB_DNODE_ENTER(db);
err = dmu_read_by_dnode(DB_DNODE(db), off, len, lr + 1,
DMU_READ_NO_PREFETCH);
if (err != 0) {
zil_itx_destroy(itx);
itx = zil_itx_create(txtype, sizeof (*lr));
lr = (lr_write_t *)&itx->itx_lr;
wr_state = WR_NEED_COPY;
}
DB_DNODE_EXIT(db);
}
DB_DNODE_EXIT(db);

itx->itx_wr_state = wr_state;
lr->lr_foid = zp->z_id;
Expand Down

0 comments on commit a5c77dc

Please sign in to comment.