Print this page
3743 zfs needs a refcount audit
Submitted by:   Will Andrews <willa@spectralogic.com>
Submitted by:   Justin Gibbs <justing@spectralogic.com>
Reviewed by:    Matthew Ahrens <mahrens@delphix.com>
Reviewed by:    Eric Schrock <eric.schrock@delphix.com>
Reviewed by:    George Wilson <george.wilson@delphix.com>

*** 293,302 **** --- 293,303 ---- blk = (idx*2) >> (bs-3); err = dmu_buf_hold(zap->zap_objset, zap->zap_object, (tbl->zt_nextblk + blk) << bs, FTAG, &db, DMU_READ_NO_PREFETCH); + if (err == 0) dmu_buf_rele(db, FTAG); } return (err); }
*** 990,1061 **** { zap_cursor_t zc; zap_attribute_t za; int err; for (zap_cursor_init(&zc, os, fromobj); zap_cursor_retrieve(&zc, &za) == 0; (void) zap_cursor_advance(&zc)) { ! if (za.za_integer_length != 8 || za.za_num_integers != 1) ! return (SET_ERROR(EINVAL)); err = zap_add(os, intoobj, za.za_name, 8, 1, &za.za_first_integer, tx); if (err) ! return (err); } zap_cursor_fini(&zc); ! return (0); } int zap_join_key(objset_t *os, uint64_t fromobj, uint64_t intoobj, uint64_t value, dmu_tx_t *tx) { zap_cursor_t zc; zap_attribute_t za; int err; for (zap_cursor_init(&zc, os, fromobj); zap_cursor_retrieve(&zc, &za) == 0; (void) zap_cursor_advance(&zc)) { ! if (za.za_integer_length != 8 || za.za_num_integers != 1) ! return (SET_ERROR(EINVAL)); err = zap_add(os, intoobj, za.za_name, 8, 1, &value, tx); if (err) ! return (err); } zap_cursor_fini(&zc); ! return (0); } int zap_join_increment(objset_t *os, uint64_t fromobj, uint64_t intoobj, dmu_tx_t *tx) { zap_cursor_t zc; zap_attribute_t za; int err; for (zap_cursor_init(&zc, os, fromobj); zap_cursor_retrieve(&zc, &za) == 0; (void) zap_cursor_advance(&zc)) { uint64_t delta = 0; ! if (za.za_integer_length != 8 || za.za_num_integers != 1) ! return (SET_ERROR(EINVAL)); err = zap_lookup(os, intoobj, za.za_name, 8, 1, &delta); if (err != 0 && err != ENOENT) ! return (err); delta += za.za_first_integer; err = zap_update(os, intoobj, za.za_name, 8, 1, &delta, tx); if (err) ! return (err); } zap_cursor_fini(&zc); ! return (0); } int zap_add_int(objset_t *os, uint64_t obj, uint64_t value, dmu_tx_t *tx) { --- 991,1071 ---- { zap_cursor_t zc; zap_attribute_t za; int err; + err = 0; for (zap_cursor_init(&zc, os, fromobj); zap_cursor_retrieve(&zc, &za) == 0; (void) zap_cursor_advance(&zc)) { ! if (za.za_integer_length != 8 || za.za_num_integers != 1) { ! err = SET_ERROR(EINVAL); ! break; ! } err = zap_add(os, intoobj, za.za_name, 8, 1, &za.za_first_integer, tx); if (err) ! break; } zap_cursor_fini(&zc); ! return (err); } int zap_join_key(objset_t *os, uint64_t fromobj, uint64_t intoobj, uint64_t value, dmu_tx_t *tx) { zap_cursor_t zc; zap_attribute_t za; int err; + err = 0; for (zap_cursor_init(&zc, os, fromobj); zap_cursor_retrieve(&zc, &za) == 0; (void) zap_cursor_advance(&zc)) { ! if (za.za_integer_length != 8 || za.za_num_integers != 1) { ! err = SET_ERROR(EINVAL); ! break; ! } err = zap_add(os, intoobj, za.za_name, 8, 1, &value, tx); if (err) ! break; } zap_cursor_fini(&zc); ! return (err); } int zap_join_increment(objset_t *os, uint64_t fromobj, uint64_t intoobj, dmu_tx_t *tx) { zap_cursor_t zc; zap_attribute_t za; int err; + err = 0; for (zap_cursor_init(&zc, os, fromobj); zap_cursor_retrieve(&zc, &za) == 0; (void) zap_cursor_advance(&zc)) { uint64_t delta = 0; ! if (za.za_integer_length != 8 || za.za_num_integers != 1) { ! err = SET_ERROR(EINVAL); ! break; ! } err = zap_lookup(os, intoobj, za.za_name, 8, 1, &delta); if (err != 0 && err != ENOENT) ! break; delta += za.za_first_integer; err = zap_update(os, intoobj, za.za_name, 8, 1, &delta, tx); if (err) ! break; } zap_cursor_fini(&zc); ! return (err); } int zap_add_int(objset_t *os, uint64_t obj, uint64_t value, dmu_tx_t *tx) {