Add bookmark v2 on-disk feature
This patch adds the bookmark v2 feature to the on-disk format. This feature will be needed for the upcoming redacted sends and for an upcoming fix that for raw receives. The feature is not currently used by any code and thus this change is a no-op, aside from the fact that the user can now enable the feature. Reviewed-by: Paul Dagnelie <pcd@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Matt Ahrens <mahrens@delphix.com> Signed-off-by: Tom Caputi <tcaputi@datto.com> Issue #8308
This commit is contained in:
parent
369aa501d1
commit
579ce7c5ae
|
@ -36,8 +36,25 @@ typedef struct zfs_bookmark_phys {
|
||||||
uint64_t zbm_guid; /* guid of bookmarked dataset */
|
uint64_t zbm_guid; /* guid of bookmarked dataset */
|
||||||
uint64_t zbm_creation_txg; /* birth transaction group */
|
uint64_t zbm_creation_txg; /* birth transaction group */
|
||||||
uint64_t zbm_creation_time; /* bookmark creation time */
|
uint64_t zbm_creation_time; /* bookmark creation time */
|
||||||
|
|
||||||
|
/* the following fields are reserved for redacted send / recv */
|
||||||
|
uint64_t zbm_redaction_obj; /* redaction list object */
|
||||||
|
uint64_t zbm_flags; /* ZBM_FLAG_* */
|
||||||
|
uint64_t zbm_referenced_bytes_refd;
|
||||||
|
uint64_t zbm_compressed_bytes_refd;
|
||||||
|
uint64_t zbm_uncompressed_bytes_refd;
|
||||||
|
uint64_t zbm_referenced_freed_before_next_snap;
|
||||||
|
uint64_t zbm_compressed_freed_before_next_snap;
|
||||||
|
uint64_t zbm_uncompressed_freed_before_next_snap;
|
||||||
|
|
||||||
|
/* fields used for raw sends */
|
||||||
|
uint64_t zbm_ivset_guid;
|
||||||
} zfs_bookmark_phys_t;
|
} zfs_bookmark_phys_t;
|
||||||
|
|
||||||
|
|
||||||
|
#define BOOKMARK_PHYS_SIZE_V1 (3 * sizeof (uint64_t))
|
||||||
|
#define BOOKMARK_PHYS_SIZE_V2 (12 * sizeof (uint64_t))
|
||||||
|
|
||||||
int dsl_bookmark_create(nvlist_t *, nvlist_t *);
|
int dsl_bookmark_create(nvlist_t *, nvlist_t *);
|
||||||
int dsl_get_bookmarks(const char *, nvlist_t *, nvlist_t *);
|
int dsl_get_bookmarks(const char *, nvlist_t *, nvlist_t *);
|
||||||
int dsl_get_bookmarks_impl(dsl_dataset_t *, nvlist_t *, nvlist_t *);
|
int dsl_get_bookmarks_impl(dsl_dataset_t *, nvlist_t *, nvlist_t *);
|
||||||
|
|
|
@ -66,6 +66,7 @@ typedef enum spa_feature {
|
||||||
SPA_FEATURE_SPACEMAP_V2,
|
SPA_FEATURE_SPACEMAP_V2,
|
||||||
SPA_FEATURE_ALLOCATION_CLASSES,
|
SPA_FEATURE_ALLOCATION_CLASSES,
|
||||||
SPA_FEATURE_RESILVER_DEFER,
|
SPA_FEATURE_RESILVER_DEFER,
|
||||||
|
SPA_FEATURE_BOOKMARK_V2,
|
||||||
SPA_FEATURES
|
SPA_FEATURES
|
||||||
} spa_feature_t;
|
} spa_feature_t;
|
||||||
|
|
||||||
|
|
|
@ -702,6 +702,27 @@ files.
|
||||||
|
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
|
.sp
|
||||||
|
.ne 2
|
||||||
|
.na
|
||||||
|
\fB\fBbookmark_v2\fR\fR
|
||||||
|
.ad
|
||||||
|
.RS 4n
|
||||||
|
.TS
|
||||||
|
l l .
|
||||||
|
GUID com.datto:bookmark_v2
|
||||||
|
READ\-ONLY COMPATIBLE no
|
||||||
|
DEPENDENCIES extensible_dataset
|
||||||
|
.TE
|
||||||
|
|
||||||
|
This feature enables the creation and management of larger bookmarks which are
|
||||||
|
needed for other features in ZFS.
|
||||||
|
|
||||||
|
This feature becomes \fBactive\fR when a v2 bookmark is created and will be
|
||||||
|
returned to the \fBenabled\fR state when all v2 bookmarks are destroyed.
|
||||||
|
|
||||||
|
.RE
|
||||||
|
|
||||||
.sp
|
.sp
|
||||||
.ne 2
|
.ne 2
|
||||||
.na
|
.na
|
||||||
|
|
|
@ -439,6 +439,17 @@ zpool_feature_init(void)
|
||||||
ZFEATURE_TYPE_BOOLEAN, userobj_accounting_deps);
|
ZFEATURE_TYPE_BOOLEAN, userobj_accounting_deps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
static const spa_feature_t bookmark_v2_deps[] = {
|
||||||
|
SPA_FEATURE_EXTENSIBLE_DATASET,
|
||||||
|
SPA_FEATURE_NONE
|
||||||
|
};
|
||||||
|
zfeature_register(SPA_FEATURE_BOOKMARK_V2,
|
||||||
|
"com.datto:bookmark_v2", "bookmark_v2",
|
||||||
|
"Support for larger bookmarks",
|
||||||
|
0, ZFEATURE_TYPE_BOOLEAN, bookmark_v2_deps);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
static const spa_feature_t encryption_deps[] = {
|
static const spa_feature_t encryption_deps[] = {
|
||||||
SPA_FEATURE_EXTENSIBLE_DATASET,
|
SPA_FEATURE_EXTENSIBLE_DATASET,
|
||||||
|
|
|
@ -70,6 +70,12 @@ dsl_dataset_bmark_lookup(dsl_dataset_t *ds, const char *shortname,
|
||||||
if (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_CI_DATASET)
|
if (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_CI_DATASET)
|
||||||
mt = MT_NORMALIZE;
|
mt = MT_NORMALIZE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Zero out the bookmark in case the one stored on disk
|
||||||
|
* is in an older, shorter format.
|
||||||
|
*/
|
||||||
|
bzero(bmark_phys, sizeof (*bmark_phys));
|
||||||
|
|
||||||
err = zap_lookup_norm(mos, bmark_zapobj, shortname, sizeof (uint64_t),
|
err = zap_lookup_norm(mos, bmark_zapobj, shortname, sizeof (uint64_t),
|
||||||
sizeof (*bmark_phys) / sizeof (uint64_t), bmark_phys, mt,
|
sizeof (*bmark_phys) / sizeof (uint64_t), bmark_phys, mt,
|
||||||
NULL, 0, NULL);
|
NULL, 0, NULL);
|
||||||
|
@ -188,8 +194,9 @@ dsl_bookmark_create_sync(void *arg, dmu_tx_t *tx)
|
||||||
for (nvpair_t *pair = nvlist_next_nvpair(dbca->dbca_bmarks, NULL);
|
for (nvpair_t *pair = nvlist_next_nvpair(dbca->dbca_bmarks, NULL);
|
||||||
pair != NULL; pair = nvlist_next_nvpair(dbca->dbca_bmarks, pair)) {
|
pair != NULL; pair = nvlist_next_nvpair(dbca->dbca_bmarks, pair)) {
|
||||||
dsl_dataset_t *snapds, *bmark_fs;
|
dsl_dataset_t *snapds, *bmark_fs;
|
||||||
zfs_bookmark_phys_t bmark_phys;
|
zfs_bookmark_phys_t bmark_phys = { 0 };
|
||||||
char *shortname;
|
char *shortname;
|
||||||
|
uint32_t bmark_len = BOOKMARK_PHYS_SIZE_V1;
|
||||||
|
|
||||||
VERIFY0(dsl_dataset_hold(dp, fnvpair_value_string(pair),
|
VERIFY0(dsl_dataset_hold(dp, fnvpair_value_string(pair),
|
||||||
FTAG, &snapds));
|
FTAG, &snapds));
|
||||||
|
@ -216,8 +223,7 @@ dsl_bookmark_create_sync(void *arg, dmu_tx_t *tx)
|
||||||
|
|
||||||
VERIFY0(zap_add(mos, bmark_fs->ds_bookmarks,
|
VERIFY0(zap_add(mos, bmark_fs->ds_bookmarks,
|
||||||
shortname, sizeof (uint64_t),
|
shortname, sizeof (uint64_t),
|
||||||
sizeof (zfs_bookmark_phys_t) / sizeof (uint64_t),
|
bmark_len / sizeof (uint64_t), &bmark_phys, tx));
|
||||||
&bmark_phys, tx));
|
|
||||||
|
|
||||||
spa_history_log_internal_ds(bmark_fs, "bookmark", tx,
|
spa_history_log_internal_ds(bmark_fs, "bookmark", tx,
|
||||||
"name=%s creation_txg=%llu target_snap=%llu",
|
"name=%s creation_txg=%llu target_snap=%llu",
|
||||||
|
|
Loading…
Reference in New Issue