summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2013-06-12 07:07:06 +0000
committerdelphij <delphij@FreeBSD.org>2013-06-12 07:07:06 +0000
commitab3dbcb998b288fc8190c5c1f56d91720e535286 (patch)
tree82a807ab86be2fa57fe72fbd606665c2c02dd664 /sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c
parentcba1418efedac7ba586dbc2591b16cb3cb7e9c66 (diff)
downloadFreeBSD-src-ab3dbcb998b288fc8190c5c1f56d91720e535286.zip
FreeBSD-src-ab3dbcb998b288fc8190c5c1f56d91720e535286.tar.gz
MFV r251644:
Poor ZFS send / receive performance due to snapshot hold / release processing (by smh@) Illumos ZFS issues: 3740 Poor ZFS send / receive performance due to snapshot hold / release processing MFC after: 2 weeks
Diffstat (limited to 'sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c
index cc2631e..d7949e8 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c
@@ -21,6 +21,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright (c) 2013 Steven Hartland. All rights reserved.
*/
#include <sys/dsl_pool.h>
@@ -856,23 +857,34 @@ dsl_pool_clean_tmp_userrefs(dsl_pool_t *dp)
zap_cursor_t zc;
objset_t *mos = dp->dp_meta_objset;
uint64_t zapobj = dp->dp_tmp_userrefs_obj;
+ nvlist_t *holds;
if (zapobj == 0)
return;
ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS);
+ holds = fnvlist_alloc();
+
for (zap_cursor_init(&zc, mos, zapobj);
zap_cursor_retrieve(&zc, &za) == 0;
zap_cursor_advance(&zc)) {
char *htag;
- uint64_t dsobj;
+ nvlist_t *tags;
htag = strchr(za.za_name, '-');
*htag = '\0';
++htag;
- dsobj = strtonum(za.za_name, NULL);
- dsl_dataset_user_release_tmp(dp, dsobj, htag);
+ if (nvlist_lookup_nvlist(holds, za.za_name, &tags) != 0) {
+ tags = fnvlist_alloc();
+ fnvlist_add_boolean(tags, htag);
+ fnvlist_add_nvlist(holds, za.za_name, tags);
+ fnvlist_free(tags);
+ } else {
+ fnvlist_add_boolean(tags, htag);
+ }
}
+ dsl_dataset_user_release_tmp(dp, holds);
+ fnvlist_free(holds);
zap_cursor_fini(&zc);
}
OpenPOWER on IntegriCloud