mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Implement bookmark copying
This feature allows copying existing bookmarks using
zfs bookmark fs#target fs#newbookmark
There are some niche use cases for such functionality,
e.g. when using bookmarks as markers for replication progress.
Copying redaction bookmarks produces a normal bookmark that
cannot be used for redacted send (we are not duplicating
the redaction object).
ZCP support for bookmarking (both creation and copying) will be
implemented in a separate patch based on this work.
Overview:
- Terminology:
- source = existing snapshot or bookmark
- new/bmark = new bookmark
- Implement bookmark copying in `dsl_bookmark.c`
- create new bookmark node
- copy source's `zbn_phys` to new's `zbn_phys`
- zero-out redaction object id in copy
- Extend existing bookmark ioctl nvlist schema to accept
bookmarks as sources
- => `dsl_bookmark_create_nvl_validate` is authoritative
- use `dsl_dataset_is_before` check for both snapshot
and bookmark sources
- Adjust CLI
- refactor shortname expansion logic in `zfs_do_bookmark`
- Update man pages
- warn about redaction bookmark handling
- Add test cases
- CLI
- pyyzfs libzfs_core bindings
Reviewed-by: Matt Ahrens <matt@delphix.com>
Reviewed-by: Paul Dagnelie <pcd@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Christian Schwarz <me@cschwarz.com>
Closes #9571
This commit is contained in:
committed by
Brian Behlendorf
parent
7b49bbc816
commit
a73f361fdb
@@ -103,6 +103,7 @@ typedef struct redact_block_phys {
|
||||
typedef int (*rl_traverse_callback_t)(redact_block_phys_t *, void *);
|
||||
|
||||
int dsl_bookmark_create(nvlist_t *, nvlist_t *);
|
||||
int dsl_bookmark_create_nvl_validate(nvlist_t *);
|
||||
int dsl_bookmark_create_redacted(const char *, const char *, uint64_t,
|
||||
uint64_t *, void *, redaction_list_t **);
|
||||
int dsl_get_bookmarks(const char *, nvlist_t *, nvlist_t *);
|
||||
|
||||
@@ -1310,6 +1310,8 @@ typedef enum zfs_ioc {
|
||||
* not described precisely by generic errno codes.
|
||||
*
|
||||
* These numbers should not change over time. New entries should be appended.
|
||||
*
|
||||
* (Keep in sync with contrib/pyzfs/libzfs_core/_constants.py)
|
||||
*/
|
||||
typedef enum {
|
||||
ZFS_ERR_CHECKPOINT_EXISTS = 1024,
|
||||
@@ -1327,6 +1329,7 @@ typedef enum {
|
||||
ZFS_ERR_SPILL_BLOCK_FLAG_MISSING,
|
||||
ZFS_ERR_UNKNOWN_SEND_STREAM_FEATURE,
|
||||
ZFS_ERR_EXPORT_IN_PROGRESS,
|
||||
ZFS_ERR_BOOKMARK_SOURCE_NOT_ANCESTOR,
|
||||
} zfs_errno_t;
|
||||
|
||||
/*
|
||||
|
||||
@@ -46,6 +46,7 @@ typedef enum {
|
||||
NAME_ERR_SELF_REF, /* reserved self path name ('.') */
|
||||
NAME_ERR_PARENT_REF, /* reserved parent path name ('..') */
|
||||
NAME_ERR_NO_AT, /* permission set is missing '@' */
|
||||
NAME_ERR_NO_POUND, /* permission set is missing '#' */
|
||||
} namecheck_err_t;
|
||||
|
||||
#define ZFS_PERMSET_MAXLEN 64
|
||||
@@ -56,6 +57,8 @@ int get_dataset_depth(const char *);
|
||||
int pool_namecheck(const char *, namecheck_err_t *, char *);
|
||||
int entity_namecheck(const char *, namecheck_err_t *, char *);
|
||||
int dataset_namecheck(const char *, namecheck_err_t *, char *);
|
||||
int snapshot_namecheck(const char *, namecheck_err_t *, char *);
|
||||
int bookmark_namecheck(const char *, namecheck_err_t *, char *);
|
||||
int dataset_nestcheck(const char *);
|
||||
int mountpoint_namecheck(const char *, namecheck_err_t *);
|
||||
int zfs_component_namecheck(const char *, namecheck_err_t *, char *);
|
||||
|
||||
Reference in New Issue
Block a user