mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-27 04:32:16 +03:00
ZAP: Massively switch to _by_dnode() interfaces
Before this change ZAP called dnode_hold() for almost every block access, that was clearly visible in profiler under heavy load, such as BRT. This patch makes it always hold the dnode reference between zap_lockdir() and zap_unlockdir(). It allows to avoid most of dnode operations between those. It also adds several new _by_dnode() APIs to ZAP and uses them in BRT code. Also adds dmu_prefetch_by_dnode() variant and uses it in the ZAP code. After this there remains only one call to dmu_buf_dnode_enter(), which seems to be unneeded. So remove the call and the functions. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #15951
This commit is contained in:
@@ -2353,7 +2353,6 @@ receive_process_write_record(struct receive_writer_arg *rwa,
|
||||
if (rwa->heal) {
|
||||
blkptr_t *bp;
|
||||
dmu_buf_t *dbp;
|
||||
dnode_t *dn;
|
||||
int flags = DB_RF_CANFAIL;
|
||||
|
||||
if (rwa->raw)
|
||||
@@ -2385,19 +2384,15 @@ receive_process_write_record(struct receive_writer_arg *rwa,
|
||||
dmu_buf_rele(dbp, FTAG);
|
||||
return (err);
|
||||
}
|
||||
dn = dmu_buf_dnode_enter(dbp);
|
||||
/* Make sure the on-disk block and recv record sizes match */
|
||||
if (drrw->drr_logical_size !=
|
||||
dn->dn_datablkszsec << SPA_MINBLOCKSHIFT) {
|
||||
if (drrw->drr_logical_size != dbp->db_size) {
|
||||
err = ENOTSUP;
|
||||
dmu_buf_dnode_exit(dbp);
|
||||
dmu_buf_rele(dbp, FTAG);
|
||||
return (err);
|
||||
}
|
||||
/* Get the block pointer for the corrupted block */
|
||||
bp = dmu_buf_get_blkptr(dbp);
|
||||
err = do_corrective_recv(rwa, drrw, rrd, bp);
|
||||
dmu_buf_dnode_exit(dbp);
|
||||
dmu_buf_rele(dbp, FTAG);
|
||||
return (err);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user