aboutsummaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorJerry Jelinek <[email protected]>2015-01-28 15:21:33 -0800
committerBrian Behlendorf <[email protected]>2015-05-04 09:41:09 -0700
commita0c9a17aefb6959a50a5c3572544b955dcf715a9 (patch)
tree5c6905b32516be0744be66a2d683e896a89da8f2 /module
parent83017311e4a64bc49d43d1f8c93fc0e2263bb41b (diff)
Illumos 4901 - zfs filesystem/snapshot limit leaks
4901 zfs filesystem/snapshot limit leaks Reviewed by: Matthew Ahrens <[email protected]> Approved by: Dan McDonald <[email protected]> References: https://www.illumos.org/issues/4901 https://github.com/illumos/illumos-gate/commit/adf3407 Ported by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'module')
-rw-r--r--module/zfs/dsl_dir.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/module/zfs/dsl_dir.c b/module/zfs/dsl_dir.c
index e85cb81ae..186b33203 100644
--- a/module/zfs/dsl_dir.c
+++ b/module/zfs/dsl_dir.c
@@ -512,7 +512,7 @@ dsl_dir_init_fs_ss_count(dsl_dir_t *dd, dmu_tx_t *tx)
zap_attribute_t *za;
dsl_dataset_t *ds;
- ASSERT(spa_feature_is_enabled(dp->dp_spa, SPA_FEATURE_FS_SS_LIMIT));
+ ASSERT(spa_feature_is_active(dp->dp_spa, SPA_FEATURE_FS_SS_LIMIT));
ASSERT(dsl_pool_config_held(dp));
ASSERT(dmu_tx_is_syncing(tx));
@@ -1751,7 +1751,7 @@ dsl_dir_rename_check(void *arg, dmu_tx_t *tx)
}
if (dmu_tx_is_syncing(tx)) {
- if (spa_feature_is_enabled(dp->dp_spa,
+ if (spa_feature_is_active(dp->dp_spa,
SPA_FEATURE_FS_SS_LIMIT)) {
/*
* Although this is the check function and we don't
@@ -1780,8 +1780,11 @@ dsl_dir_rename_check(void *arg, dmu_tx_t *tx)
err = zap_lookup(os, dd->dd_object,
DD_FIELD_FILESYSTEM_COUNT, sizeof (fs_cnt), 1,
&fs_cnt);
- if (err != ENOENT && err != 0)
+ if (err != ENOENT && err != 0) {
+ dsl_dir_rele(newparent, FTAG);
+ dsl_dir_rele(dd, FTAG);
return (err);
+ }
/*
* have to add 1 for the filesystem itself that we're
@@ -1792,8 +1795,11 @@ dsl_dir_rename_check(void *arg, dmu_tx_t *tx)
err = zap_lookup(os, dd->dd_object,
DD_FIELD_SNAPSHOT_COUNT, sizeof (ss_cnt), 1,
&ss_cnt);
- if (err != ENOENT && err != 0)
+ if (err != ENOENT && err != 0) {
+ dsl_dir_rele(newparent, FTAG);
+ dsl_dir_rele(dd, FTAG);
return (err);
+ }
}
/* no rename into our descendant */
@@ -1844,7 +1850,7 @@ dsl_dir_rename_sync(void *arg, dmu_tx_t *tx)
* We already made sure the dd counts were initialized in the
* check function.
*/
- if (spa_feature_is_enabled(dp->dp_spa,
+ if (spa_feature_is_active(dp->dp_spa,
SPA_FEATURE_FS_SS_LIMIT)) {
VERIFY0(zap_lookup(os, dd->dd_object,
DD_FIELD_FILESYSTEM_COUNT, sizeof (fs_cnt), 1,