Adds the `-p` option to `zfs holds`
This allows for printing a machine-readable, accurate to the second, hold creation time in the form of a unix epoch timestamp. Additionally, updates relevant documentation and man pages accordingly. Reviewed-by: Allan Jude <allan@klarasystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Mohamed Tawfik <m_tawfik@aucegypt.edu> Closes #13690 Closes #14152
This commit is contained in:
parent
ecbf02791f
commit
41715771b5
|
@ -392,7 +392,7 @@ get_usage(zfs_help_t idx)
|
||||||
case HELP_HOLD:
|
case HELP_HOLD:
|
||||||
return (gettext("\thold [-r] <tag> <snapshot> ...\n"));
|
return (gettext("\thold [-r] <tag> <snapshot> ...\n"));
|
||||||
case HELP_HOLDS:
|
case HELP_HOLDS:
|
||||||
return (gettext("\tholds [-rH] <snapshot> ...\n"));
|
return (gettext("\tholds [-rHp] <snapshot> ...\n"));
|
||||||
case HELP_RELEASE:
|
case HELP_RELEASE:
|
||||||
return (gettext("\trelease [-r] <tag> <snapshot> ...\n"));
|
return (gettext("\trelease [-r] <tag> <snapshot> ...\n"));
|
||||||
case HELP_DIFF:
|
case HELP_DIFF:
|
||||||
|
@ -6456,7 +6456,8 @@ typedef struct holds_cbdata {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
print_holds(boolean_t scripted, int nwidth, int tagwidth, nvlist_t *nvl)
|
print_holds(boolean_t scripted, int nwidth, int tagwidth, nvlist_t *nvl,
|
||||||
|
boolean_t parsable)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
nvpair_t *nvp = NULL;
|
nvpair_t *nvp = NULL;
|
||||||
|
@ -6493,11 +6494,23 @@ print_holds(boolean_t scripted, int nwidth, int tagwidth, nvlist_t *nvl)
|
||||||
gettext(STRFTIME_FMT_STR), &t);
|
gettext(STRFTIME_FMT_STR), &t);
|
||||||
|
|
||||||
if (scripted) {
|
if (scripted) {
|
||||||
|
if (parsable) {
|
||||||
|
(void) printf("%s\t%s\t%ld\n", zname,
|
||||||
|
tagname, time);
|
||||||
|
} else {
|
||||||
(void) printf("%s\t%s\t%s\n", zname,
|
(void) printf("%s\t%s\t%s\n", zname,
|
||||||
tagname, tsbuf);
|
tagname, tsbuf);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
(void) printf("%-*s %-*s %s\n", nwidth,
|
if (parsable) {
|
||||||
zname, tagwidth, tagname, tsbuf);
|
(void) printf("%-*s %-*s %ld\n",
|
||||||
|
nwidth, zname, tagwidth,
|
||||||
|
tagname, time);
|
||||||
|
} else {
|
||||||
|
(void) printf("%-*s %-*s %s\n",
|
||||||
|
nwidth, zname, tagwidth,
|
||||||
|
tagname, tsbuf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6544,10 +6557,11 @@ holds_callback(zfs_handle_t *zhp, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* zfs holds [-rH] <snap> ...
|
* zfs holds [-rHp] <snap> ...
|
||||||
*
|
*
|
||||||
* -r Lists holds that are set on the named snapshots recursively.
|
* -r Lists holds that are set on the named snapshots recursively.
|
||||||
* -H Scripted mode; elide headers and separate columns by tabs.
|
* -H Scripted mode; elide headers and separate columns by tabs.
|
||||||
|
* -p Display values in parsable (literal) format.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
zfs_do_holds(int argc, char **argv)
|
zfs_do_holds(int argc, char **argv)
|
||||||
|
@ -6556,6 +6570,7 @@ zfs_do_holds(int argc, char **argv)
|
||||||
boolean_t errors = B_FALSE;
|
boolean_t errors = B_FALSE;
|
||||||
boolean_t scripted = B_FALSE;
|
boolean_t scripted = B_FALSE;
|
||||||
boolean_t recursive = B_FALSE;
|
boolean_t recursive = B_FALSE;
|
||||||
|
boolean_t parsable = B_FALSE;
|
||||||
|
|
||||||
int types = ZFS_TYPE_SNAPSHOT;
|
int types = ZFS_TYPE_SNAPSHOT;
|
||||||
holds_cbdata_t cb = { 0 };
|
holds_cbdata_t cb = { 0 };
|
||||||
|
@ -6565,7 +6580,7 @@ zfs_do_holds(int argc, char **argv)
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
|
||||||
/* check options */
|
/* check options */
|
||||||
while ((c = getopt(argc, argv, "rH")) != -1) {
|
while ((c = getopt(argc, argv, "rHp")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'r':
|
case 'r':
|
||||||
recursive = B_TRUE;
|
recursive = B_TRUE;
|
||||||
|
@ -6573,6 +6588,9 @@ zfs_do_holds(int argc, char **argv)
|
||||||
case 'H':
|
case 'H':
|
||||||
scripted = B_TRUE;
|
scripted = B_TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'p':
|
||||||
|
parsable = B_TRUE;
|
||||||
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
(void) fprintf(stderr, gettext("invalid option '%c'\n"),
|
(void) fprintf(stderr, gettext("invalid option '%c'\n"),
|
||||||
optopt);
|
optopt);
|
||||||
|
@ -6626,7 +6644,8 @@ zfs_do_holds(int argc, char **argv)
|
||||||
/*
|
/*
|
||||||
* 2. print holds data
|
* 2. print holds data
|
||||||
*/
|
*/
|
||||||
print_holds(scripted, cb.cb_max_namelen, cb.cb_max_taglen, nvl);
|
print_holds(scripted, cb.cb_max_namelen, cb.cb_max_taglen, nvl,
|
||||||
|
parsable);
|
||||||
|
|
||||||
if (nvlist_empty(nvl))
|
if (nvlist_empty(nvl))
|
||||||
(void) fprintf(stderr, gettext("no datasets available\n"));
|
(void) fprintf(stderr, gettext("no datasets available\n"));
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
.Ar tag Ar snapshot Ns …
|
.Ar tag Ar snapshot Ns …
|
||||||
.Nm zfs
|
.Nm zfs
|
||||||
.Cm holds
|
.Cm holds
|
||||||
.Op Fl rH
|
.Op Fl rHp
|
||||||
.Ar snapshot Ns …
|
.Ar snapshot Ns …
|
||||||
.Nm zfs
|
.Nm zfs
|
||||||
.Cm release
|
.Cm release
|
||||||
|
@ -76,7 +76,7 @@ of all descendent file systems.
|
||||||
.It Xo
|
.It Xo
|
||||||
.Nm zfs
|
.Nm zfs
|
||||||
.Cm holds
|
.Cm holds
|
||||||
.Op Fl rH
|
.Op Fl rHp
|
||||||
.Ar snapshot Ns …
|
.Ar snapshot Ns …
|
||||||
.Xc
|
.Xc
|
||||||
Lists all existing user references for the given snapshot or snapshots.
|
Lists all existing user references for the given snapshot or snapshots.
|
||||||
|
@ -86,6 +86,8 @@ Lists the holds that are set on the named descendent snapshots, in addition to
|
||||||
listing the holds on the named snapshot.
|
listing the holds on the named snapshot.
|
||||||
.It Fl H
|
.It Fl H
|
||||||
Do not print headers, use tab-delimited output.
|
Do not print headers, use tab-delimited output.
|
||||||
|
.It Fl p
|
||||||
|
Prints holds timestamps as unix epoch timestamps.
|
||||||
.El
|
.El
|
||||||
.It Xo
|
.It Xo
|
||||||
.Nm zfs
|
.Nm zfs
|
||||||
|
|
Loading…
Reference in New Issue