mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 03:08:51 +03:00
OpenZFS 7054 - dmu_tx_hold_t should use refcount_t to track space
Authored by: Igor Kozhukhov ikozhukhov@gmail.com Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Paul Dagnelie <pcd@delphix.com> Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com> Approved by: Dan McDonald <danmcd@omniti.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Ported-by: George Melikov mail@gmelikov.ru OpenZFS-issue: https://www.illumos.org/issues/7054 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/0c779ad Closes #5600
This commit is contained in:
committed by
Brian Behlendorf
parent
4ea3f86426
commit
f85c06bedf
+16
-10
@@ -1358,8 +1358,8 @@ fzap_get_stats(zap_t *zap, zap_stats_t *zs)
|
||||
}
|
||||
|
||||
int
|
||||
fzap_count_write(zap_name_t *zn, int add, uint64_t *towrite,
|
||||
uint64_t *tooverwrite)
|
||||
fzap_count_write(zap_name_t *zn, int add, refcount_t *towrite,
|
||||
refcount_t *tooverwrite)
|
||||
{
|
||||
zap_t *zap = zn->zn_zap;
|
||||
zap_leaf_t *l;
|
||||
@@ -1369,9 +1369,11 @@ fzap_count_write(zap_name_t *zn, int add, uint64_t *towrite,
|
||||
* Account for the header block of the fatzap.
|
||||
*/
|
||||
if (!add && dmu_buf_freeable(zap->zap_dbuf)) {
|
||||
*tooverwrite += zap->zap_dbuf->db_size;
|
||||
(void) refcount_add_many(tooverwrite,
|
||||
zap->zap_dbuf->db_size, FTAG);
|
||||
} else {
|
||||
*towrite += zap->zap_dbuf->db_size;
|
||||
(void) refcount_add_many(towrite,
|
||||
zap->zap_dbuf->db_size, FTAG);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1383,10 +1385,13 @@ fzap_count_write(zap_name_t *zn, int add, uint64_t *towrite,
|
||||
* could extend the table.
|
||||
*/
|
||||
if (add) {
|
||||
if (zap_f_phys(zap)->zap_ptrtbl.zt_blk == 0)
|
||||
*towrite += zap->zap_dbuf->db_size;
|
||||
else
|
||||
*towrite += (zap->zap_dbuf->db_size * 3);
|
||||
if (zap_f_phys(zap)->zap_ptrtbl.zt_blk == 0) {
|
||||
(void) refcount_add_many(towrite,
|
||||
zap->zap_dbuf->db_size, FTAG);
|
||||
} else {
|
||||
(void) refcount_add_many(towrite,
|
||||
zap->zap_dbuf->db_size * 3, FTAG);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1399,13 +1404,14 @@ fzap_count_write(zap_name_t *zn, int add, uint64_t *towrite,
|
||||
}
|
||||
|
||||
if (!add && dmu_buf_freeable(l->l_dbuf)) {
|
||||
*tooverwrite += l->l_dbuf->db_size;
|
||||
(void) refcount_add_many(tooverwrite, l->l_dbuf->db_size, FTAG);
|
||||
} else {
|
||||
/*
|
||||
* If this an add operation, the leaf block could split.
|
||||
* Hence, we need to account for an additional leaf block.
|
||||
*/
|
||||
*towrite += (add ? 2 : 1) * l->l_dbuf->db_size;
|
||||
(void) refcount_add_many(towrite,
|
||||
(add ? 2 : 1) * l->l_dbuf->db_size, FTAG);
|
||||
}
|
||||
|
||||
zap_put_leaf(l);
|
||||
|
||||
Reference in New Issue
Block a user