svn commit: r252754 - stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Xin LI
delphij at FreeBSD.org
Fri Jul 5 03:38:07 UTC 2013
Author: delphij
Date: Fri Jul 5 03:38:06 2013
New Revision: 252754
URL: http://svnweb.freebsd.org/changeset/base/252754
Log:
MFC r251632: illumos #3743 zfs needs a refcount audit
Audit zap cursor usage and correct missing calls to zap_cursor_fini().
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c:
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c:
Correct early exit handling of several functions that
previously failed to close a cursor prior to returning.
Submitted by: gibbs
Audit holders of dmu_bufs and correct missing calls to dmu_buf_rele().
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c:
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c:
Correct early exit handling of several functions that
previously failed to release a dmu_buf prior to returning.
Submitted by: will
Reviewed by: Matthew Ahrens <mahrens at delphix.com>,
Eric Schrock <eric.schrock at delphix.com>,
George Wilson <george.wilson at delphix.com>,
Christopher Siden <christopher.siden at delphix.com>
Sponsored by: Spectra Logic
Modified:
stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c
stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/cddl/contrib/opensolaris/ (props changed)
Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Fri Jul 5 03:12:29 2013 (r252753)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Fri Jul 5 03:38:06 2013 (r252754)
@@ -361,8 +361,10 @@ dsl_dataset_hold_obj(dsl_pool_t *dp, uin
/* Make sure dsobj has the correct object type. */
dmu_object_info_from_db(dbuf, &doi);
- if (doi.doi_type != DMU_OT_DSL_DATASET)
+ if (doi.doi_type != DMU_OT_DSL_DATASET) {
+ dmu_buf_rele(dbuf, tag);
return (SET_ERROR(EINVAL));
+ }
ds = dmu_buf_get_user(dbuf);
if (ds == NULL) {
Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c Fri Jul 5 03:12:29 2013 (r252753)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c Fri Jul 5 03:38:06 2013 (r252754)
@@ -183,8 +183,10 @@ process_error_log(spa_t *spa, uint64_t o
if (copyout(&zb, (char *)addr +
(*count - 1) * sizeof (zbookmark_t),
- sizeof (zbookmark_t)) != 0)
+ sizeof (zbookmark_t)) != 0) {
+ zap_cursor_fini(&zc);
return (SET_ERROR(EFAULT));
+ }
*count -= 1;
}
Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c Fri Jul 5 03:12:29 2013 (r252753)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c Fri Jul 5 03:38:06 2013 (r252754)
@@ -295,7 +295,8 @@ zap_table_load(zap_t *zap, zap_table_phy
err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
(tbl->zt_nextblk + blk) << bs, FTAG, &db,
DMU_READ_NO_PREFETCH);
- dmu_buf_rele(db, FTAG);
+ if (err == 0)
+ dmu_buf_rele(db, FTAG);
}
return (err);
}
@@ -992,18 +993,21 @@ zap_join(objset_t *os, uint64_t fromobj,
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)
- return (SET_ERROR(EINVAL));
+ 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)
- return (err);
+ break;
}
zap_cursor_fini(&zc);
- return (0);
+ return (err);
}
int
@@ -1014,18 +1018,21 @@ zap_join_key(objset_t *os, uint64_t from
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)
- return (SET_ERROR(EINVAL));
+ 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)
- return (err);
+ break;
}
zap_cursor_fini(&zc);
- return (0);
+ return (err);
}
int
@@ -1036,24 +1043,27 @@ zap_join_increment(objset_t *os, uint64_
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)
- return (SET_ERROR(EINVAL));
+ 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)
- return (err);
+ break;
delta += za.za_first_integer;
err = zap_update(os, intoobj, za.za_name, 8, 1, &delta, tx);
if (err)
- return (err);
+ break;
}
zap_cursor_fini(&zc);
- return (0);
+ return (err);
}
int
More information about the svn-src-stable-9
mailing list