zfs: merge openzfs/zfs@f291fa658 (master) into main
Notable upstream pull request merges:
#11711 Vdev Properties Feature
#12717 VOP_RENAME fixes for FreeBSD
#12746 Enable strict hole reporting by default
#12770 ZFS send/recv with ashift 9->12 leads to data corruption
#12828 FreeBSD: Add vop_standard_writecount_nomsyn
#12828 zfs: Fix a deadlock between page busy and the teardown lock
#12828 FreeBSD: Catch up with more VFS changes
Obtained from: OpenZFS
OpenZFS commit: f291fa658e
This commit is contained in:
commit
681ce946f3
@ -64,7 +64,7 @@ jobs:
|
||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
||||
- name: Tests
|
||||
run: |
|
||||
/usr/share/zfs/zfs-tests.sh -v -s 3G
|
||||
/usr/share/zfs/zfs-tests.sh -vR -s 3G
|
||||
- name: Prepare artifacts
|
||||
if: failure()
|
||||
run: |
|
||||
@ -73,7 +73,7 @@ jobs:
|
||||
sudo cp /var/log/syslog $RESULTS_PATH/
|
||||
sudo chmod +r $RESULTS_PATH/*
|
||||
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
||||
for f in $(find $RESULTS_PATH -name '*:*'); do mv "$f" "${f//:/__}"; done
|
||||
for f in $(find /var/tmp/test_results -name '*:*'); do mv "$f" "${f//:/__}"; done
|
||||
- uses: actions/upload-artifact@v2
|
||||
if: failure()
|
||||
with:
|
||||
|
@ -60,7 +60,7 @@ jobs:
|
||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
||||
- name: Tests
|
||||
run: |
|
||||
/usr/share/zfs/zfs-tests.sh -v -s 3G -r sanity
|
||||
/usr/share/zfs/zfs-tests.sh -vR -s 3G -r sanity
|
||||
- name: Prepare artifacts
|
||||
if: failure()
|
||||
run: |
|
||||
@ -69,7 +69,7 @@ jobs:
|
||||
sudo cp /var/log/syslog $RESULTS_PATH/
|
||||
sudo chmod +r $RESULTS_PATH/*
|
||||
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
||||
for f in $(find $RESULTS_PATH -name '*:*'); do mv "$f" "${f//:/__}"; done
|
||||
for f in $(find /var/tmp/test_results -name '*:*'); do mv "$f" "${f//:/__}"; done
|
||||
- uses: actions/upload-artifact@v2
|
||||
if: failure()
|
||||
with:
|
||||
|
@ -6,5 +6,5 @@ Release: 1
|
||||
Release-Tags: relext
|
||||
License: CDDL
|
||||
Author: OpenZFS
|
||||
Linux-Maximum: 5.14
|
||||
Linux-Maximum: 5.15
|
||||
Linux-Minimum: 3.10
|
||||
|
@ -1734,10 +1734,11 @@ print_vdev_metaslab_header(vdev_t *vd)
|
||||
}
|
||||
|
||||
static void
|
||||
dump_metaslab_groups(spa_t *spa)
|
||||
dump_metaslab_groups(spa_t *spa, boolean_t show_special)
|
||||
{
|
||||
vdev_t *rvd = spa->spa_root_vdev;
|
||||
metaslab_class_t *mc = spa_normal_class(spa);
|
||||
metaslab_class_t *smc = spa_special_class(spa);
|
||||
uint64_t fragmentation;
|
||||
|
||||
metaslab_class_histogram_verify(mc);
|
||||
@ -1746,7 +1747,8 @@ dump_metaslab_groups(spa_t *spa)
|
||||
vdev_t *tvd = rvd->vdev_child[c];
|
||||
metaslab_group_t *mg = tvd->vdev_mg;
|
||||
|
||||
if (mg == NULL || mg->mg_class != mc)
|
||||
if (mg == NULL || (mg->mg_class != mc &&
|
||||
(!show_special || mg->mg_class != smc)))
|
||||
continue;
|
||||
|
||||
metaslab_group_histogram_verify(mg);
|
||||
@ -7673,7 +7675,7 @@ dump_zpool(spa_t *spa)
|
||||
if (dump_opt['d'] > 2 || dump_opt['m'])
|
||||
dump_metaslabs(spa);
|
||||
if (dump_opt['M'])
|
||||
dump_metaslab_groups(spa);
|
||||
dump_metaslab_groups(spa, dump_opt['M'] > 1);
|
||||
if (dump_opt['d'] > 2 || dump_opt['m']) {
|
||||
dump_log_spacemaps(spa);
|
||||
dump_log_spacemap_obsolete_stats(spa);
|
||||
|
@ -428,7 +428,8 @@ fmd_case_add_suspect(fmd_hdl_t *hdl, fmd_case_t *cp, nvlist_t *fault)
|
||||
err |= nvlist_add_string(nvl, FM_SUSPECT_DIAG_CODE, code);
|
||||
err |= nvlist_add_int64_array(nvl, FM_SUSPECT_DIAG_TIME, tod, 2);
|
||||
err |= nvlist_add_uint32(nvl, FM_SUSPECT_FAULT_SZ, 1);
|
||||
err |= nvlist_add_nvlist_array(nvl, FM_SUSPECT_FAULT_LIST, &fault, 1);
|
||||
err |= nvlist_add_nvlist_array(nvl, FM_SUSPECT_FAULT_LIST,
|
||||
(const nvlist_t **)&fault, 1);
|
||||
|
||||
if (err)
|
||||
zed_log_die("failed to populate nvlist");
|
||||
|
@ -414,8 +414,8 @@ zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
||||
ZPOOL_CONFIG_VDEV_ENC_SYSFS_PATH, enc_sysfs_path) != 0) ||
|
||||
nvlist_add_uint64(newvd, ZPOOL_CONFIG_WHOLE_DISK, wholedisk) != 0 ||
|
||||
nvlist_add_string(nvroot, ZPOOL_CONFIG_TYPE, VDEV_TYPE_ROOT) != 0 ||
|
||||
nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN, &newvd,
|
||||
1) != 0) {
|
||||
nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
|
||||
(const nvlist_t **)&newvd, 1) != 0) {
|
||||
zed_log_msg(LOG_WARNING, "zfs_mod: unable to add nvlist pairs");
|
||||
nvlist_free(newvd);
|
||||
nvlist_free(nvroot);
|
||||
|
@ -239,7 +239,7 @@ replace_with_spare(fmd_hdl_t *hdl, zpool_handle_t *zhp, nvlist_t *vdev)
|
||||
ZPOOL_CONFIG_ASHIFT, ashift);
|
||||
|
||||
(void) nvlist_add_nvlist_array(replacement,
|
||||
ZPOOL_CONFIG_CHILDREN, &spares[s], 1);
|
||||
ZPOOL_CONFIG_CHILDREN, (const nvlist_t **)&spares[s], 1);
|
||||
|
||||
fmd_hdl_debug(hdl, "zpool_vdev_replace '%s' with spare '%s'",
|
||||
dev_name, zfs_basename(spare_name));
|
||||
|
@ -3760,7 +3760,6 @@ zfs_do_list(int argc, char **argv)
|
||||
* The '-p' flag creates all the non-existing ancestors of the target first.
|
||||
* The '-u' flag prevents file systems from being remounted during rename.
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
zfs_do_rename(int argc, char **argv)
|
||||
{
|
||||
@ -3859,7 +3858,6 @@ zfs_do_rename(int argc, char **argv)
|
||||
*
|
||||
* Promotes the given clone fs to be the parent
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
zfs_do_promote(int argc, char **argv)
|
||||
{
|
||||
@ -5095,10 +5093,10 @@ who_type2weight(zfs_deleg_who_type_t who_type)
|
||||
return (res);
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
who_perm_compare(const void *larg, const void *rarg, void *unused)
|
||||
{
|
||||
(void) unused;
|
||||
const who_perm_node_t *l = larg;
|
||||
const who_perm_node_t *r = rarg;
|
||||
zfs_deleg_who_type_t ltype = l->who_perm.who_type;
|
||||
@ -5118,10 +5116,10 @@ who_perm_compare(const void *larg, const void *rarg, void *unused)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
deleg_perm_compare(const void *larg, const void *rarg, void *unused)
|
||||
{
|
||||
(void) unused;
|
||||
const deleg_perm_node_t *l = larg;
|
||||
const deleg_perm_node_t *r = rarg;
|
||||
int res = strncmp(l->dpn_perm.dp_name, r->dpn_perm.dp_name,
|
||||
@ -7210,10 +7208,10 @@ typedef struct unshare_unmount_node {
|
||||
uu_avl_node_t un_avlnode;
|
||||
} unshare_unmount_node_t;
|
||||
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
unshare_unmount_compare(const void *larg, const void *rarg, void *unused)
|
||||
{
|
||||
(void) unused;
|
||||
const unshare_unmount_node_t *l = larg;
|
||||
const unshare_unmount_node_t *r = rarg;
|
||||
|
||||
@ -7664,7 +7662,7 @@ zfs_do_diff(int argc, char **argv)
|
||||
int c;
|
||||
struct sigaction sa;
|
||||
|
||||
while ((c = getopt(argc, argv, "FHt")) != -1) {
|
||||
while ((c = getopt(argc, argv, "FHth")) != -1) {
|
||||
switch (c) {
|
||||
case 'F':
|
||||
flags |= ZFS_DIFF_CLASSIFY;
|
||||
@ -7675,6 +7673,9 @@ zfs_do_diff(int argc, char **argv)
|
||||
case 't':
|
||||
flags |= ZFS_DIFF_TIMESTAMP;
|
||||
break;
|
||||
case 'h':
|
||||
flags |= ZFS_DIFF_NO_MANGLE;
|
||||
break;
|
||||
default:
|
||||
(void) fprintf(stderr,
|
||||
gettext("invalid option '%c'\n"), optopt);
|
||||
@ -8010,7 +8011,8 @@ zfs_do_channel_program(int argc, char **argv)
|
||||
* }
|
||||
*/
|
||||
nvlist_t *argnvl = fnvlist_alloc();
|
||||
fnvlist_add_string_array(argnvl, ZCP_ARG_CLIARGV, argv + 2, argc - 2);
|
||||
fnvlist_add_string_array(argnvl, ZCP_ARG_CLIARGV,
|
||||
(const char **)argv + 2, argc - 2);
|
||||
|
||||
if (sync_flag) {
|
||||
ret = lzc_channel_program(poolname, progbuf,
|
||||
@ -8610,6 +8612,8 @@ zfs_do_wait(int argc, char **argv)
|
||||
static int
|
||||
zfs_do_version(int argc, char **argv)
|
||||
{
|
||||
(void) argc, (void) argv;
|
||||
|
||||
if (zfs_version_print() == -1)
|
||||
return (1);
|
||||
|
||||
@ -8734,7 +8738,6 @@ main(int argc, char **argv)
|
||||
/*
|
||||
* Attach/detach the given dataset to/from the given jail
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
zfs_do_jail_impl(int argc, char **argv, boolean_t attach)
|
||||
{
|
||||
@ -8772,7 +8775,6 @@ zfs_do_jail_impl(int argc, char **argv, boolean_t attach)
|
||||
*
|
||||
* Attach the given dataset to the given jail
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
zfs_do_jail(int argc, char **argv)
|
||||
{
|
||||
@ -8784,7 +8786,6 @@ zfs_do_jail(int argc, char **argv)
|
||||
*
|
||||
* Detach the given dataset from the given jail
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
zfs_do_unjail(int argc, char **argv)
|
||||
{
|
||||
|
@ -60,6 +60,7 @@ struct zpool_list {
|
||||
uu_avl_t *zl_avl;
|
||||
uu_avl_pool_t *zl_pool;
|
||||
zprop_list_t **zl_proplist;
|
||||
zfs_type_t zl_type;
|
||||
};
|
||||
|
||||
/* ARGSUSED */
|
||||
@ -90,8 +91,7 @@ add_pool(zpool_handle_t *zhp, void *data)
|
||||
if (uu_avl_find(zlp->zl_avl, node, NULL, &idx) == NULL) {
|
||||
if (zlp->zl_proplist &&
|
||||
zpool_expand_proplist(zhp, zlp->zl_proplist,
|
||||
zlp->zl_literal)
|
||||
!= 0) {
|
||||
zlp->zl_type, zlp->zl_literal) != 0) {
|
||||
zpool_close(zhp);
|
||||
free(node);
|
||||
return (-1);
|
||||
@ -113,7 +113,7 @@ add_pool(zpool_handle_t *zhp, void *data)
|
||||
* line.
|
||||
*/
|
||||
zpool_list_t *
|
||||
pool_list_get(int argc, char **argv, zprop_list_t **proplist,
|
||||
pool_list_get(int argc, char **argv, zprop_list_t **proplist, zfs_type_t type,
|
||||
boolean_t literal, int *err)
|
||||
{
|
||||
zpool_list_t *zlp;
|
||||
@ -131,6 +131,7 @@ pool_list_get(int argc, char **argv, zprop_list_t **proplist,
|
||||
zpool_no_memory();
|
||||
|
||||
zlp->zl_proplist = proplist;
|
||||
zlp->zl_type = type;
|
||||
|
||||
zlp->zl_literal = literal;
|
||||
|
||||
@ -248,12 +249,14 @@ pool_list_count(zpool_list_t *zlp)
|
||||
*/
|
||||
int
|
||||
for_each_pool(int argc, char **argv, boolean_t unavail,
|
||||
zprop_list_t **proplist, boolean_t literal, zpool_iter_f func, void *data)
|
||||
zprop_list_t **proplist, zfs_type_t type, boolean_t literal,
|
||||
zpool_iter_f func, void *data)
|
||||
{
|
||||
zpool_list_t *list;
|
||||
int ret = 0;
|
||||
|
||||
if ((list = pool_list_get(argc, argv, proplist, literal, &ret)) == NULL)
|
||||
if ((list = pool_list_get(argc, argv, proplist, type, literal,
|
||||
&ret)) == NULL)
|
||||
return (1);
|
||||
|
||||
if (pool_list_iter(list, unavail, func, data) != 0)
|
||||
@ -678,8 +681,8 @@ all_pools_for_each_vdev_run(int argc, char **argv, char *cmd,
|
||||
vcdl->g_zfs = g_zfs;
|
||||
|
||||
/* Gather our list of all vdevs in all pools */
|
||||
for_each_pool(argc, argv, B_TRUE, NULL, B_FALSE,
|
||||
all_pools_for_each_vdev_gather_cb, vcdl);
|
||||
for_each_pool(argc, argv, B_TRUE, NULL, ZFS_TYPE_POOL,
|
||||
B_FALSE, all_pools_for_each_vdev_gather_cb, vcdl);
|
||||
|
||||
/* Run command on all vdevs in all pools */
|
||||
all_pools_for_each_vdev_run_vcdl(vcdl);
|
||||
|
@ -32,6 +32,7 @@
|
||||
* Copyright (c) 2017, Intel Corporation.
|
||||
* Copyright (c) 2019, loli10K <ezomori.nozomu@gmail.com>
|
||||
* Copyright (c) 2021, Colm Buckley <colm@tuatha.org>
|
||||
* Copyright (c) 2021, Klara Inc.
|
||||
* Copyright [2021] Hewlett Packard Enterprise Development LP
|
||||
*/
|
||||
|
||||
@ -335,6 +336,7 @@ static zpool_command_t command_table[] = {
|
||||
#define VDEV_ALLOC_CLASS_LOGS "logs"
|
||||
|
||||
static zpool_command_t *current_command;
|
||||
static zfs_type_t current_prop_type = (ZFS_TYPE_POOL | ZFS_TYPE_VDEV);
|
||||
static char history_str[HIS_MAX_RECORD_LEN];
|
||||
static boolean_t log_history = B_TRUE;
|
||||
static uint_t timestamp_fmt = NODATE;
|
||||
@ -470,7 +472,7 @@ zpool_collect_leaves(zpool_handle_t *zhp, nvlist_t *nvroot, nvlist_t *res)
|
||||
* Callback routine that will print out a pool property value.
|
||||
*/
|
||||
static int
|
||||
print_prop_cb(int prop, void *cb)
|
||||
print_pool_prop_cb(int prop, void *cb)
|
||||
{
|
||||
FILE *fp = cb;
|
||||
|
||||
@ -489,6 +491,29 @@ print_prop_cb(int prop, void *cb)
|
||||
return (ZPROP_CONT);
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback routine that will print out a vdev property value.
|
||||
*/
|
||||
static int
|
||||
print_vdev_prop_cb(int prop, void *cb)
|
||||
{
|
||||
FILE *fp = cb;
|
||||
|
||||
(void) fprintf(fp, "\t%-19s ", vdev_prop_to_name(prop));
|
||||
|
||||
if (vdev_prop_readonly(prop))
|
||||
(void) fprintf(fp, " NO ");
|
||||
else
|
||||
(void) fprintf(fp, " YES ");
|
||||
|
||||
if (vdev_prop_values(prop) == NULL)
|
||||
(void) fprintf(fp, "-\n");
|
||||
else
|
||||
(void) fprintf(fp, "%s\n", vdev_prop_values(prop));
|
||||
|
||||
return (ZPROP_CONT);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display usage message. If we're inside a command, display only the usage for
|
||||
* that command. Otherwise, iterate over the entire command table and display
|
||||
@ -519,6 +544,7 @@ usage(boolean_t requested)
|
||||
}
|
||||
|
||||
if (current_command != NULL &&
|
||||
current_prop_type != (ZFS_TYPE_POOL | ZFS_TYPE_VDEV) &&
|
||||
((strcmp(current_command->name, "set") == 0) ||
|
||||
(strcmp(current_command->name, "get") == 0) ||
|
||||
(strcmp(current_command->name, "list") == 0))) {
|
||||
@ -530,14 +556,21 @@ usage(boolean_t requested)
|
||||
"PROPERTY", "EDIT", "VALUES");
|
||||
|
||||
/* Iterate over all properties */
|
||||
(void) zprop_iter(print_prop_cb, fp, B_FALSE, B_TRUE,
|
||||
ZFS_TYPE_POOL);
|
||||
if (current_prop_type == ZFS_TYPE_POOL) {
|
||||
(void) zprop_iter(print_pool_prop_cb, fp, B_FALSE,
|
||||
B_TRUE, current_prop_type);
|
||||
|
||||
(void) fprintf(fp, "\t%-19s ", "feature@...");
|
||||
(void) fprintf(fp, "YES disabled | enabled | active\n");
|
||||
(void) fprintf(fp, "\t%-19s ", "feature@...");
|
||||
(void) fprintf(fp, "YES "
|
||||
"disabled | enabled | active\n");
|
||||
|
||||
(void) fprintf(fp, gettext("\nThe feature@ properties must be "
|
||||
"appended with a feature name.\nSee zpool-features(7).\n"));
|
||||
(void) fprintf(fp, gettext("\nThe feature@ properties "
|
||||
"must be appended with a feature name.\n"
|
||||
"See zpool-features(7).\n"));
|
||||
} else if (current_prop_type == ZFS_TYPE_VDEV) {
|
||||
(void) zprop_iter(print_vdev_prop_cb, fp, B_FALSE,
|
||||
B_TRUE, current_prop_type);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -795,9 +828,10 @@ add_prop_list(const char *propname, char *propval, nvlist_t **props,
|
||||
zpool_prop_to_name(ZPOOL_PROP_COMPATIBILITY);
|
||||
|
||||
if ((prop = zpool_name_to_prop(propname)) == ZPOOL_PROP_INVAL &&
|
||||
!zpool_prop_feature(propname)) {
|
||||
(!zpool_prop_feature(propname) &&
|
||||
!zpool_prop_vdev(propname))) {
|
||||
(void) fprintf(stderr, gettext("property '%s' is "
|
||||
"not a valid pool property\n"), propname);
|
||||
"not a valid pool or vdev property\n"), propname);
|
||||
return (2);
|
||||
}
|
||||
|
||||
@ -832,7 +866,7 @@ add_prop_list(const char *propname, char *propval, nvlist_t **props,
|
||||
return (2);
|
||||
}
|
||||
|
||||
if (zpool_prop_feature(propname))
|
||||
if (zpool_prop_feature(propname) || zpool_prop_vdev(propname))
|
||||
normnm = propname;
|
||||
else
|
||||
normnm = zpool_prop_to_name(prop);
|
||||
@ -1930,7 +1964,7 @@ zpool_do_export(int argc, char **argv)
|
||||
}
|
||||
|
||||
return (for_each_pool(argc, argv, B_TRUE, NULL,
|
||||
B_FALSE, zpool_export_one, &cb));
|
||||
ZFS_TYPE_POOL, B_FALSE, zpool_export_one, &cb));
|
||||
}
|
||||
|
||||
/* check arguments */
|
||||
@ -1939,8 +1973,8 @@ zpool_do_export(int argc, char **argv)
|
||||
usage(B_FALSE);
|
||||
}
|
||||
|
||||
ret = for_each_pool(argc, argv, B_TRUE, NULL, B_FALSE, zpool_export_one,
|
||||
&cb);
|
||||
ret = for_each_pool(argc, argv, B_TRUE, NULL, ZFS_TYPE_POOL,
|
||||
B_FALSE, zpool_export_one, &cb);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
@ -2436,6 +2470,12 @@ print_status_config(zpool_handle_t *zhp, status_cbdata_t *cb, const char *name,
|
||||
1 << vs->vs_configured_ashift, 1 << vs->vs_physical_ashift);
|
||||
}
|
||||
|
||||
if (vs->vs_scan_removing != 0) {
|
||||
(void) printf(gettext(" (removing)"));
|
||||
} else if (vs->vs_noalloc != 0) {
|
||||
(void) printf(gettext(" (non-allocating)"));
|
||||
}
|
||||
|
||||
/* The root vdev has the scrub/resilver stats */
|
||||
root = fnvlist_lookup_nvlist(zpool_get_config(zhp, NULL),
|
||||
ZPOOL_CONFIG_VDEV_TREE);
|
||||
@ -3857,24 +3897,22 @@ zpool_do_sync(int argc, char **argv)
|
||||
argv += optind;
|
||||
|
||||
/* if argc == 0 we will execute zpool_sync_one on all pools */
|
||||
ret = for_each_pool(argc, argv, B_FALSE, NULL, B_FALSE, zpool_sync_one,
|
||||
&force);
|
||||
ret = for_each_pool(argc, argv, B_FALSE, NULL, ZFS_TYPE_POOL,
|
||||
B_FALSE, zpool_sync_one, &force);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
typedef struct iostat_cbdata {
|
||||
uint64_t cb_flags;
|
||||
int cb_name_flags;
|
||||
int cb_namewidth;
|
||||
int cb_iteration;
|
||||
char **cb_vdev_names; /* Only show these vdevs */
|
||||
unsigned int cb_vdev_names_count;
|
||||
boolean_t cb_verbose;
|
||||
boolean_t cb_literal;
|
||||
boolean_t cb_scripted;
|
||||
zpool_list_t *cb_list;
|
||||
vdev_cmd_data_list_t *vcdl;
|
||||
vdev_cbdata_t cb_vdevs;
|
||||
} iostat_cbdata_t;
|
||||
|
||||
/* iostat labels */
|
||||
@ -4128,7 +4166,7 @@ print_iostat_dashes(iostat_cbdata_t *cb, unsigned int force_column_width,
|
||||
|
||||
if (cb->cb_flags & IOS_ANYHISTO_M) {
|
||||
title = histo_to_title[IOS_HISTO_IDX(cb->cb_flags)];
|
||||
} else if (cb->cb_vdev_names_count) {
|
||||
} else if (cb->cb_vdevs.cb_names_count) {
|
||||
title = "vdev";
|
||||
} else {
|
||||
title = "pool";
|
||||
@ -4188,7 +4226,7 @@ print_iostat_header_impl(iostat_cbdata_t *cb, unsigned int force_column_width,
|
||||
|
||||
if (cb->cb_flags & IOS_ANYHISTO_M) {
|
||||
title = histo_to_title[IOS_HISTO_IDX(cb->cb_flags)];
|
||||
} else if (cb->cb_vdev_names_count) {
|
||||
} else if (cb->cb_vdevs.cb_names_count) {
|
||||
title = "vdev";
|
||||
} else {
|
||||
title = "pool";
|
||||
@ -4696,9 +4734,9 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
|
||||
}
|
||||
|
||||
/* Do we only want to see a specific vdev? */
|
||||
for (i = 0; i < cb->cb_vdev_names_count; i++) {
|
||||
for (i = 0; i < cb->cb_vdevs.cb_names_count; i++) {
|
||||
/* Yes we do. Is this the vdev? */
|
||||
if (strcmp(name, cb->cb_vdev_names[i]) == 0) {
|
||||
if (strcmp(name, cb->cb_vdevs.cb_names[i]) == 0) {
|
||||
/*
|
||||
* This is our vdev. Since it is the only vdev we
|
||||
* will be displaying, make depth = 0 so that it
|
||||
@ -4709,7 +4747,7 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
|
||||
}
|
||||
}
|
||||
|
||||
if (cb->cb_vdev_names_count && (i == cb->cb_vdev_names_count)) {
|
||||
if (cb->cb_vdevs.cb_names_count && (i == cb->cb_vdevs.cb_names_count)) {
|
||||
/* Couldn't match the name */
|
||||
goto children;
|
||||
}
|
||||
@ -4816,7 +4854,7 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
|
||||
continue;
|
||||
|
||||
vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
|
||||
cb->cb_name_flags);
|
||||
cb->cb_vdevs.cb_name_flags);
|
||||
ret += print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
|
||||
newchild[c], cb, depth + 2);
|
||||
free(vname);
|
||||
@ -4850,7 +4888,8 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
|
||||
|
||||
if (!printed) {
|
||||
if ((!(cb->cb_flags & IOS_ANYHISTO_M)) &&
|
||||
!cb->cb_scripted && !cb->cb_vdev_names) {
|
||||
!cb->cb_scripted &&
|
||||
!cb->cb_vdevs.cb_names) {
|
||||
print_iostat_dashes(cb, 0,
|
||||
class_name[n]);
|
||||
}
|
||||
@ -4859,7 +4898,7 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
|
||||
}
|
||||
|
||||
vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
|
||||
cb->cb_name_flags);
|
||||
cb->cb_vdevs.cb_name_flags);
|
||||
ret += print_vdev_stats(zhp, vname, oldnv ?
|
||||
oldchild[c] : NULL, newchild[c], cb, depth + 2);
|
||||
free(vname);
|
||||
@ -4883,14 +4922,14 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
|
||||
|
||||
if (children > 0) {
|
||||
if ((!(cb->cb_flags & IOS_ANYHISTO_M)) && !cb->cb_scripted &&
|
||||
!cb->cb_vdev_names) {
|
||||
!cb->cb_vdevs.cb_names) {
|
||||
print_iostat_dashes(cb, 0, "cache");
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
for (c = 0; c < children; c++) {
|
||||
vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
|
||||
cb->cb_name_flags);
|
||||
cb->cb_vdevs.cb_name_flags);
|
||||
ret += print_vdev_stats(zhp, vname, oldnv ? oldchild[c]
|
||||
: NULL, newchild[c], cb, depth + 2);
|
||||
free(vname);
|
||||
@ -4946,7 +4985,8 @@ print_iostat(zpool_handle_t *zhp, void *data)
|
||||
ret = print_vdev_stats(zhp, zpool_get_name(zhp), oldnvroot, newnvroot,
|
||||
cb, 0);
|
||||
if ((ret != 0) && !(cb->cb_flags & IOS_ANYHISTO_M) &&
|
||||
!cb->cb_scripted && cb->cb_verbose && !cb->cb_vdev_names_count) {
|
||||
!cb->cb_scripted && cb->cb_verbose &&
|
||||
!cb->cb_vdevs.cb_names_count) {
|
||||
print_iostat_separator(cb);
|
||||
if (cb->vcdl != NULL) {
|
||||
print_cmd_columns(cb->vcdl, 1);
|
||||
@ -5153,27 +5193,30 @@ get_stat_flags(zpool_list_t *list)
|
||||
}
|
||||
|
||||
/*
|
||||
* Return 1 if cb_data->cb_vdev_names[0] is this vdev's name, 0 otherwise.
|
||||
* Return 1 if cb_data->cb_names[0] is this vdev's name, 0 otherwise.
|
||||
*/
|
||||
static int
|
||||
is_vdev_cb(void *zhp_data, nvlist_t *nv, void *cb_data)
|
||||
{
|
||||
iostat_cbdata_t *cb = cb_data;
|
||||
vdev_cbdata_t *cb = cb_data;
|
||||
char *name = NULL;
|
||||
int ret = 0;
|
||||
int ret = 1; /* assume match */
|
||||
zpool_handle_t *zhp = zhp_data;
|
||||
|
||||
name = zpool_vdev_name(g_zfs, zhp, nv, cb->cb_name_flags);
|
||||
|
||||
if (strcmp(name, cb->cb_vdev_names[0]) == 0)
|
||||
ret = 1; /* match */
|
||||
if (strcmp(name, cb->cb_names[0])) {
|
||||
free(name);
|
||||
name = zpool_vdev_name(g_zfs, zhp, nv, VDEV_NAME_GUID);
|
||||
ret = (strcmp(name, cb->cb_names[0]) == 0);
|
||||
}
|
||||
free(name);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns 1 if cb_data->cb_vdev_names[0] is a vdev name, 0 otherwise.
|
||||
* Returns 1 if cb_data->cb_names[0] is a vdev name, 0 otherwise.
|
||||
*/
|
||||
static int
|
||||
is_vdev(zpool_handle_t *zhp, void *cb_data)
|
||||
@ -5189,7 +5232,7 @@ is_vdev(zpool_handle_t *zhp, void *cb_data)
|
||||
*/
|
||||
static int
|
||||
are_vdevs_in_pool(int argc, char **argv, char *pool_name,
|
||||
iostat_cbdata_t *cb)
|
||||
vdev_cbdata_t *cb)
|
||||
{
|
||||
char **tmp_name;
|
||||
int ret = 0;
|
||||
@ -5202,23 +5245,23 @@ are_vdevs_in_pool(int argc, char **argv, char *pool_name,
|
||||
if (pool_name)
|
||||
pool_count = 1;
|
||||
|
||||
/* Temporarily hijack cb_vdev_names for a second... */
|
||||
tmp_name = cb->cb_vdev_names;
|
||||
/* Temporarily hijack cb_names for a second... */
|
||||
tmp_name = cb->cb_names;
|
||||
|
||||
/* Go though our list of prospective vdev names */
|
||||
for (i = 0; i < argc; i++) {
|
||||
cb->cb_vdev_names = argv + i;
|
||||
cb->cb_names = argv + i;
|
||||
|
||||
/* Is this name a vdev in our pools? */
|
||||
ret = for_each_pool(pool_count, &pool_name, B_TRUE, NULL,
|
||||
B_FALSE, is_vdev, cb);
|
||||
ZFS_TYPE_POOL, B_FALSE, is_vdev, cb);
|
||||
if (!ret) {
|
||||
/* No match */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cb->cb_vdev_names = tmp_name;
|
||||
cb->cb_names = tmp_name;
|
||||
|
||||
return (ret);
|
||||
}
|
||||
@ -5239,8 +5282,8 @@ is_pool_cb(zpool_handle_t *zhp, void *data)
|
||||
static int
|
||||
is_pool(char *name)
|
||||
{
|
||||
return (for_each_pool(0, NULL, B_TRUE, NULL, B_FALSE, is_pool_cb,
|
||||
name));
|
||||
return (for_each_pool(0, NULL, B_TRUE, NULL, ZFS_TYPE_POOL, B_FALSE,
|
||||
is_pool_cb, name));
|
||||
}
|
||||
|
||||
/* Are all our argv[] strings pool names? If so return 1, 0 otherwise. */
|
||||
@ -5263,7 +5306,7 @@ are_all_pools(int argc, char **argv)
|
||||
*/
|
||||
static void
|
||||
error_list_unresolved_vdevs(int argc, char **argv, char *pool_name,
|
||||
iostat_cbdata_t *cb)
|
||||
vdev_cbdata_t *cb)
|
||||
{
|
||||
int i;
|
||||
char *name;
|
||||
@ -5287,7 +5330,7 @@ error_list_unresolved_vdevs(int argc, char **argv, char *pool_name,
|
||||
/*
|
||||
* Same as get_interval_count(), but with additional checks to not misinterpret
|
||||
* guids as interval/count values. Assumes VDEV_NAME_GUID is set in
|
||||
* cb.cb_name_flags.
|
||||
* cb.cb_vdevs.cb_name_flags.
|
||||
*/
|
||||
static void
|
||||
get_interval_count_filter_guids(int *argc, char **argv, float *interval,
|
||||
@ -5297,7 +5340,8 @@ get_interval_count_filter_guids(int *argc, char **argv, float *interval,
|
||||
int argc_for_interval = 0;
|
||||
|
||||
/* Is the last arg an interval value? Or a guid? */
|
||||
if (*argc >= 1 && !are_vdevs_in_pool(1, &argv[*argc - 1], NULL, cb)) {
|
||||
if (*argc >= 1 && !are_vdevs_in_pool(1, &argv[*argc - 1], NULL,
|
||||
&cb->cb_vdevs)) {
|
||||
/*
|
||||
* The last arg is not a guid, so it's probably an
|
||||
* interval value.
|
||||
@ -5305,7 +5349,8 @@ get_interval_count_filter_guids(int *argc, char **argv, float *interval,
|
||||
argc_for_interval++;
|
||||
|
||||
if (*argc >= 2 &&
|
||||
!are_vdevs_in_pool(1, &argv[*argc - 2], NULL, cb)) {
|
||||
!are_vdevs_in_pool(1, &argv[*argc - 2], NULL,
|
||||
&cb->cb_vdevs)) {
|
||||
/*
|
||||
* The 2nd to last arg is not a guid, so it's probably
|
||||
* an interval value.
|
||||
@ -5448,7 +5493,7 @@ get_namewidth_iostat(zpool_handle_t *zhp, void *data)
|
||||
* get_namewidth() returns the maximum width of any name in that column
|
||||
* for any pool/vdev/device line that will be output.
|
||||
*/
|
||||
width = get_namewidth(zhp, cb->cb_namewidth, cb->cb_name_flags,
|
||||
width = get_namewidth(zhp, cb->cb_namewidth, cb->cb_vdevs.cb_name_flags,
|
||||
cb->cb_verbose);
|
||||
|
||||
/*
|
||||
@ -5626,11 +5671,11 @@ zpool_do_iostat(int argc, char **argv)
|
||||
cb.cb_scripted = scripted;
|
||||
|
||||
if (guid)
|
||||
cb.cb_name_flags |= VDEV_NAME_GUID;
|
||||
cb.cb_vdevs.cb_name_flags |= VDEV_NAME_GUID;
|
||||
if (follow_links)
|
||||
cb.cb_name_flags |= VDEV_NAME_FOLLOW_LINKS;
|
||||
cb.cb_vdevs.cb_name_flags |= VDEV_NAME_FOLLOW_LINKS;
|
||||
if (full_name)
|
||||
cb.cb_name_flags |= VDEV_NAME_PATH;
|
||||
cb.cb_vdevs.cb_name_flags |= VDEV_NAME_PATH;
|
||||
cb.cb_iteration = 0;
|
||||
cb.cb_namewidth = 0;
|
||||
cb.cb_verbose = verbose;
|
||||
@ -5647,17 +5692,18 @@ zpool_do_iostat(int argc, char **argv)
|
||||
/* No args, so just print the defaults. */
|
||||
} else if (are_all_pools(argc, argv)) {
|
||||
/* All the args are pool names */
|
||||
} else if (are_vdevs_in_pool(argc, argv, NULL, &cb)) {
|
||||
} else if (are_vdevs_in_pool(argc, argv, NULL, &cb.cb_vdevs)) {
|
||||
/* All the args are vdevs */
|
||||
cb.cb_vdev_names = argv;
|
||||
cb.cb_vdev_names_count = argc;
|
||||
cb.cb_vdevs.cb_names = argv;
|
||||
cb.cb_vdevs.cb_names_count = argc;
|
||||
argc = 0; /* No pools to process */
|
||||
} else if (are_all_pools(1, argv)) {
|
||||
/* The first arg is a pool name */
|
||||
if (are_vdevs_in_pool(argc - 1, argv + 1, argv[0], &cb)) {
|
||||
if (are_vdevs_in_pool(argc - 1, argv + 1, argv[0],
|
||||
&cb.cb_vdevs)) {
|
||||
/* ...and the rest are vdev names */
|
||||
cb.cb_vdev_names = argv + 1;
|
||||
cb.cb_vdev_names_count = argc - 1;
|
||||
cb.cb_vdevs.cb_names = argv + 1;
|
||||
cb.cb_vdevs.cb_names_count = argc - 1;
|
||||
argc = 1; /* One pool to process */
|
||||
} else {
|
||||
fprintf(stderr, gettext("Expected either a list of "));
|
||||
@ -5665,7 +5711,7 @@ zpool_do_iostat(int argc, char **argv)
|
||||
fprintf(stderr, " \"%s\", ", argv[0]);
|
||||
fprintf(stderr, gettext("but got:\n"));
|
||||
error_list_unresolved_vdevs(argc - 1, argv + 1,
|
||||
argv[0], &cb);
|
||||
argv[0], &cb.cb_vdevs);
|
||||
fprintf(stderr, "\n");
|
||||
usage(B_FALSE);
|
||||
return (1);
|
||||
@ -5680,7 +5726,7 @@ zpool_do_iostat(int argc, char **argv)
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (cb.cb_vdev_names_count != 0) {
|
||||
if (cb.cb_vdevs.cb_names_count != 0) {
|
||||
/*
|
||||
* If user specified vdevs, it implies verbose.
|
||||
*/
|
||||
@ -5691,7 +5737,8 @@ zpool_do_iostat(int argc, char **argv)
|
||||
* Construct the list of all interesting pools.
|
||||
*/
|
||||
ret = 0;
|
||||
if ((list = pool_list_get(argc, argv, NULL, parsable, &ret)) == NULL)
|
||||
if ((list = pool_list_get(argc, argv, NULL, ZFS_TYPE_POOL, parsable,
|
||||
&ret)) == NULL)
|
||||
return (1);
|
||||
|
||||
if (pool_list_count(list) == 0 && argc != 0) {
|
||||
@ -5799,8 +5846,9 @@ zpool_do_iostat(int argc, char **argv)
|
||||
if (cmd != NULL && cb.cb_verbose &&
|
||||
!(cb.cb_flags & IOS_ANYHISTO_M)) {
|
||||
cb.vcdl = all_pools_for_each_vdev_run(argc,
|
||||
argv, cmd, g_zfs, cb.cb_vdev_names,
|
||||
cb.cb_vdev_names_count, cb.cb_name_flags);
|
||||
argv, cmd, g_zfs, cb.cb_vdevs.cb_names,
|
||||
cb.cb_vdevs.cb_names_count,
|
||||
cb.cb_vdevs.cb_name_flags);
|
||||
} else {
|
||||
cb.vcdl = NULL;
|
||||
}
|
||||
@ -5852,7 +5900,7 @@ zpool_do_iostat(int argc, char **argv)
|
||||
if (((npools > 1 && !verbose &&
|
||||
!(cb.cb_flags & IOS_ANYHISTO_M)) ||
|
||||
(!(cb.cb_flags & IOS_ANYHISTO_M) &&
|
||||
cb.cb_vdev_names_count)) &&
|
||||
cb.cb_vdevs.cb_names_count)) &&
|
||||
!cb.cb_scripted) {
|
||||
print_iostat_separator(&cb);
|
||||
if (cb.vcdl != NULL)
|
||||
@ -6314,6 +6362,7 @@ zpool_do_list(int argc, char **argv)
|
||||
unsigned long count = 0;
|
||||
zpool_list_t *list;
|
||||
boolean_t first = B_TRUE;
|
||||
current_prop_type = ZFS_TYPE_POOL;
|
||||
|
||||
/* check options */
|
||||
while ((c = getopt(argc, argv, ":gHLo:pPT:v")) != -1) {
|
||||
@ -6365,7 +6414,7 @@ zpool_do_list(int argc, char **argv)
|
||||
|
||||
for (;;) {
|
||||
if ((list = pool_list_get(argc, argv, &cb.cb_proplist,
|
||||
cb.cb_literal, &ret)) == NULL)
|
||||
ZFS_TYPE_POOL, cb.cb_literal, &ret)) == NULL)
|
||||
return (1);
|
||||
|
||||
if (pool_list_count(list) == 0)
|
||||
@ -7121,8 +7170,8 @@ zpool_do_reopen(int argc, char **argv)
|
||||
argv += optind;
|
||||
|
||||
/* if argc == 0 we will execute zpool_reopen_one on all pools */
|
||||
ret = for_each_pool(argc, argv, B_TRUE, NULL, B_FALSE, zpool_reopen_one,
|
||||
&scrub_restart);
|
||||
ret = for_each_pool(argc, argv, B_TRUE, NULL, ZFS_TYPE_POOL,
|
||||
B_FALSE, zpool_reopen_one, &scrub_restart);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
@ -7251,13 +7300,13 @@ zpool_do_scrub(int argc, char **argv)
|
||||
usage(B_FALSE);
|
||||
}
|
||||
|
||||
error = for_each_pool(argc, argv, B_TRUE, NULL, B_FALSE,
|
||||
scrub_callback, &cb);
|
||||
error = for_each_pool(argc, argv, B_TRUE, NULL, ZFS_TYPE_POOL,
|
||||
B_FALSE, scrub_callback, &cb);
|
||||
|
||||
if (wait && !error) {
|
||||
zpool_wait_activity_t act = ZPOOL_WAIT_SCRUB;
|
||||
error = for_each_pool(argc, argv, B_TRUE, NULL, B_FALSE,
|
||||
wait_callback, &act);
|
||||
error = for_each_pool(argc, argv, B_TRUE, NULL, ZFS_TYPE_POOL,
|
||||
B_FALSE, wait_callback, &act);
|
||||
}
|
||||
|
||||
return (error);
|
||||
@ -7295,8 +7344,8 @@ zpool_do_resilver(int argc, char **argv)
|
||||
usage(B_FALSE);
|
||||
}
|
||||
|
||||
return (for_each_pool(argc, argv, B_TRUE, NULL, B_FALSE,
|
||||
scrub_callback, &cb));
|
||||
return (for_each_pool(argc, argv, B_TRUE, NULL, ZFS_TYPE_POOL,
|
||||
B_FALSE, scrub_callback, &cb));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -8719,8 +8768,8 @@ zpool_do_status(int argc, char **argv)
|
||||
cb.vcdl = all_pools_for_each_vdev_run(argc, argv, cmd,
|
||||
NULL, NULL, 0, 0);
|
||||
|
||||
ret = for_each_pool(argc, argv, B_TRUE, NULL, cb.cb_literal,
|
||||
status_callback, &cb);
|
||||
ret = for_each_pool(argc, argv, B_TRUE, NULL, ZFS_TYPE_POOL,
|
||||
cb.cb_literal, status_callback, &cb);
|
||||
|
||||
if (cb.vcdl != NULL)
|
||||
free_vdev_cmd_data_list(cb.vcdl);
|
||||
@ -9279,8 +9328,8 @@ zpool_do_upgrade(int argc, char **argv)
|
||||
(void) printf(gettext("\n"));
|
||||
}
|
||||
} else {
|
||||
ret = for_each_pool(argc, argv, B_FALSE, NULL, B_FALSE,
|
||||
upgrade_one, &cb);
|
||||
ret = for_each_pool(argc, argv, B_FALSE, NULL, ZFS_TYPE_POOL,
|
||||
B_FALSE, upgrade_one, &cb);
|
||||
}
|
||||
|
||||
return (ret);
|
||||
@ -9476,8 +9525,8 @@ zpool_do_history(int argc, char **argv)
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
ret = for_each_pool(argc, argv, B_FALSE, NULL, B_FALSE, get_history_one,
|
||||
&cbdata);
|
||||
ret = for_each_pool(argc, argv, B_FALSE, NULL, ZFS_TYPE_POOL,
|
||||
B_FALSE, get_history_one, &cbdata);
|
||||
|
||||
if (argc == 0 && cbdata.first == B_TRUE) {
|
||||
(void) fprintf(stderr, gettext("no pools available\n"));
|
||||
@ -9875,44 +9924,135 @@ zpool_do_events(int argc, char **argv)
|
||||
}
|
||||
|
||||
static int
|
||||
get_callback(zpool_handle_t *zhp, void *data)
|
||||
get_callback_vdev(zpool_handle_t *zhp, char *vdevname, void *data)
|
||||
{
|
||||
zprop_get_cbdata_t *cbp = (zprop_get_cbdata_t *)data;
|
||||
char value[MAXNAMELEN];
|
||||
char value[ZFS_MAXPROPLEN];
|
||||
zprop_source_t srctype;
|
||||
zprop_list_t *pl;
|
||||
|
||||
for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
|
||||
|
||||
for (zprop_list_t *pl = cbp->cb_proplist; pl != NULL;
|
||||
pl = pl->pl_next) {
|
||||
char *prop_name;
|
||||
/*
|
||||
* Skip the special fake placeholder. This will also skip
|
||||
* If the first property is pool name, it is a special
|
||||
* placeholder that we can skip. This will also skip
|
||||
* over the name property when 'all' is specified.
|
||||
*/
|
||||
if (pl->pl_prop == ZPOOL_PROP_NAME &&
|
||||
pl == cbp->cb_proplist)
|
||||
continue;
|
||||
|
||||
if (pl->pl_prop == ZPROP_INVAL &&
|
||||
(zpool_prop_feature(pl->pl_user_prop) ||
|
||||
zpool_prop_unsupported(pl->pl_user_prop))) {
|
||||
srctype = ZPROP_SRC_LOCAL;
|
||||
|
||||
if (zpool_prop_get_feature(zhp, pl->pl_user_prop,
|
||||
value, sizeof (value)) == 0) {
|
||||
zprop_print_one_property(zpool_get_name(zhp),
|
||||
cbp, pl->pl_user_prop, value, srctype,
|
||||
NULL, NULL);
|
||||
}
|
||||
if (pl->pl_prop == ZPROP_INVAL) {
|
||||
prop_name = pl->pl_user_prop;
|
||||
} else {
|
||||
if (zpool_get_prop(zhp, pl->pl_prop, value,
|
||||
sizeof (value), &srctype, cbp->cb_literal) != 0)
|
||||
continue;
|
||||
|
||||
zprop_print_one_property(zpool_get_name(zhp), cbp,
|
||||
zpool_prop_to_name(pl->pl_prop), value, srctype,
|
||||
NULL, NULL);
|
||||
prop_name = (char *)vdev_prop_to_name(pl->pl_prop);
|
||||
}
|
||||
if (zpool_get_vdev_prop(zhp, vdevname, pl->pl_prop,
|
||||
prop_name, value, sizeof (value), &srctype,
|
||||
cbp->cb_literal) == 0) {
|
||||
zprop_print_one_property(vdevname, cbp, prop_name,
|
||||
value, srctype, NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
get_callback_vdev_width_cb(void *zhp_data, nvlist_t *nv, void *data)
|
||||
{
|
||||
zpool_handle_t *zhp = zhp_data;
|
||||
zprop_get_cbdata_t *cbp = (zprop_get_cbdata_t *)data;
|
||||
char *vdevname = zpool_vdev_name(g_zfs, zhp, nv,
|
||||
cbp->cb_vdevs.cb_name_flags);
|
||||
int ret;
|
||||
|
||||
/* Adjust the column widths for the vdev properties */
|
||||
ret = vdev_expand_proplist(zhp, vdevname, &cbp->cb_proplist);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static int
|
||||
get_callback_vdev_cb(void *zhp_data, nvlist_t *nv, void *data)
|
||||
{
|
||||
zpool_handle_t *zhp = zhp_data;
|
||||
zprop_get_cbdata_t *cbp = (zprop_get_cbdata_t *)data;
|
||||
char *vdevname = zpool_vdev_name(g_zfs, zhp, nv,
|
||||
cbp->cb_vdevs.cb_name_flags);
|
||||
int ret;
|
||||
|
||||
/* Display the properties */
|
||||
ret = get_callback_vdev(zhp, vdevname, data);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static int
|
||||
get_callback(zpool_handle_t *zhp, void *data)
|
||||
{
|
||||
zprop_get_cbdata_t *cbp = (zprop_get_cbdata_t *)data;
|
||||
char value[MAXNAMELEN];
|
||||
zprop_source_t srctype;
|
||||
zprop_list_t *pl;
|
||||
int vid;
|
||||
|
||||
if (cbp->cb_type == ZFS_TYPE_VDEV) {
|
||||
if (strcmp(cbp->cb_vdevs.cb_names[0], "all-vdevs") == 0) {
|
||||
for_each_vdev(zhp, get_callback_vdev_width_cb, data);
|
||||
for_each_vdev(zhp, get_callback_vdev_cb, data);
|
||||
} else {
|
||||
/* Adjust column widths for vdev properties */
|
||||
for (vid = 0; vid < cbp->cb_vdevs.cb_names_count;
|
||||
vid++) {
|
||||
vdev_expand_proplist(zhp,
|
||||
cbp->cb_vdevs.cb_names[vid],
|
||||
&cbp->cb_proplist);
|
||||
}
|
||||
/* Display the properties */
|
||||
for (vid = 0; vid < cbp->cb_vdevs.cb_names_count;
|
||||
vid++) {
|
||||
get_callback_vdev(zhp,
|
||||
cbp->cb_vdevs.cb_names[vid], data);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
assert(cbp->cb_type == ZFS_TYPE_POOL);
|
||||
for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
|
||||
/*
|
||||
* Skip the special fake placeholder. This will also
|
||||
* skip over the name property when 'all' is specified.
|
||||
*/
|
||||
if (pl->pl_prop == ZPOOL_PROP_NAME &&
|
||||
pl == cbp->cb_proplist)
|
||||
continue;
|
||||
|
||||
if (pl->pl_prop == ZPROP_INVAL &&
|
||||
(zpool_prop_feature(pl->pl_user_prop) ||
|
||||
zpool_prop_unsupported(pl->pl_user_prop))) {
|
||||
srctype = ZPROP_SRC_LOCAL;
|
||||
|
||||
if (zpool_prop_get_feature(zhp,
|
||||
pl->pl_user_prop, value,
|
||||
sizeof (value)) == 0) {
|
||||
zprop_print_one_property(
|
||||
zpool_get_name(zhp), cbp,
|
||||
pl->pl_user_prop, value, srctype,
|
||||
NULL, NULL);
|
||||
}
|
||||
} else {
|
||||
if (zpool_get_prop(zhp, pl->pl_prop, value,
|
||||
sizeof (value), &srctype,
|
||||
cbp->cb_literal) != 0)
|
||||
continue;
|
||||
|
||||
zprop_print_one_property(zpool_get_name(zhp),
|
||||
cbp, zpool_prop_to_name(pl->pl_prop),
|
||||
value, srctype, NULL, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -9936,6 +10076,7 @@ zpool_do_get(int argc, char **argv)
|
||||
int ret;
|
||||
int c, i;
|
||||
char *value;
|
||||
char *propstr = NULL;
|
||||
|
||||
cb.cb_first = B_TRUE;
|
||||
|
||||
@ -9948,6 +10089,8 @@ zpool_do_get(int argc, char **argv)
|
||||
cb.cb_columns[2] = GET_COL_VALUE;
|
||||
cb.cb_columns[3] = GET_COL_SOURCE;
|
||||
cb.cb_type = ZFS_TYPE_POOL;
|
||||
cb.cb_vdevs.cb_name_flags |= VDEV_NAME_TYPE_ID;
|
||||
current_prop_type = cb.cb_type;
|
||||
|
||||
/* check options */
|
||||
while ((c = getopt(argc, argv, ":Hpo:")) != -1) {
|
||||
@ -10025,13 +10168,52 @@ zpool_do_get(int argc, char **argv)
|
||||
usage(B_FALSE);
|
||||
}
|
||||
|
||||
if (zprop_get_list(g_zfs, argv[0], &cb.cb_proplist,
|
||||
ZFS_TYPE_POOL) != 0)
|
||||
usage(B_FALSE);
|
||||
/* Properties list is needed later by zprop_get_list() */
|
||||
propstr = argv[0];
|
||||
|
||||
argc--;
|
||||
argv++;
|
||||
|
||||
if (argc == 0) {
|
||||
/* No args, so just print the defaults. */
|
||||
} else if (are_all_pools(argc, argv)) {
|
||||
/* All the args are pool names */
|
||||
} else if (are_all_pools(1, argv)) {
|
||||
/* The first arg is a pool name */
|
||||
if ((argc == 2 && strcmp(argv[1], "all-vdevs") == 0) ||
|
||||
are_vdevs_in_pool(argc - 1, argv + 1, argv[0],
|
||||
&cb.cb_vdevs)) {
|
||||
/* ... and the rest are vdev names */
|
||||
cb.cb_vdevs.cb_names = argv + 1;
|
||||
cb.cb_vdevs.cb_names_count = argc - 1;
|
||||
cb.cb_type = ZFS_TYPE_VDEV;
|
||||
argc = 1; /* One pool to process */
|
||||
} else {
|
||||
fprintf(stderr, gettext("Expected a list of vdevs in"
|
||||
" \"%s\", but got:\n"), argv[0]);
|
||||
error_list_unresolved_vdevs(argc - 1, argv + 1,
|
||||
argv[0], &cb.cb_vdevs);
|
||||
fprintf(stderr, "\n");
|
||||
usage(B_FALSE);
|
||||
return (1);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* The first arg isn't a pool name,
|
||||
*/
|
||||
fprintf(stderr, gettext("missing pool name.\n"));
|
||||
fprintf(stderr, "\n");
|
||||
usage(B_FALSE);
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (zprop_get_list(g_zfs, propstr, &cb.cb_proplist,
|
||||
cb.cb_type) != 0) {
|
||||
/* Use correct list of valid properties (pool or vdev) */
|
||||
current_prop_type = cb.cb_type;
|
||||
usage(B_FALSE);
|
||||
}
|
||||
|
||||
if (cb.cb_proplist != NULL) {
|
||||
fake_name.pl_prop = ZPOOL_PROP_NAME;
|
||||
fake_name.pl_width = strlen(gettext("NAME"));
|
||||
@ -10039,8 +10221,8 @@ zpool_do_get(int argc, char **argv)
|
||||
cb.cb_proplist = &fake_name;
|
||||
}
|
||||
|
||||
ret = for_each_pool(argc, argv, B_TRUE, &cb.cb_proplist, cb.cb_literal,
|
||||
get_callback, &cb);
|
||||
ret = for_each_pool(argc, argv, B_TRUE, &cb.cb_proplist, cb.cb_type,
|
||||
cb.cb_literal, get_callback, &cb);
|
||||
|
||||
if (cb.cb_proplist == &fake_name)
|
||||
zprop_free_list(fake_name.pl_next);
|
||||
@ -10053,14 +10235,15 @@ zpool_do_get(int argc, char **argv)
|
||||
typedef struct set_cbdata {
|
||||
char *cb_propname;
|
||||
char *cb_value;
|
||||
zfs_type_t cb_type;
|
||||
vdev_cbdata_t cb_vdevs;
|
||||
boolean_t cb_any_successful;
|
||||
} set_cbdata_t;
|
||||
|
||||
static int
|
||||
set_callback(zpool_handle_t *zhp, void *data)
|
||||
set_pool_callback(zpool_handle_t *zhp, set_cbdata_t *cb)
|
||||
{
|
||||
int error;
|
||||
set_cbdata_t *cb = (set_cbdata_t *)data;
|
||||
|
||||
/* Check if we have out-of-bounds features */
|
||||
if (strcmp(cb->cb_propname, ZPOOL_CONFIG_COMPATIBILITY) == 0) {
|
||||
@ -10121,9 +10304,24 @@ set_callback(zpool_handle_t *zhp, void *data)
|
||||
|
||||
error = zpool_set_prop(zhp, cb->cb_propname, cb->cb_value);
|
||||
|
||||
if (!error)
|
||||
cb->cb_any_successful = B_TRUE;
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
set_callback(zpool_handle_t *zhp, void *data)
|
||||
{
|
||||
int error;
|
||||
set_cbdata_t *cb = (set_cbdata_t *)data;
|
||||
|
||||
if (cb->cb_type == ZFS_TYPE_VDEV) {
|
||||
error = zpool_set_vdev_prop(zhp, *cb->cb_vdevs.cb_names,
|
||||
cb->cb_propname, cb->cb_value);
|
||||
} else {
|
||||
assert(cb->cb_type == ZFS_TYPE_POOL);
|
||||
error = set_pool_callback(zhp, cb);
|
||||
}
|
||||
|
||||
cb->cb_any_successful = !error;
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -10133,6 +10331,7 @@ zpool_do_set(int argc, char **argv)
|
||||
set_cbdata_t cb = { 0 };
|
||||
int error;
|
||||
|
||||
current_prop_type = ZFS_TYPE_POOL;
|
||||
if (argc > 1 && argv[1][0] == '-') {
|
||||
(void) fprintf(stderr, gettext("invalid option '%c'\n"),
|
||||
argv[1][1]);
|
||||
@ -10150,12 +10349,14 @@ zpool_do_set(int argc, char **argv)
|
||||
usage(B_FALSE);
|
||||
}
|
||||
|
||||
if (argc > 3) {
|
||||
if (argc > 4) {
|
||||
(void) fprintf(stderr, gettext("too many pool names\n"));
|
||||
usage(B_FALSE);
|
||||
}
|
||||
|
||||
cb.cb_propname = argv[1];
|
||||
cb.cb_type = ZFS_TYPE_POOL;
|
||||
cb.cb_vdevs.cb_name_flags |= VDEV_NAME_TYPE_ID;
|
||||
cb.cb_value = strchr(cb.cb_propname, '=');
|
||||
if (cb.cb_value == NULL) {
|
||||
(void) fprintf(stderr, gettext("missing value in "
|
||||
@ -10165,9 +10366,33 @@ zpool_do_set(int argc, char **argv)
|
||||
|
||||
*(cb.cb_value) = '\0';
|
||||
cb.cb_value++;
|
||||
argc -= 2;
|
||||
argv += 2;
|
||||
|
||||
error = for_each_pool(argc - 2, argv + 2, B_TRUE, NULL, B_FALSE,
|
||||
set_callback, &cb);
|
||||
if (are_vdevs_in_pool(argc, argv, NULL, &cb.cb_vdevs)) {
|
||||
/* Argument is a vdev */
|
||||
cb.cb_vdevs.cb_names = argv;
|
||||
cb.cb_vdevs.cb_names_count = 1;
|
||||
cb.cb_type = ZFS_TYPE_VDEV;
|
||||
argc = 0; /* No pools to process */
|
||||
} else if (are_all_pools(1, argv)) {
|
||||
/* The first arg is a pool name */
|
||||
if (are_vdevs_in_pool(argc - 1, argv + 1, argv[0],
|
||||
&cb.cb_vdevs)) {
|
||||
/* 2nd argument is a vdev */
|
||||
cb.cb_vdevs.cb_names = argv + 1;
|
||||
cb.cb_vdevs.cb_names_count = 1;
|
||||
cb.cb_type = ZFS_TYPE_VDEV;
|
||||
argc = 1; /* One pool to process */
|
||||
} else if (argc > 1) {
|
||||
(void) fprintf(stderr,
|
||||
gettext("too many pool names\n"));
|
||||
usage(B_FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
error = for_each_pool(argc, argv, B_TRUE, NULL, ZFS_TYPE_POOL,
|
||||
B_FALSE, set_callback, &cb);
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ nvlist_t *split_mirror_vdev(zpool_handle_t *zhp, char *newname,
|
||||
/*
|
||||
* Pool list functions
|
||||
*/
|
||||
int for_each_pool(int, char **, boolean_t unavail, zprop_list_t **,
|
||||
int for_each_pool(int, char **, boolean_t unavail, zprop_list_t **, zfs_type_t,
|
||||
boolean_t, zpool_iter_f, void *);
|
||||
|
||||
/* Vdev list functions */
|
||||
@ -73,7 +73,8 @@ int for_each_vdev(zpool_handle_t *zhp, pool_vdev_iter_f func, void *data);
|
||||
|
||||
typedef struct zpool_list zpool_list_t;
|
||||
|
||||
zpool_list_t *pool_list_get(int, char **, zprop_list_t **, boolean_t, int *);
|
||||
zpool_list_t *pool_list_get(int, char **, zprop_list_t **, zfs_type_t,
|
||||
boolean_t, int *);
|
||||
void pool_list_update(zpool_list_t *);
|
||||
int pool_list_iter(zpool_list_t *, int unavail, zpool_iter_f, void *);
|
||||
void pool_list_free(zpool_list_t *);
|
||||
|
@ -1647,8 +1647,8 @@ construct_spec(nvlist_t *props, int argc, char **argv)
|
||||
}
|
||||
}
|
||||
verify(nvlist_add_nvlist_array(nv,
|
||||
ZPOOL_CONFIG_CHILDREN, child,
|
||||
children) == 0);
|
||||
ZPOOL_CONFIG_CHILDREN,
|
||||
(const nvlist_t **)child, children) == 0);
|
||||
|
||||
for (c = 0; c < children; c++)
|
||||
nvlist_free(child[c]);
|
||||
@ -1713,13 +1713,13 @@ construct_spec(nvlist_t *props, int argc, char **argv)
|
||||
verify(nvlist_add_string(nvroot, ZPOOL_CONFIG_TYPE,
|
||||
VDEV_TYPE_ROOT) == 0);
|
||||
verify(nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
|
||||
top, toplevels) == 0);
|
||||
(const nvlist_t **)top, toplevels) == 0);
|
||||
if (nspares != 0)
|
||||
verify(nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
|
||||
spares, nspares) == 0);
|
||||
(const nvlist_t **)spares, nspares) == 0);
|
||||
if (nl2cache != 0)
|
||||
verify(nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE,
|
||||
l2cache, nl2cache) == 0);
|
||||
(const nvlist_t **)l2cache, nl2cache) == 0);
|
||||
|
||||
spec_out:
|
||||
for (t = 0; t < toplevels; t++)
|
||||
|
@ -1287,7 +1287,8 @@ make_vdev_raid(char *path, char *aux, char *pool, size_t size,
|
||||
ztest_opts.zo_raid_type);
|
||||
fnvlist_add_uint64(raid, ZPOOL_CONFIG_NPARITY,
|
||||
ztest_opts.zo_raid_parity);
|
||||
fnvlist_add_nvlist_array(raid, ZPOOL_CONFIG_CHILDREN, child, r);
|
||||
fnvlist_add_nvlist_array(raid, ZPOOL_CONFIG_CHILDREN,
|
||||
(const nvlist_t **)child, r);
|
||||
|
||||
if (strcmp(ztest_opts.zo_raid_type, VDEV_TYPE_DRAID) == 0) {
|
||||
uint64_t ndata = ztest_opts.zo_draid_data;
|
||||
@ -1335,7 +1336,8 @@ make_vdev_mirror(char *path, char *aux, char *pool, size_t size,
|
||||
|
||||
mirror = fnvlist_alloc();
|
||||
fnvlist_add_string(mirror, ZPOOL_CONFIG_TYPE, VDEV_TYPE_MIRROR);
|
||||
fnvlist_add_nvlist_array(mirror, ZPOOL_CONFIG_CHILDREN, child, m);
|
||||
fnvlist_add_nvlist_array(mirror, ZPOOL_CONFIG_CHILDREN,
|
||||
(const nvlist_t **)child, m);
|
||||
|
||||
for (c = 0; c < m; c++)
|
||||
fnvlist_free(child[c]);
|
||||
@ -1374,7 +1376,7 @@ make_vdev_root(char *path, char *aux, char *pool, size_t size, uint64_t ashift,
|
||||
root = fnvlist_alloc();
|
||||
fnvlist_add_string(root, ZPOOL_CONFIG_TYPE, VDEV_TYPE_ROOT);
|
||||
fnvlist_add_nvlist_array(root, aux ? aux : ZPOOL_CONFIG_CHILDREN,
|
||||
child, t);
|
||||
(const nvlist_t **)child, t);
|
||||
|
||||
for (c = 0; c < t; c++)
|
||||
fnvlist_free(child[c]);
|
||||
@ -3550,8 +3552,8 @@ ztest_split_pool(ztest_ds_t *zd, uint64_t id)
|
||||
/* OK, create a config that can be used to split */
|
||||
split = fnvlist_alloc();
|
||||
fnvlist_add_string(split, ZPOOL_CONFIG_TYPE, VDEV_TYPE_ROOT);
|
||||
fnvlist_add_nvlist_array(split, ZPOOL_CONFIG_CHILDREN, schild,
|
||||
lastlogid != 0 ? lastlogid : schildren);
|
||||
fnvlist_add_nvlist_array(split, ZPOOL_CONFIG_CHILDREN,
|
||||
(const nvlist_t **)schild, lastlogid != 0 ? lastlogid : schildren);
|
||||
|
||||
config = fnvlist_alloc();
|
||||
fnvlist_add_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, split);
|
||||
|
@ -1,7 +1,7 @@
|
||||
.PHONY: shellcheck
|
||||
shellcheck: $(SCRIPTS) $(SHELLCHECKSCRIPTS)
|
||||
if HAVE_SHELLCHECK
|
||||
[ -z "$(SCRIPTS)$(SHELLCHECKSCRIPTS)" ] && exit; shellcheck $$([ -n "$(SHELLCHECK_SHELL)" ] && echo "--shell=$(SHELLCHECK_SHELL)") --exclude=SC1090,SC1091$(SHELLCHECK_IGNORE) --format=gcc $(SCRIPTS) $(SHELLCHECKSCRIPTS)
|
||||
[ -z "$(SCRIPTS)$(SHELLCHECKSCRIPTS)" ] && exit; shellcheck --format=gcc --exclude=SC1090,SC1091,SC2250 $$([ -n "$(SHELLCHECK_SHELL)" ] && echo "--shell=$(SHELLCHECK_SHELL)") $(SHELLCHECK_OPTS) $(SCRIPTS) $(SHELLCHECKSCRIPTS)
|
||||
else
|
||||
@[ -z "$(SCRIPTS)$(SHELLCHECKSCRIPTS)" ] && exit; echo "skipping shellcheck of" $(SCRIPTS) $(SHELLCHECKSCRIPTS) "because shellcheck is not installed"
|
||||
endif
|
||||
|
@ -191,6 +191,24 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_SET_DEV], [
|
||||
], [], [ZFS_META_LICENSE])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # Linux 5.16 API
|
||||
dnl #
|
||||
dnl # bio_set_dev is no longer a helper macro and is now an inline function,
|
||||
dnl # meaning that the function it calls internally can no longer be overridden
|
||||
dnl # by our code
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_SET_DEV_MACRO], [
|
||||
ZFS_LINUX_TEST_SRC([bio_set_dev_macro], [
|
||||
#include <linux/bio.h>
|
||||
#include <linux/fs.h>
|
||||
],[
|
||||
#ifndef bio_set_dev
|
||||
#error Not a macro
|
||||
#endif
|
||||
], [], [ZFS_META_LICENSE])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
|
||||
AC_MSG_CHECKING([whether bio_set_dev() is available])
|
||||
ZFS_LINUX_TEST_RESULT([bio_set_dev], [
|
||||
@ -205,6 +223,15 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
|
||||
AC_DEFINE(HAVE_BIO_SET_DEV_GPL_ONLY, 1,
|
||||
[bio_set_dev() GPL-only])
|
||||
])
|
||||
|
||||
AC_MSG_CHECKING([whether bio_set_dev() is a macro])
|
||||
ZFS_LINUX_TEST_RESULT([bio_set_dev_macro], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_BIO_SET_DEV_MACRO, 1,
|
||||
[bio_set_dev() is a macro])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
@ -395,6 +422,58 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO_BDEV_DISK], [
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # Linux 5.16 API
|
||||
dnl #
|
||||
dnl # The Linux 5.16 API for submit_bio changed the return type to be
|
||||
dnl # void instead of int
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_BDEV_SUBMIT_BIO_RETURNS_VOID], [
|
||||
ZFS_LINUX_TEST_SRC([bio_bdev_submit_bio_void], [
|
||||
#include <linux/blkdev.h>
|
||||
],[
|
||||
struct block_device_operations *bdev = NULL;
|
||||
__attribute__((unused)) void(*f)(struct bio *) = bdev->submit_bio;
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BDEV_SUBMIT_BIO_RETURNS_VOID], [
|
||||
AC_MSG_CHECKING(
|
||||
[whether block_device_operations->submit_bio() returns void])
|
||||
ZFS_LINUX_TEST_RESULT([bio_bdev_submit_bio_void], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_BDEV_SUBMIT_BIO_RETURNS_VOID, 1,
|
||||
[block_device_operations->submit_bio() returns void])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # Linux 5.16 API
|
||||
dnl #
|
||||
dnl # The Linux 5.16 API moved struct blkcg_gq into linux/blk-cgroup.h, which
|
||||
dnl # has been around since 2015. This test looks for the presence of that
|
||||
dnl # header, so that it can be conditionally included where it exists, but
|
||||
dnl # still be backward compatible with kernels that pre-date its introduction.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_CGROUP_HEADER], [
|
||||
ZFS_LINUX_TEST_SRC([blk_cgroup_header], [
|
||||
#include <linux/blk-cgroup.h>
|
||||
], [])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLK_CGROUP_HEADER], [
|
||||
AC_MSG_CHECKING([for existence of linux/blk-cgroup.h])
|
||||
ZFS_LINUX_TEST_RESULT([blk_cgroup_header],[
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_LINUX_BLK_CGROUP_HEADER, 1,
|
||||
[linux/blk-cgroup.h exists])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO], [
|
||||
ZFS_AC_KERNEL_SRC_REQ
|
||||
ZFS_AC_KERNEL_SRC_BIO_OPS
|
||||
@ -406,6 +485,9 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO], [
|
||||
ZFS_AC_KERNEL_SRC_BIO_CURRENT_BIO_LIST
|
||||
ZFS_AC_KERNEL_SRC_BLKG_TRYGET
|
||||
ZFS_AC_KERNEL_SRC_BIO_BDEV_DISK
|
||||
ZFS_AC_KERNEL_SRC_BDEV_SUBMIT_BIO_RETURNS_VOID
|
||||
ZFS_AC_KERNEL_SRC_BIO_SET_DEV_MACRO
|
||||
ZFS_AC_KERNEL_SRC_BLK_CGROUP_HEADER
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BIO], [
|
||||
@ -428,4 +510,6 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO], [
|
||||
ZFS_AC_KERNEL_BIO_CURRENT_BIO_LIST
|
||||
ZFS_AC_KERNEL_BLKG_TRYGET
|
||||
ZFS_AC_KERNEL_BIO_BDEV_DISK
|
||||
ZFS_AC_KERNEL_BDEV_SUBMIT_BIO_RETURNS_VOID
|
||||
ZFS_AC_KERNEL_BLK_CGROUP_HEADER
|
||||
])
|
||||
|
@ -294,6 +294,27 @@ AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BDEV_WHOLE], [
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # 5.13 API change
|
||||
dnl # blkdev_get_by_path() no longer handles ERESTARTSYS
|
||||
dnl #
|
||||
dnl # Unfortunately we're forced to rely solely on the kernel version
|
||||
dnl # number in order to determine the expected behavior. This was an
|
||||
dnl # internal change to blkdev_get_by_dev(), see commit a8ed1a0607.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_GET_ERESTARTSYS], [
|
||||
AC_MSG_CHECKING([whether blkdev_get_by_path() handles ERESTARTSYS])
|
||||
AS_VERSION_COMPARE([$LINUX_VERSION], [5.13.0], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_BLKDEV_GET_ERESTARTSYS, 1,
|
||||
[blkdev_get_by_path() handles ERESTARTSYS])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV], [
|
||||
ZFS_AC_KERNEL_SRC_BLKDEV_GET_BY_PATH
|
||||
ZFS_AC_KERNEL_SRC_BLKDEV_PUT
|
||||
@ -318,4 +339,5 @@ AC_DEFUN([ZFS_AC_KERNEL_BLKDEV], [
|
||||
ZFS_AC_KERNEL_BLKDEV_CHECK_DISK_CHANGE
|
||||
ZFS_AC_KERNEL_BLKDEV_BDEV_CHECK_MEDIA_CHANGE
|
||||
ZFS_AC_KERNEL_BLKDEV_BDEV_WHOLE
|
||||
ZFS_AC_KERNEL_BLKDEV_GET_ERESTARTSYS
|
||||
])
|
||||
|
@ -2,6 +2,9 @@ dnl #
|
||||
dnl # Handle differences in kernel FPU code.
|
||||
dnl #
|
||||
dnl # Kernel
|
||||
dnl # 5.16: XCR code put into asm/fpu/xcr.h
|
||||
dnl # HAVE_KERNEL_FPU_XCR_HEADER
|
||||
dnl #
|
||||
dnl # 5.0: Wrappers have been introduced to save/restore the FPU state.
|
||||
dnl # This change was made to the 4.19.38 and 4.14.120 LTS kernels.
|
||||
dnl # HAVE_KERNEL_FPU_INTERNAL
|
||||
@ -25,6 +28,18 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU_HEADER], [
|
||||
AC_DEFINE(HAVE_KERNEL_FPU_API_HEADER, 1,
|
||||
[kernel has asm/fpu/api.h])
|
||||
AC_MSG_RESULT(asm/fpu/api.h)
|
||||
AC_MSG_CHECKING([whether fpu/xcr header is available])
|
||||
ZFS_LINUX_TRY_COMPILE([
|
||||
#include <linux/module.h>
|
||||
#include <asm/fpu/xcr.h>
|
||||
],[
|
||||
],[
|
||||
AC_DEFINE(HAVE_KERNEL_FPU_XCR_HEADER, 1,
|
||||
[kernel has asm/fpu/xcr.h])
|
||||
AC_MSG_RESULT(asm/fpu/xcr.h)
|
||||
],[
|
||||
AC_MSG_RESULT(no asm/fpu/xcr.h)
|
||||
])
|
||||
],[
|
||||
AC_MSG_RESULT(i387.h & xcr.h)
|
||||
])
|
||||
|
26
sys/contrib/openzfs/config/kernel-pagemap-folio_wait_bit.m4
Normal file
26
sys/contrib/openzfs/config/kernel-pagemap-folio_wait_bit.m4
Normal file
@ -0,0 +1,26 @@
|
||||
dnl #
|
||||
dnl # Linux 5.16 no longer allows directly calling wait_on_page_bit, and
|
||||
dnl # instead requires you to call folio-specific functions. In this case,
|
||||
dnl # wait_on_page_bit(pg, PG_writeback) becomes
|
||||
dnl # folio_wait_bit(pg, PG_writeback)
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT], [
|
||||
ZFS_LINUX_TEST_SRC([pagemap_has_folio_wait_bit], [
|
||||
#include <linux/pagemap.h>
|
||||
],[
|
||||
static struct folio *f = NULL;
|
||||
|
||||
folio_wait_bit(f, PG_writeback);
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT], [
|
||||
AC_MSG_CHECKING([folio_wait_bit() exists])
|
||||
ZFS_LINUX_TEST_RESULT([pagemap_has_folio_wait_bit], [
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE(HAVE_PAGEMAP_FOLIO_WAIT_BIT, 1,
|
||||
[folio_wait_bit() exists])
|
||||
],[
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
])
|
@ -74,6 +74,14 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_IOV_ITER], [
|
||||
|
||||
bytes = copy_from_iter((void *)&buf, size, &iter);
|
||||
])
|
||||
|
||||
ZFS_LINUX_TEST_SRC([iov_iter_type], [
|
||||
#include <linux/fs.h>
|
||||
#include <linux/uio.h>
|
||||
],[
|
||||
struct iov_iter iter = { 0 };
|
||||
__attribute__((unused)) enum iter_type i = iov_iter_type(&iter);
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_VFS_IOV_ITER], [
|
||||
@ -149,6 +157,20 @@ AC_DEFUN([ZFS_AC_KERNEL_VFS_IOV_ITER], [
|
||||
enable_vfs_iov_iter="no"
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # This checks for iov_iter_type() in linux/uio.h. It is not
|
||||
dnl # required, however, and the module will compiled without it
|
||||
dnl # using direct access of the member attribute
|
||||
dnl #
|
||||
AC_MSG_CHECKING([whether iov_iter_type() is available])
|
||||
ZFS_LINUX_TEST_RESULT([iov_iter_type], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_IOV_ITER_TYPE, 1,
|
||||
[iov_iter_type() is available])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # As of the 4.9 kernel support is provided for iovecs, kvecs,
|
||||
dnl # bvecs and pipes in the iov_iter structure. As long as the
|
||||
|
@ -134,6 +134,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
||||
ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE
|
||||
ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||
ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG
|
||||
ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT
|
||||
|
||||
AC_MSG_CHECKING([for available kernel interfaces])
|
||||
ZFS_LINUX_TEST_COMPILE_ALL([kabi])
|
||||
@ -241,6 +242,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
||||
ZFS_AC_KERNEL_SET_SPECIAL_STATE
|
||||
ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||
ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG
|
||||
ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT
|
||||
])
|
||||
|
||||
dnl #
|
||||
|
@ -10,3 +10,4 @@ endif
|
||||
DIST_SUBDIRS = bash_completion.d bpftrace dracut initramfs pam_zfs_key pyzfs zcp
|
||||
|
||||
SHELLCHECKDIRS = bash_completion.d bpftrace dracut initramfs
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
@ -10,4 +10,4 @@ SUBSTFILES += $(noinst_DATA)
|
||||
|
||||
SHELLCHECKSCRIPTS = $(noinst_DATA)
|
||||
SHELLCHECK_SHELL = bash
|
||||
SHELLCHECK_IGNORE = ,SC2207
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
@ -69,7 +69,7 @@ __zfs_match_snapshot()
|
||||
else
|
||||
if [ "$cur" != "" ] && __zfs_list_datasets "$cur" &> /dev/null
|
||||
then
|
||||
$__ZFS_CMD list -H -o name -s name -t filesystem -r "$cur" | tail -n +2
|
||||
$__ZFS_CMD list -H -o name -s name -t filesystem,volume -r "$cur" | tail -n +2
|
||||
# We output the base dataset name even though we might be
|
||||
# completing a command that can only take a snapshot, because it
|
||||
# prevents bash from considering the completion finished when it
|
||||
@ -185,9 +185,9 @@ __zfs_complete_ordered_arguments()
|
||||
# shellcheck disable=SC2086
|
||||
if __zfs_argument_chosen $list1
|
||||
then
|
||||
COMPREPLY=($(compgen -W "$list2 $extra" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$list2 $extra" -- "$cur")
|
||||
else
|
||||
COMPREPLY=($(compgen -W "$list1 $extra" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$list1 $extra" -- "$cur")
|
||||
fi
|
||||
}
|
||||
|
||||
@ -197,9 +197,9 @@ __zfs_complete_multiple_options()
|
||||
local cur=$2
|
||||
local existing_opts
|
||||
|
||||
COMPREPLY=($(compgen -W "$options" -- "${cur##*,}"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$options" -- "${cur##*,}")
|
||||
existing_opts=$(expr "$cur" : '\(.*,\)')
|
||||
if [[ $existing_opts ]]
|
||||
if [ -n "$existing_opts" ]
|
||||
then
|
||||
COMPREPLY=( "${COMPREPLY[@]/#/${existing_opts}}" )
|
||||
fi
|
||||
@ -210,7 +210,7 @@ __zfs_complete_switch()
|
||||
local options=$1
|
||||
if [[ ${cur:0:1} == - ]]
|
||||
then
|
||||
COMPREPLY=($(compgen -W "-{$options}" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "-{$options}" -- "$cur")
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
@ -244,7 +244,7 @@ __zfs_complete()
|
||||
if [[ ${prev##*/} == zfs ]]
|
||||
then
|
||||
cmds=$(__zfs_get_commands)
|
||||
COMPREPLY=($(compgen -W "$cmds -?" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$cmds -?" -- "$cur")
|
||||
return 0
|
||||
fi
|
||||
|
||||
@ -252,15 +252,15 @@ __zfs_complete()
|
||||
bookmark)
|
||||
if __zfs_argument_chosen
|
||||
then
|
||||
COMPREPLY=($(compgen -W "${prev%@*}# ${prev/@/#}" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "${prev%@*}# ${prev/@/#}" -- "$cur")
|
||||
else
|
||||
COMPREPLY=($(compgen -W "$(__zfs_match_snapshot)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_match_snapshot)" -- "$cur")
|
||||
fi
|
||||
;;
|
||||
clone)
|
||||
case "${prev}" in
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "$(__zfs_get_editable_properties)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_get_editable_properties)" -- "$cur")
|
||||
__zfs_complete_nospace
|
||||
;;
|
||||
*)
|
||||
@ -268,9 +268,9 @@ __zfs_complete()
|
||||
then
|
||||
if __zfs_argument_chosen
|
||||
then
|
||||
COMPREPLY=($(compgen -W "$(__zfs_list_datasets)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_list_datasets)" -- "$cur")
|
||||
else
|
||||
COMPREPLY=($(compgen -W "$(__zfs_match_snapshot)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_match_snapshot)" -- "$cur")
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
@ -279,7 +279,7 @@ __zfs_complete()
|
||||
get)
|
||||
case "${prev}" in
|
||||
-d)
|
||||
COMPREPLY=($(compgen -W "" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "" -- "$cur")
|
||||
;;
|
||||
-t)
|
||||
__zfs_complete_multiple_options "filesystem volume snapshot bookmark all" "$cur"
|
||||
@ -296,7 +296,7 @@ __zfs_complete()
|
||||
# shellcheck disable=SC2046
|
||||
if __zfs_argument_chosen $(__zfs_get_properties)
|
||||
then
|
||||
COMPREPLY=($(compgen -W "$(__zfs_match_snapshot)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_match_snapshot)" -- "$cur")
|
||||
else
|
||||
__zfs_complete_multiple_options "$(__zfs_get_properties)" "$cur"
|
||||
fi
|
||||
@ -313,7 +313,7 @@ __zfs_complete()
|
||||
list)
|
||||
case "${prev}" in
|
||||
-d)
|
||||
COMPREPLY=($(compgen -W "" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "" -- "$cur")
|
||||
;;
|
||||
-t)
|
||||
__zfs_complete_multiple_options "filesystem volume snapshot bookmark all" "$cur"
|
||||
@ -322,23 +322,23 @@ __zfs_complete()
|
||||
__zfs_complete_multiple_options "$(__zfs_get_properties)" "$cur"
|
||||
;;
|
||||
-s|-S)
|
||||
COMPREPLY=($(compgen -W "$(__zfs_get_properties)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_get_properties)" -- "$cur")
|
||||
;;
|
||||
*)
|
||||
if ! __zfs_complete_switch "H,r,d,o,t,s,S"
|
||||
then
|
||||
COMPREPLY=($(compgen -W "$(__zfs_match_snapshot)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_match_snapshot)" -- "$cur")
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
promote)
|
||||
COMPREPLY=($(compgen -W "$(__zfs_list_filesystems)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_list_filesystems)" -- "$cur")
|
||||
;;
|
||||
rollback)
|
||||
if ! __zfs_complete_switch "r,R,f"
|
||||
then
|
||||
COMPREPLY=($(compgen -W "$(__zfs_match_snapshot)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_match_snapshot)" -- "$cur")
|
||||
fi
|
||||
;;
|
||||
send)
|
||||
@ -346,13 +346,13 @@ __zfs_complete()
|
||||
then
|
||||
if __zfs_argument_chosen
|
||||
then
|
||||
COMPREPLY=($(compgen -W "$(__zfs_match_snapshot)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_match_snapshot)" -- "$cur")
|
||||
else
|
||||
if [[ $prev == -*i* ]]
|
||||
then
|
||||
COMPREPLY=($(compgen -W "$(__zfs_match_snapshot_or_bookmark)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_match_snapshot_or_bookmark)" -- "$cur")
|
||||
else
|
||||
COMPREPLY=($(compgen -W "$(__zfs_match_snapshot)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_match_snapshot)" -- "$cur")
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@ -360,13 +360,13 @@ __zfs_complete()
|
||||
snapshot)
|
||||
case "${prev}" in
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "$(__zfs_get_editable_properties)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_get_editable_properties)" -- "$cur")
|
||||
__zfs_complete_nospace
|
||||
;;
|
||||
*)
|
||||
if ! __zfs_complete_switch "o,r"
|
||||
then
|
||||
COMPREPLY=($(compgen -W "$(__zfs_match_snapshot)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_match_snapshot)" -- "$cur")
|
||||
__zfs_complete_nospace
|
||||
fi
|
||||
;;
|
||||
@ -379,12 +379,12 @@ __zfs_complete()
|
||||
upgrade)
|
||||
case "${prev}" in
|
||||
-a|-V|-v)
|
||||
COMPREPLY=($(compgen -W "" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "" -- "$cur")
|
||||
;;
|
||||
*)
|
||||
if ! __zfs_complete_switch "a,V,v,r"
|
||||
then
|
||||
COMPREPLY=($(compgen -W "$(__zfs_list_filesystems)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_list_filesystems)" -- "$cur")
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
@ -397,7 +397,7 @@ __zfs_complete()
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
COMPREPLY=($(compgen -W "$(__zfs_match_snapshot)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zfs_match_snapshot)" -- "$cur")
|
||||
;;
|
||||
esac
|
||||
if type __ltrim_colon_completions &> /dev/null
|
||||
@ -438,7 +438,7 @@ __zpool_complete()
|
||||
if [[ ${prev##*/} == zpool ]]
|
||||
then
|
||||
cmds=$(__zpool_get_commands)
|
||||
COMPREPLY=($(compgen -W "$cmds" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$cmds" -- "$cur")
|
||||
return 0
|
||||
fi
|
||||
|
||||
@ -452,7 +452,7 @@ __zpool_complete()
|
||||
then
|
||||
_filedir -d
|
||||
else
|
||||
COMPREPLY=($(compgen -W "$(__zpool_list_pools) -d" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zpool_list_pools) -d" -- "$cur")
|
||||
fi
|
||||
return 0
|
||||
;;
|
||||
@ -468,12 +468,12 @@ __zpool_complete()
|
||||
then
|
||||
_filedir
|
||||
else
|
||||
COMPREPLY=($(compgen -W "$pools" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$pools" -- "$cur")
|
||||
fi
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
COMPREPLY=($(compgen -W "$(__zpool_list_pools)" -- "$cur"))
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(__zpool_list_pools)" -- "$cur")
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
|
@ -5,3 +5,4 @@ EXTRA_DIST = \
|
||||
zfs-trace.sh
|
||||
|
||||
SHELLCHECKSCRIPTS = zfs-trace.sh
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
@ -5,4 +5,5 @@ pkgdracutdir = $(dracutdir)/modules.d/02zfsexpandknowledge
|
||||
pkgdracut_SCRIPTS = \
|
||||
module-setup.sh
|
||||
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
SUBSTFILES += $(pkgdracut_SCRIPTS)
|
||||
|
@ -19,6 +19,7 @@ pkgdracut_DATA = \
|
||||
zfs-rollback-bootfs.service
|
||||
|
||||
SUBSTFILES += $(pkgdracut_SCRIPTS) $(pkgdracut_DATA)
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
||||
# Provided by /bin/sleep, and, again, every implementation of that supports this
|
||||
CHECKBASHISMS_IGNORE = -e 'sleep only takes one integer' -e 'sleep 0.'
|
||||
|
@ -20,7 +20,7 @@ _do_zpool_export() {
|
||||
zpool list 2>&1 | vinfo
|
||||
fi
|
||||
|
||||
return ${ret}
|
||||
return "${ret}"
|
||||
}
|
||||
|
||||
if command -v zpool >/dev/null; then
|
||||
|
@ -2,4 +2,5 @@
|
||||
|
||||
. /lib/dracut-zfs-lib.sh
|
||||
|
||||
# shellcheck disable=SC2154
|
||||
echo ZPOOL_IMPORT_OPTS="$ZPOOL_IMPORT_OPTS"
|
||||
|
@ -61,9 +61,9 @@ install() {
|
||||
dracut_install /usr/lib*/gcc/**/libgcc_s.so*
|
||||
fi
|
||||
# shellcheck disable=SC2050
|
||||
if [ @LIBFETCH_DYNAMIC@ != 0 ]; then
|
||||
if [ "@LIBFETCH_DYNAMIC@" != 0 ]; then
|
||||
for d in $libdirs; do
|
||||
[ -e "$d/"@LIBFETCH_SONAME@ ] && dracut_install "$d/"@LIBFETCH_SONAME@
|
||||
[ -e "$d/@LIBFETCH_SONAME@" ] && dracut_install "$d/@LIBFETCH_SONAME@"
|
||||
done
|
||||
fi
|
||||
dracut_install @mounthelperdir@/mount.zfs
|
||||
@ -107,7 +107,7 @@ install() {
|
||||
for _service in "zfs-import-scan.service" "zfs-import-cache.service" ; do
|
||||
dracut_install "@systemdunitdir@/$_service"
|
||||
if ! [ -L "${initdir}/$systemdsystemunitdir/zfs-import.target.wants/$_service" ]; then
|
||||
ln -sf ../$_service "${initdir}/$systemdsystemunitdir/zfs-import.target.wants/$_service"
|
||||
ln -sf "../$_service" "${initdir}/$systemdsystemunitdir/zfs-import.target.wants/$_service"
|
||||
type mark_hostonly >/dev/null 2>&1 && mark_hostonly "@systemdunitdir@/$_service"
|
||||
fi
|
||||
done
|
||||
|
@ -49,11 +49,14 @@ case "${root}" in
|
||||
|
||||
info "ZFS: Set ${root} as bootfs."
|
||||
;;
|
||||
|
||||
*)
|
||||
info "ZFS: no ZFS-on-root"
|
||||
esac
|
||||
|
||||
# Make sure Dracut is happy that we have a root and will wait for ZFS
|
||||
# modules to settle before mounting.
|
||||
if [ ${wait_for_zfs} -eq 1 ]; then
|
||||
if [ "${wait_for_zfs}" -eq 1 ]; then
|
||||
ln -s /dev/null /dev/root 2>/dev/null
|
||||
initqueuedir="${hookdir}/initqueue/finished"
|
||||
test -d "${initqueuedir}" || {
|
||||
|
@ -70,6 +70,7 @@ import_pool() {
|
||||
}
|
||||
|
||||
_mount_dataset_cb() {
|
||||
# shellcheck disable=SC2154
|
||||
mount -o zfsutil -t zfs "${1}" "${NEWROOT}${2}"
|
||||
}
|
||||
|
||||
@ -91,7 +92,7 @@ mount_dataset() {
|
||||
fi
|
||||
fi
|
||||
|
||||
return ${ret}
|
||||
return "${ret}"
|
||||
}
|
||||
|
||||
# for_relevant_root_children DATASET EXEC
|
||||
@ -117,7 +118,7 @@ for_relevant_root_children() {
|
||||
;;
|
||||
esac
|
||||
done
|
||||
exit ${_ret}
|
||||
exit "${_ret}"
|
||||
)
|
||||
}
|
||||
|
||||
@ -134,7 +135,7 @@ export_all() {
|
||||
done
|
||||
IFS="${OLDIFS}"
|
||||
|
||||
return ${ret}
|
||||
return "${ret}"
|
||||
}
|
||||
|
||||
# ask_for_password
|
||||
@ -171,6 +172,7 @@ ask_for_password() {
|
||||
--ply-tries) ply_tries="$2"; shift;;
|
||||
--tty-tries) tty_tries="$2"; shift;;
|
||||
--tty-echo-off) tty_echo_off=yes;;
|
||||
*) echo "ask_for_password(): wrong opt '$1'" >&2;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
@ -202,6 +204,6 @@ ask_for_password() {
|
||||
fi
|
||||
} 9>/.console_lock
|
||||
|
||||
[ $ret -ne 0 ] && echo "Wrong password" >&2
|
||||
return $ret
|
||||
[ "$ret" -ne 0 ] && echo "Wrong password" >&2
|
||||
return "$ret"
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ dist_initrd_SCRIPTS = \
|
||||
|
||||
SUBDIRS = conf.d conf-hooks.d hooks scripts
|
||||
SHELLCHECKDIRS = hooks scripts
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
||||
EXTRA_DIST = \
|
||||
README.initramfs.markdown
|
||||
|
@ -7,4 +7,5 @@ hooks_SCRIPTS = \
|
||||
zfs \
|
||||
zfsunlock
|
||||
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
SUBSTFILES += $(hooks_SCRIPTS)
|
||||
|
@ -30,8 +30,8 @@ find /lib/ -type f -name "libgcc_s.so.[1-9]" | while read -r libgcc; do
|
||||
done
|
||||
|
||||
# shellcheck disable=SC2050
|
||||
if [ @LIBFETCH_DYNAMIC@ != 0 ]; then
|
||||
find /lib/ -name @LIBFETCH_SONAME@ | while read -r libfetch; do
|
||||
if [ "@LIBFETCH_DYNAMIC@" != 0 ]; then
|
||||
find /lib/ -name "@LIBFETCH_SONAME@" | while read -r libfetch; do
|
||||
copy_exec "$libfetch"
|
||||
done
|
||||
fi
|
||||
|
@ -9,3 +9,4 @@ SUBDIRS = local-top
|
||||
|
||||
SHELLCHECKDIRS = $(SUBDIRS)
|
||||
SHELLCHECK_SHELL = sh
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
@ -4,3 +4,5 @@ localtopdir = /usr/share/initramfs-tools/scripts/local-top
|
||||
|
||||
dist_localtop_SCRIPTS = \
|
||||
zfs
|
||||
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
@ -596,7 +596,7 @@ setup_snapshot_booting()
|
||||
retval=0
|
||||
|
||||
# Make sure that the snapshot specified actually exists.
|
||||
if [ ! "$(get_fs_value "${snap}" type)" ]
|
||||
if [ -z "$(get_fs_value "${snap}" type)" ]
|
||||
then
|
||||
# Snapshot does not exist (...@<null> ?)
|
||||
# ask the user for a snapshot to use.
|
||||
@ -613,7 +613,8 @@ setup_snapshot_booting()
|
||||
then
|
||||
# If the destination dataset for the clone
|
||||
# already exists, destroy it. Recursively
|
||||
if [ "$(get_fs_value "${rootfs}_${snapname}" type)" ]; then
|
||||
if [ -n "$(get_fs_value "${rootfs}_${snapname}" type)" ]
|
||||
then
|
||||
filesystems=$("${ZFS}" list -oname -tfilesystem -H \
|
||||
-r -Sname "${ZFS_BOOTFS}")
|
||||
for fs in $filesystems; do
|
||||
@ -848,7 +849,7 @@ mountroot()
|
||||
done
|
||||
IFS="$OLD_IFS"
|
||||
|
||||
[ "$quiet" != "y" ] && zfs_log_end_msg $ZFS_ERROR
|
||||
[ "$quiet" != "y" ] && zfs_log_end_msg "$ZFS_ERROR"
|
||||
else
|
||||
# No auto - use value from the command line option.
|
||||
|
||||
|
@ -99,6 +99,7 @@ def enum(*sequential, **named):
|
||||
'ZFS_ERR_RESILVER_IN_PROGRESS',
|
||||
'ZFS_ERR_REBUILD_IN_PROGRESS',
|
||||
'ZFS_ERR_BADPROP',
|
||||
'ZFS_ERR_VDEV_NOTSUP',
|
||||
],
|
||||
{}
|
||||
)
|
||||
@ -110,5 +111,6 @@ def enum(*sequential, **named):
|
||||
ZFS_ERR_DEVRM_IN_PROGRESS = zfs_errno.ZFS_ERR_DEVRM_IN_PROGRESS
|
||||
ZFS_ERR_VDEV_TOO_BIG = zfs_errno.ZFS_ERR_VDEV_TOO_BIG
|
||||
ZFS_ERR_WRONG_PARENT = zfs_errno.ZFS_ERR_WRONG_PARENT
|
||||
ZFS_ERR_VDEV_NOTSUP = zfs_errno.ZFS_ERR_VDEV_NOTSUP
|
||||
|
||||
# vim: softtabstop=4 tabstop=4 expandtab shiftwidth=4
|
||||
|
@ -79,20 +79,30 @@
|
||||
int nvlist_add_uint64(nvlist_t *, const char *, uint64_t);
|
||||
int nvlist_add_string(nvlist_t *, const char *, const char *);
|
||||
int nvlist_add_nvlist(nvlist_t *, const char *, nvlist_t *);
|
||||
int nvlist_add_boolean_array(nvlist_t *, const char *, boolean_t *,
|
||||
uint_t);
|
||||
int nvlist_add_byte_array(nvlist_t *, const char *, uchar_t *, uint_t);
|
||||
int nvlist_add_int8_array(nvlist_t *, const char *, int8_t *, uint_t);
|
||||
int nvlist_add_uint8_array(nvlist_t *, const char *, uint8_t *, uint_t);
|
||||
int nvlist_add_int16_array(nvlist_t *, const char *, int16_t *, uint_t);
|
||||
int nvlist_add_uint16_array(nvlist_t *, const char *, uint16_t *, uint_t);
|
||||
int nvlist_add_int32_array(nvlist_t *, const char *, int32_t *, uint_t);
|
||||
int nvlist_add_uint32_array(nvlist_t *, const char *, uint32_t *, uint_t);
|
||||
int nvlist_add_int64_array(nvlist_t *, const char *, int64_t *, uint_t);
|
||||
int nvlist_add_uint64_array(nvlist_t *, const char *, uint64_t *, uint_t);
|
||||
int nvlist_add_string_array(nvlist_t *, const char *, char *const *,
|
||||
uint_t);
|
||||
int nvlist_add_nvlist_array(nvlist_t *, const char *, nvlist_t **, uint_t);
|
||||
int nvlist_add_boolean_array(nvlist_t *, const char *,
|
||||
const boolean_t *, uint_t);
|
||||
int nvlist_add_byte_array(nvlist_t *, const char *,
|
||||
const uchar_t *, uint_t);
|
||||
int nvlist_add_int8_array(nvlist_t *, const char *,
|
||||
const int8_t *, uint_t);
|
||||
int nvlist_add_uint8_array(nvlist_t *, const char *,
|
||||
const uint8_t *, uint_t);
|
||||
int nvlist_add_int16_array(nvlist_t *, const char *,
|
||||
const int16_t *, uint_t);
|
||||
int nvlist_add_uint16_array(nvlist_t *, const char *,
|
||||
const uint16_t *, uint_t);
|
||||
int nvlist_add_int32_array(nvlist_t *, const char *,
|
||||
const int32_t *, uint_t);
|
||||
int nvlist_add_uint32_array(nvlist_t *, const char *,
|
||||
const uint32_t *, uint_t);
|
||||
int nvlist_add_int64_array(nvlist_t *, const char *,
|
||||
const int64_t *, uint_t);
|
||||
int nvlist_add_uint64_array(nvlist_t *, const char *,
|
||||
const uint64_t *, uint_t);
|
||||
int nvlist_add_string_array(nvlist_t *, const char *,
|
||||
const char * const *, uint_t);
|
||||
int nvlist_add_nvlist_array(nvlist_t *, const char *,
|
||||
const nvlist_t * const *, uint_t);
|
||||
|
||||
nvpair_t *nvlist_next_nvpair(nvlist_t *, nvpair_t *);
|
||||
nvpair_t *nvlist_prev_nvpair(nvlist_t *, nvpair_t *);
|
||||
|
@ -6,4 +6,3 @@ initconf_SCRIPTS = zfs
|
||||
SUBSTFILES += $(initconf_SCRIPTS)
|
||||
|
||||
SHELLCHECK_SHELL = sh
|
||||
SHELLCHECK_IGNORE = ,SC2034
|
||||
|
@ -1,4 +1,4 @@
|
||||
# ZoL userland configuration.
|
||||
# OpenZFS userland configuration.
|
||||
|
||||
# NOTE: This file is intended for sysv init and initramfs.
|
||||
# Changing some of these settings may not make any difference on
|
||||
@ -8,6 +8,13 @@
|
||||
|
||||
# To enable a boolean setting, set it to yes, on, true, or 1.
|
||||
# Anything else will be interpreted as unset.
|
||||
# shellcheck disable=SC2034
|
||||
|
||||
# Run `zfs load-key` during system start?
|
||||
ZFS_LOAD_KEY='yes'
|
||||
|
||||
# Run `zfs unload-key` during system stop?
|
||||
ZFS_UNLOAD_KEY='no'
|
||||
|
||||
# Run `zfs mount -a` during system start?
|
||||
ZFS_MOUNT='yes'
|
||||
|
1
sys/contrib/openzfs/etc/init.d/.gitignore
vendored
1
sys/contrib/openzfs/etc/init.d/.gitignore
vendored
@ -1,4 +1,5 @@
|
||||
zfs-import
|
||||
zfs-load-key
|
||||
zfs-mount
|
||||
zfs-share
|
||||
zfs-zed
|
||||
|
@ -3,7 +3,7 @@ include $(top_srcdir)/config/Shellcheck.am
|
||||
|
||||
EXTRA_DIST += README.md
|
||||
|
||||
init_SCRIPTS = zfs-import zfs-mount zfs-share zfs-zed
|
||||
init_SCRIPTS = zfs-import zfs-load-key zfs-mount zfs-share zfs-zed
|
||||
|
||||
SUBSTFILES += $(init_SCRIPTS)
|
||||
|
||||
|
@ -42,14 +42,16 @@ INSTALLING INIT SCRIPT LINKS
|
||||
To setup the init script links in /etc/rc?.d manually on a Debian GNU/Linux
|
||||
(or derived) system, run the following commands (the order is important!):
|
||||
|
||||
update-rc.d zfs-import start 07 S . stop 07 0 1 6 .
|
||||
update-rc.d zfs-mount start 02 2 3 4 5 . stop 06 0 1 6 .
|
||||
update-rc.d zfs-zed start 07 2 3 4 5 . stop 08 0 1 6 .
|
||||
update-rc.d zfs-share start 27 2 3 4 5 . stop 05 0 1 6 .
|
||||
update-rc.d zfs-import start 07 S . stop 07 0 1 6 .
|
||||
update-rc.d zfs-load-key start 02 2 3 4 5 . stop 06 0 1 6 .
|
||||
update-rc.d zfs-mount start 02 2 3 4 5 . stop 06 0 1 6 .
|
||||
update-rc.d zfs-zed start 07 2 3 4 5 . stop 08 0 1 6 .
|
||||
update-rc.d zfs-share start 27 2 3 4 5 . stop 05 0 1 6 .
|
||||
|
||||
To do the same on RedHat, Fedora and/or CentOS:
|
||||
|
||||
chkconfig zfs-import
|
||||
chkconfig zfs-load-key
|
||||
chkconfig zfs-mount
|
||||
chkconfig zfs-zed
|
||||
chkconfig zfs-share
|
||||
@ -57,6 +59,7 @@ INSTALLING INIT SCRIPT LINKS
|
||||
On Gentoo:
|
||||
|
||||
rc-update add zfs-import boot
|
||||
rc-update add zfs-load-key boot
|
||||
rc-update add zfs-mount boot
|
||||
rc-update add zfs-zed default
|
||||
rc-update add zfs-share default
|
||||
|
131
sys/contrib/openzfs/etc/init.d/zfs-load-key.in
Executable file
131
sys/contrib/openzfs/etc/init.d/zfs-load-key.in
Executable file
@ -0,0 +1,131 @@
|
||||
#!@DEFAULT_INIT_SHELL@
|
||||
#
|
||||
# zfs-load-key This script will load/unload the zfs filesystems keys.
|
||||
#
|
||||
# chkconfig: 2345 06 99
|
||||
# description: This script will load or unload the zfs filesystems keys during
|
||||
# system boot/shutdown. Only filesystems with key path set
|
||||
# in keylocation property. See the zfs(8) man page for details.
|
||||
# probe: true
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: zfs-load-key
|
||||
# Required-Start: $local_fs zfs-import
|
||||
# Required-Stop: $local_fs zfs-import
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# X-Start-Before: zfs-mount
|
||||
# X-Stop-After: zfs-zed
|
||||
# Short-Description: Load ZFS keys for filesystems and volumes
|
||||
# Description: Run the `zfs load-key` or `zfs unload-key` commands.
|
||||
### END INIT INFO
|
||||
#
|
||||
# Released under the 2-clause BSD license.
|
||||
#
|
||||
# This script is based on debian/zfsutils.zfs.init from the
|
||||
# Debian GNU/kFreeBSD zfsutils 8.1-3 package, written by Aurelien Jarno.
|
||||
|
||||
# Source the common init script
|
||||
. @sysconfdir@/zfs/zfs-functions
|
||||
|
||||
# ----------------------------------------------------
|
||||
|
||||
do_depend()
|
||||
{
|
||||
# bootmisc will log to /var which may be a different zfs than root.
|
||||
before bootmisc logger zfs-mount
|
||||
|
||||
after zfs-import sysfs
|
||||
keyword -lxc -openvz -prefix -vserver
|
||||
}
|
||||
|
||||
# Load keys for all datasets/filesystems
|
||||
do_load_keys()
|
||||
{
|
||||
zfs_log_begin_msg "Load ZFS filesystem(s) keys"
|
||||
|
||||
"$ZFS" list -Ho name,encryptionroot,keystatus,keylocation |
|
||||
while IFS=" " read -r name encryptionroot keystatus keylocation; do
|
||||
if [ "$encryptionroot" != "-" ] &&
|
||||
[ "$name" = "$encryptionroot" ] &&
|
||||
[ "$keystatus" = "unavailable" ] &&
|
||||
[ "$keylocation" != "prompt" ] &&
|
||||
[ "$keylocation" != "none" ]
|
||||
then
|
||||
zfs_action "Load key for $encryptionroot" \
|
||||
"$ZFS" load-key "$encryptionroot"
|
||||
fi
|
||||
done
|
||||
|
||||
zfs_log_end_msg 0
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Unload keys for all datasets/filesystems
|
||||
do_unload_keys()
|
||||
{
|
||||
zfs_log_begin_msg "Unload ZFS filesystem(s) key"
|
||||
|
||||
"$ZFS" list -Ho name,encryptionroot,keystatus | sed '1!G;h;$!d' |
|
||||
while IFS=" " read -r name encryptionroot keystatus; do
|
||||
if [ "$encryptionroot" != "-" ] &&
|
||||
[ "$name" = "$encryptionroot" ] &&
|
||||
[ "$keystatus" = "available" ]
|
||||
then
|
||||
zfs_action "Unload key for $encryptionroot" \
|
||||
"$ZFS" unload-key "$encryptionroot"
|
||||
fi
|
||||
done
|
||||
|
||||
zfs_log_end_msg 0
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
do_start()
|
||||
{
|
||||
check_boolean "$ZFS_LOAD_KEY" || exit 0
|
||||
|
||||
check_module_loaded "zfs" || exit 0
|
||||
|
||||
do_load_keys
|
||||
}
|
||||
|
||||
do_stop()
|
||||
{
|
||||
check_boolean "$ZFS_UNLOAD_KEY" || exit 0
|
||||
|
||||
check_module_loaded "zfs" || exit 0
|
||||
|
||||
do_unload_keys
|
||||
}
|
||||
|
||||
# ----------------------------------------------------
|
||||
|
||||
if [ ! -e /sbin/openrc-run ]
|
||||
then
|
||||
case "$1" in
|
||||
start)
|
||||
do_start
|
||||
;;
|
||||
stop)
|
||||
do_stop
|
||||
;;
|
||||
force-reload|condrestart|reload|restart|status)
|
||||
# no-op
|
||||
;;
|
||||
*)
|
||||
[ -n "$1" ] && echo "Error: Unknown command $1."
|
||||
echo "Usage: $0 {start|stop}"
|
||||
exit 3
|
||||
;;
|
||||
esac
|
||||
|
||||
exit $?
|
||||
else
|
||||
# Create wrapper functions since Gentoo don't use the case part.
|
||||
depend() { do_depend; }
|
||||
start() { do_start; }
|
||||
stop() { do_stop; }
|
||||
fi
|
@ -27,9 +27,6 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/mman.h>
|
||||
#include <semaphore.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
@ -44,25 +41,16 @@
|
||||
#include <errno.h>
|
||||
#include <libzfs.h>
|
||||
|
||||
/*
|
||||
* For debugging only.
|
||||
*
|
||||
* Free statics with trivial life-times,
|
||||
* but saved line filenames are replaced with a static string.
|
||||
*/
|
||||
#define FREE_STATICS false
|
||||
|
||||
#define nitems(arr) (sizeof (arr) / sizeof (*arr))
|
||||
#define STRCMP ((int(*)(const void *, const void *))&strcmp)
|
||||
#define PID_T_CMP ((int(*)(const void *, const void *))&pid_t_cmp)
|
||||
|
||||
static int
|
||||
pid_t_cmp(const pid_t *lhs, const pid_t *rhs)
|
||||
{
|
||||
/*
|
||||
* This is always valid, quoth sys_types.h(7posix):
|
||||
* > blksize_t, pid_t, and ssize_t shall be signed integer types.
|
||||
*/
|
||||
return (*lhs - *rhs);
|
||||
}
|
||||
|
||||
#define EXIT_ENOMEM() \
|
||||
do { \
|
||||
fprintf(stderr, PROGNAME "[%d]: " \
|
||||
"not enough memory (L%d)!\n", getpid(), __LINE__); \
|
||||
_exit(1); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define PROGNAME "zfs-mount-generator"
|
||||
@ -80,20 +68,11 @@ pid_t_cmp(const pid_t *lhs, const pid_t *rhs)
|
||||
#define URI_REGEX_S "^\\([A-Za-z][A-Za-z0-9+.\\-]*\\):\\/\\/\\(.*\\)$"
|
||||
static regex_t uri_regex;
|
||||
|
||||
static char *argv0;
|
||||
|
||||
static const char *destdir = "/tmp";
|
||||
static int destdir_fd = -1;
|
||||
|
||||
static void *known_pools = NULL; /* tsearch() of C strings */
|
||||
static struct {
|
||||
sem_t noauto_not_on_sem;
|
||||
|
||||
sem_t noauto_names_sem;
|
||||
size_t noauto_names_len;
|
||||
size_t noauto_names_max;
|
||||
char noauto_names[][NAME_MAX];
|
||||
} *noauto_files;
|
||||
static void *noauto_files = NULL; /* tsearch() of C strings */
|
||||
|
||||
|
||||
static char *
|
||||
@ -103,8 +82,12 @@ systemd_escape(const char *input, const char *prepend, const char *append)
|
||||
size_t applen = strlen(append);
|
||||
size_t prelen = strlen(prepend);
|
||||
char *ret = malloc(4 * len + prelen + applen + 1);
|
||||
if (!ret)
|
||||
EXIT_ENOMEM();
|
||||
if (!ret) {
|
||||
fprintf(stderr, PROGNAME "[%d]: "
|
||||
"out of memory to escape \"%s%s%s\"!\n",
|
||||
getpid(), prepend, input, append);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
memcpy(ret, prepend, prelen);
|
||||
char *out = ret + prelen;
|
||||
@ -166,8 +149,12 @@ systemd_escape_path(char *input, const char *prepend, const char *append)
|
||||
{
|
||||
if (strcmp(input, "/") == 0) {
|
||||
char *ret;
|
||||
if (asprintf(&ret, "%s-%s", prepend, append) == -1)
|
||||
EXIT_ENOMEM();
|
||||
if (asprintf(&ret, "%s-%s", prepend, append) == -1) {
|
||||
fprintf(stderr, PROGNAME "[%d]: "
|
||||
"out of memory to escape \"%s%s%s\"!\n",
|
||||
getpid(), prepend, input, append);
|
||||
ret = NULL;
|
||||
}
|
||||
return (ret);
|
||||
} else {
|
||||
/*
|
||||
@ -209,6 +196,10 @@ fopenat(int dirfd, const char *pathname, int flags,
|
||||
static int
|
||||
line_worker(char *line, const char *cachefile)
|
||||
{
|
||||
int ret = 0;
|
||||
void *tofree_all[8];
|
||||
void **tofree = tofree_all;
|
||||
|
||||
char *toktmp;
|
||||
/* BEGIN CSTYLED */
|
||||
const char *dataset = strtok_r(line, "\t", &toktmp);
|
||||
@ -240,11 +231,9 @@ line_worker(char *line, const char *cachefile)
|
||||
if (p_nbmand == NULL) {
|
||||
fprintf(stderr, PROGNAME "[%d]: %s: not enough tokens!\n",
|
||||
getpid(), dataset);
|
||||
return (1);
|
||||
goto err;
|
||||
}
|
||||
|
||||
strncpy(argv0, dataset, strlen(argv0));
|
||||
|
||||
/* Minimal pre-requisites to mount a ZFS dataset */
|
||||
const char *after = "zfs-import.target";
|
||||
const char *wants = "zfs-import.target";
|
||||
@ -280,28 +269,31 @@ line_worker(char *line, const char *cachefile)
|
||||
|
||||
|
||||
if (strcmp(p_encroot, "-") != 0) {
|
||||
char *keyloadunit =
|
||||
char *keyloadunit = *(tofree++) =
|
||||
systemd_escape(p_encroot, "zfs-load-key@", ".service");
|
||||
if (keyloadunit == NULL)
|
||||
goto err;
|
||||
|
||||
if (strcmp(dataset, p_encroot) == 0) {
|
||||
const char *keymountdep = NULL;
|
||||
bool is_prompt = false;
|
||||
bool need_network = false;
|
||||
|
||||
regmatch_t uri_matches[3];
|
||||
if (regexec(&uri_regex, p_keyloc,
|
||||
sizeof (uri_matches) / sizeof (*uri_matches),
|
||||
uri_matches, 0) == 0) {
|
||||
nitems(uri_matches), uri_matches, 0) == 0) {
|
||||
p_keyloc[uri_matches[1].rm_eo] = '\0';
|
||||
p_keyloc[uri_matches[2].rm_eo] = '\0';
|
||||
const char *scheme =
|
||||
&p_keyloc[uri_matches[1].rm_so];
|
||||
const char *path =
|
||||
&p_keyloc[uri_matches[2].rm_so];
|
||||
|
||||
/*
|
||||
* Assumes all URI keylocations need
|
||||
* the mount for their path;
|
||||
* http://, for example, wouldn't
|
||||
* (but it'd need network-online.target et al.)
|
||||
*/
|
||||
keymountdep = path;
|
||||
if (strcmp(scheme, "https") == 0 ||
|
||||
strcmp(scheme, "http") == 0)
|
||||
need_network = true;
|
||||
else
|
||||
keymountdep = path;
|
||||
} else {
|
||||
if (strcmp(p_keyloc, "prompt") != 0)
|
||||
fprintf(stderr, PROGNAME "[%d]: %s: "
|
||||
@ -321,7 +313,7 @@ line_worker(char *line, const char *cachefile)
|
||||
"couldn't open %s under %s: %s\n",
|
||||
getpid(), dataset, keyloadunit, destdir,
|
||||
strerror(errno));
|
||||
return (1);
|
||||
goto err;
|
||||
}
|
||||
|
||||
fprintf(keyloadunit_f,
|
||||
@ -335,20 +327,22 @@ line_worker(char *line, const char *cachefile)
|
||||
"After=%s\n",
|
||||
dataset, cachefile, wants, after);
|
||||
|
||||
if (need_network)
|
||||
fprintf(keyloadunit_f,
|
||||
"Wants=network-online.target\n"
|
||||
"After=network-online.target\n");
|
||||
|
||||
if (p_systemd_requires)
|
||||
fprintf(keyloadunit_f,
|
||||
"Requires=%s\n", p_systemd_requires);
|
||||
|
||||
if (p_systemd_requiresmountsfor || keymountdep) {
|
||||
fprintf(keyloadunit_f, "RequiresMountsFor=");
|
||||
if (p_systemd_requiresmountsfor)
|
||||
fprintf(keyloadunit_f,
|
||||
"%s ", p_systemd_requiresmountsfor);
|
||||
if (keymountdep)
|
||||
fprintf(keyloadunit_f,
|
||||
"'%s'", keymountdep);
|
||||
fprintf(keyloadunit_f, "\n");
|
||||
}
|
||||
if (p_systemd_requiresmountsfor)
|
||||
fprintf(keyloadunit_f,
|
||||
"RequiresMountsFor=%s\n",
|
||||
p_systemd_requiresmountsfor);
|
||||
if (keymountdep)
|
||||
fprintf(keyloadunit_f,
|
||||
"RequiresMountsFor='%s'\n", keymountdep);
|
||||
|
||||
/* BEGIN CSTYLED */
|
||||
fprintf(keyloadunit_f,
|
||||
@ -393,9 +387,13 @@ line_worker(char *line, const char *cachefile)
|
||||
if (after[0] == '\0')
|
||||
after = keyloadunit;
|
||||
else if (asprintf(&toktmp, "%s %s", after, keyloadunit) != -1)
|
||||
after = toktmp;
|
||||
else
|
||||
EXIT_ENOMEM();
|
||||
after = *(tofree++) = toktmp;
|
||||
else {
|
||||
fprintf(stderr, PROGNAME "[%d]: %s: "
|
||||
"out of memory to generate after=\"%s %s\"!\n",
|
||||
getpid(), dataset, after, keyloadunit);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -404,12 +402,12 @@ line_worker(char *line, const char *cachefile)
|
||||
strcmp(p_systemd_ignore, "off") == 0) {
|
||||
/* ok */
|
||||
} else if (strcmp(p_systemd_ignore, "on") == 0)
|
||||
return (0);
|
||||
goto end;
|
||||
else {
|
||||
fprintf(stderr, PROGNAME "[%d]: %s: "
|
||||
"invalid org.openzfs.systemd:ignore=%s\n",
|
||||
getpid(), dataset, p_systemd_ignore);
|
||||
return (1);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Check for canmount */
|
||||
@ -418,21 +416,21 @@ line_worker(char *line, const char *cachefile)
|
||||
} else if (strcmp(p_canmount, "noauto") == 0)
|
||||
noauto = true;
|
||||
else if (strcmp(p_canmount, "off") == 0)
|
||||
return (0);
|
||||
goto end;
|
||||
else {
|
||||
fprintf(stderr, PROGNAME "[%d]: %s: invalid canmount=%s\n",
|
||||
getpid(), dataset, p_canmount);
|
||||
return (1);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Check for legacy and blank mountpoints */
|
||||
if (strcmp(p_mountpoint, "legacy") == 0 ||
|
||||
strcmp(p_mountpoint, "none") == 0)
|
||||
return (0);
|
||||
goto end;
|
||||
else if (p_mountpoint[0] != '/') {
|
||||
fprintf(stderr, PROGNAME "[%d]: %s: invalid mountpoint=%s\n",
|
||||
getpid(), dataset, p_mountpoint);
|
||||
return (1);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Escape the mountpoint per systemd policy */
|
||||
@ -442,7 +440,7 @@ line_worker(char *line, const char *cachefile)
|
||||
fprintf(stderr,
|
||||
PROGNAME "[%d]: %s: abnormal simplified mountpoint: %s\n",
|
||||
getpid(), dataset, p_mountpoint);
|
||||
return (1);
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
||||
@ -552,8 +550,7 @@ line_worker(char *line, const char *cachefile)
|
||||
* files if we're sure they were created by us. (see 5.)
|
||||
* 2. We handle files differently based on canmount.
|
||||
* Units with canmount=on always have precedence over noauto.
|
||||
* This is enforced by the noauto_not_on_sem semaphore,
|
||||
* which is only unlocked when the last canmount=on process exits.
|
||||
* This is enforced by processing these units before all others.
|
||||
* It is important to use p_canmount and not noauto here,
|
||||
* since we categorise by canmount while other properties,
|
||||
* e.g. org.openzfs.systemd:wanted-by, also modify noauto.
|
||||
@ -561,7 +558,7 @@ line_worker(char *line, const char *cachefile)
|
||||
* Additionally, we use noauto_files to track the unit file names
|
||||
* (which are the systemd-escaped mountpoints) of all (exclusively)
|
||||
* noauto datasets that had a file created.
|
||||
* 4. If the file to be created is found in the tracking array,
|
||||
* 4. If the file to be created is found in the tracking tree,
|
||||
* we do NOT create it.
|
||||
* 5. If a file exists for a noauto dataset,
|
||||
* we check whether the file name is in the array.
|
||||
@ -571,29 +568,14 @@ line_worker(char *line, const char *cachefile)
|
||||
* further noauto datasets creating a file for this path again.
|
||||
*/
|
||||
|
||||
{
|
||||
sem_t *our_sem = (strcmp(p_canmount, "on") == 0) ?
|
||||
&noauto_files->noauto_names_sem :
|
||||
&noauto_files->noauto_not_on_sem;
|
||||
while (sem_wait(our_sem) == -1 && errno == EINTR)
|
||||
;
|
||||
}
|
||||
|
||||
struct stat stbuf;
|
||||
bool already_exists = fstatat(destdir_fd, mountfile, &stbuf, 0) == 0;
|
||||
bool is_known = tfind(mountfile, &noauto_files, STRCMP) != NULL;
|
||||
|
||||
bool is_known = false;
|
||||
for (size_t i = 0; i < noauto_files->noauto_names_len; ++i) {
|
||||
if (strncmp(
|
||||
noauto_files->noauto_names[i], mountfile, NAME_MAX) == 0) {
|
||||
is_known = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
*(tofree++) = (void *)mountfile;
|
||||
if (already_exists) {
|
||||
if (is_known) {
|
||||
/* If it's in $noauto_files, we must be noauto too */
|
||||
/* If it's in noauto_files, we must be noauto too */
|
||||
|
||||
/* See 5 */
|
||||
errno = 0;
|
||||
@ -614,43 +596,31 @@ line_worker(char *line, const char *cachefile)
|
||||
}
|
||||
|
||||
/* File exists: skip current dataset */
|
||||
if (strcmp(p_canmount, "on") == 0)
|
||||
sem_post(&noauto_files->noauto_names_sem);
|
||||
return (0);
|
||||
goto end;
|
||||
} else {
|
||||
if (is_known) {
|
||||
/* See 4 */
|
||||
if (strcmp(p_canmount, "on") == 0)
|
||||
sem_post(&noauto_files->noauto_names_sem);
|
||||
return (0);
|
||||
goto end;
|
||||
} else if (strcmp(p_canmount, "noauto") == 0) {
|
||||
if (noauto_files->noauto_names_len ==
|
||||
noauto_files->noauto_names_max)
|
||||
if (tsearch(mountfile, &noauto_files, STRCMP) == NULL)
|
||||
fprintf(stderr, PROGNAME "[%d]: %s: "
|
||||
"noauto dataset limit (%zu) reached! "
|
||||
"Not tracking %s. Please report this to "
|
||||
"https://github.com/openzfs/zfs\n",
|
||||
getpid(), dataset,
|
||||
noauto_files->noauto_names_max, mountfile);
|
||||
else {
|
||||
strncpy(noauto_files->noauto_names[
|
||||
noauto_files->noauto_names_len],
|
||||
mountfile, NAME_MAX);
|
||||
++noauto_files->noauto_names_len;
|
||||
}
|
||||
"out of memory for noauto datasets! "
|
||||
"Not tracking %s.\n",
|
||||
getpid(), dataset, mountfile);
|
||||
else
|
||||
/* mountfile escaped to noauto_files */
|
||||
*(--tofree) = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FILE *mountfile_f = fopenat(destdir_fd, mountfile,
|
||||
O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, "w", 0644);
|
||||
if (strcmp(p_canmount, "on") == 0)
|
||||
sem_post(&noauto_files->noauto_names_sem);
|
||||
if (!mountfile_f) {
|
||||
fprintf(stderr,
|
||||
PROGNAME "[%d]: %s: couldn't open %s under %s: %s\n",
|
||||
getpid(), dataset, mountfile, destdir, strerror(errno));
|
||||
return (1);
|
||||
goto err;
|
||||
}
|
||||
|
||||
fprintf(mountfile_f,
|
||||
@ -699,12 +669,17 @@ line_worker(char *line, const char *cachefile)
|
||||
(void) fclose(mountfile_f);
|
||||
|
||||
if (!requiredby && !wantedby)
|
||||
return (0);
|
||||
goto end;
|
||||
|
||||
/* Finally, create the appropriate dependencies */
|
||||
char *linktgt;
|
||||
if (asprintf(&linktgt, "../%s", mountfile) == -1)
|
||||
EXIT_ENOMEM();
|
||||
if (asprintf(&linktgt, "../%s", mountfile) == -1) {
|
||||
fprintf(stderr, PROGNAME "[%d]: %s: "
|
||||
"out of memory for dependents of %s!\n",
|
||||
getpid(), dataset, mountfile);
|
||||
goto err;
|
||||
}
|
||||
*(tofree++) = linktgt;
|
||||
|
||||
char *dependencies[][2] = {
|
||||
{"wants", wantedby},
|
||||
@ -719,8 +694,14 @@ line_worker(char *line, const char *cachefile)
|
||||
reqby;
|
||||
reqby = strtok_r(NULL, " ", &toktmp)) {
|
||||
char *depdir;
|
||||
if (asprintf(&depdir, "%s.%s", reqby, (*dep)[0]) == -1)
|
||||
EXIT_ENOMEM();
|
||||
if (asprintf(
|
||||
&depdir, "%s.%s", reqby, (*dep)[0]) == -1) {
|
||||
fprintf(stderr, PROGNAME "[%d]: %s: "
|
||||
"out of memory for dependent dir name "
|
||||
"\"%s.%s\"!\n",
|
||||
getpid(), dataset, reqby, (*dep)[0]);
|
||||
continue;
|
||||
}
|
||||
|
||||
(void) mkdirat(destdir_fd, depdir, 0755);
|
||||
int depdir_fd = openat(destdir_fd, depdir,
|
||||
@ -746,7 +727,24 @@ line_worker(char *line, const char *cachefile)
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
end:
|
||||
if (tofree >= tofree_all + nitems(tofree_all)) {
|
||||
/*
|
||||
* This won't happen as-is:
|
||||
* we've got 8 slots and allocate 4 things at most.
|
||||
*/
|
||||
fprintf(stderr,
|
||||
PROGNAME "[%d]: %s: need to free %zu > %zu!\n",
|
||||
getpid(), dataset, tofree - tofree_all, nitems(tofree_all));
|
||||
ret = tofree - tofree_all;
|
||||
}
|
||||
|
||||
while (tofree-- != tofree_all)
|
||||
free(*tofree);
|
||||
return (ret);
|
||||
err:
|
||||
ret = 1;
|
||||
goto end;
|
||||
}
|
||||
|
||||
|
||||
@ -780,12 +778,11 @@ main(int argc, char **argv)
|
||||
if (kmfd >= 0) {
|
||||
(void) dup2(kmfd, STDERR_FILENO);
|
||||
(void) close(kmfd);
|
||||
|
||||
setlinebuf(stderr);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t debug = 0;
|
||||
|
||||
argv0 = argv[0];
|
||||
switch (argc) {
|
||||
case 1:
|
||||
/* Use default */
|
||||
@ -844,33 +841,9 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
/*
|
||||
* We could just get a gigabyte here and Not Care,
|
||||
* but if vm.overcommit_memory=2, then MAP_NORESERVE is ignored
|
||||
* and we'd try (and likely fail) to rip it out of swap
|
||||
*/
|
||||
noauto_files = mmap(NULL, 4 * 1024 * 1024,
|
||||
PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
|
||||
if (noauto_files == MAP_FAILED) {
|
||||
fprintf(stderr,
|
||||
PROGNAME "[%d]: couldn't allocate IPC region: %s\n",
|
||||
getpid(), strerror(errno));
|
||||
_exit(1);
|
||||
}
|
||||
|
||||
sem_init(&noauto_files->noauto_not_on_sem, true, 0);
|
||||
sem_init(&noauto_files->noauto_names_sem, true, 1);
|
||||
noauto_files->noauto_names_len = 0;
|
||||
/* Works out to 16447ish, *well* enough */
|
||||
noauto_files->noauto_names_max =
|
||||
(4 * 1024 * 1024 - sizeof (*noauto_files)) / NAME_MAX;
|
||||
}
|
||||
|
||||
bool debug = false;
|
||||
char *line = NULL;
|
||||
size_t linelen = 0;
|
||||
struct timespec time_start = {};
|
||||
{
|
||||
const char *dbgenv = getenv("ZFS_DEBUG");
|
||||
if (dbgenv)
|
||||
@ -879,7 +852,7 @@ main(int argc, char **argv)
|
||||
FILE *cmdline = fopen("/proc/cmdline", "re");
|
||||
if (cmdline != NULL) {
|
||||
if (getline(&line, &linelen, cmdline) >= 0)
|
||||
debug = strstr(line, "debug") ? 2 : 0;
|
||||
debug = strstr(line, "debug");
|
||||
(void) fclose(cmdline);
|
||||
}
|
||||
}
|
||||
@ -888,19 +861,17 @@ main(int argc, char **argv)
|
||||
dup2(STDERR_FILENO, STDOUT_FILENO);
|
||||
}
|
||||
|
||||
size_t forked_canmount_on = 0;
|
||||
size_t forked_canmount_not_on = 0;
|
||||
size_t canmount_on_pids_len = 128;
|
||||
pid_t *canmount_on_pids =
|
||||
malloc(canmount_on_pids_len * sizeof (*canmount_on_pids));
|
||||
if (canmount_on_pids == NULL)
|
||||
canmount_on_pids_len = 0;
|
||||
|
||||
struct timespec time_start = {};
|
||||
if (debug)
|
||||
clock_gettime(CLOCK_MONOTONIC_RAW, &time_start);
|
||||
|
||||
ssize_t read;
|
||||
pid_t pid;
|
||||
struct line {
|
||||
char *line;
|
||||
const char *fname;
|
||||
struct line *next;
|
||||
} *lines_canmount_not_on = NULL;
|
||||
|
||||
int ret = 0;
|
||||
struct dirent *cachent;
|
||||
while ((cachent = readdir(fslist_dir)) != NULL) {
|
||||
if (strcmp(cachent->d_name, ".") == 0 ||
|
||||
@ -916,129 +887,67 @@ main(int argc, char **argv)
|
||||
continue;
|
||||
}
|
||||
|
||||
const char *filename = FREE_STATICS ? "(elided)" : NULL;
|
||||
|
||||
ssize_t read;
|
||||
while ((read = getline(&line, &linelen, cachefile)) >= 0) {
|
||||
line[read - 1] = '\0'; /* newline */
|
||||
|
||||
switch (pid = fork()) {
|
||||
case -1:
|
||||
fprintf(stderr,
|
||||
PROGNAME "[%d]: couldn't fork for %s: %s\n",
|
||||
getpid(), line, strerror(errno));
|
||||
break;
|
||||
case 0: /* child */
|
||||
_exit(line_worker(line, cachent->d_name));
|
||||
default: { /* parent */
|
||||
char *tmp;
|
||||
char *dset = strtok_r(line, "\t", &tmp);
|
||||
strtok_r(NULL, "\t", &tmp);
|
||||
char *canmount = strtok_r(NULL, "\t", &tmp);
|
||||
bool canmount_on =
|
||||
canmount && strncmp(canmount, "on", 2) == 0;
|
||||
char *canmount = line;
|
||||
canmount += strcspn(canmount, "\t");
|
||||
canmount += strspn(canmount, "\t");
|
||||
canmount += strcspn(canmount, "\t");
|
||||
canmount += strspn(canmount, "\t");
|
||||
bool canmount_on = strncmp(canmount, "on", 2) == 0;
|
||||
|
||||
if (debug >= 2)
|
||||
printf(PROGNAME ": forked %d, "
|
||||
"canmount_on=%d, dataset=%s\n",
|
||||
(int)pid, canmount_on, dset);
|
||||
if (canmount_on)
|
||||
ret |= line_worker(line, cachent->d_name);
|
||||
else {
|
||||
if (filename == NULL)
|
||||
filename =
|
||||
strdup(cachent->d_name) ?: "(?)";
|
||||
|
||||
if (canmount_on &&
|
||||
forked_canmount_on ==
|
||||
canmount_on_pids_len) {
|
||||
size_t new_len =
|
||||
(canmount_on_pids_len ?: 16) * 2;
|
||||
void *new_pidlist =
|
||||
realloc(canmount_on_pids,
|
||||
new_len *
|
||||
sizeof (*canmount_on_pids));
|
||||
if (!new_pidlist) {
|
||||
fprintf(stderr,
|
||||
PROGNAME "[%d]: "
|
||||
"out of memory! "
|
||||
"Mount ordering may be "
|
||||
"affected.\n", getpid());
|
||||
continue;
|
||||
}
|
||||
|
||||
canmount_on_pids = new_pidlist;
|
||||
canmount_on_pids_len = new_len;
|
||||
struct line *l = calloc(1, sizeof (*l));
|
||||
char *nl = strdup(line);
|
||||
if (l == NULL || nl == NULL) {
|
||||
fprintf(stderr, PROGNAME "[%d]: "
|
||||
"out of memory for \"%s\" in %s\n",
|
||||
getpid(), line, cachent->d_name);
|
||||
free(l);
|
||||
free(nl);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (canmount_on) {
|
||||
canmount_on_pids[forked_canmount_on] =
|
||||
pid;
|
||||
++forked_canmount_on;
|
||||
} else
|
||||
++forked_canmount_not_on;
|
||||
break;
|
||||
}
|
||||
l->line = nl;
|
||||
l->fname = filename;
|
||||
l->next = lines_canmount_not_on;
|
||||
lines_canmount_not_on = l;
|
||||
}
|
||||
}
|
||||
|
||||
(void) fclose(cachefile);
|
||||
fclose(cachefile);
|
||||
}
|
||||
free(line);
|
||||
|
||||
if (forked_canmount_on == 0) {
|
||||
/* No canmount=on processes to finish, so don't deadlock here */
|
||||
for (size_t i = 0; i < forked_canmount_not_on; ++i)
|
||||
sem_post(&noauto_files->noauto_not_on_sem);
|
||||
} else {
|
||||
/* Likely a no-op, since we got these from a narrow fork loop */
|
||||
qsort(canmount_on_pids, forked_canmount_on,
|
||||
sizeof (*canmount_on_pids), PID_T_CMP);
|
||||
}
|
||||
while (lines_canmount_not_on) {
|
||||
struct line *l = lines_canmount_not_on;
|
||||
lines_canmount_not_on = l->next;
|
||||
|
||||
int status, ret = 0;
|
||||
struct rusage usage;
|
||||
size_t forked_canmount_on_max = forked_canmount_on;
|
||||
while ((pid = wait4(-1, &status, 0, &usage)) != -1) {
|
||||
ret |= WEXITSTATUS(status) | WTERMSIG(status);
|
||||
|
||||
if (forked_canmount_on != 0) {
|
||||
if (bsearch(&pid, canmount_on_pids,
|
||||
forked_canmount_on_max, sizeof (*canmount_on_pids),
|
||||
PID_T_CMP))
|
||||
--forked_canmount_on;
|
||||
|
||||
if (forked_canmount_on == 0) {
|
||||
/*
|
||||
* All canmount=on processes have finished,
|
||||
* let all the lower-priority ones finish now
|
||||
*/
|
||||
for (size_t i = 0;
|
||||
i < forked_canmount_not_on; ++i)
|
||||
sem_post(
|
||||
&noauto_files->noauto_not_on_sem);
|
||||
}
|
||||
ret |= line_worker(l->line, l->fname);
|
||||
if (FREE_STATICS) {
|
||||
free(l->line);
|
||||
free(l);
|
||||
}
|
||||
|
||||
if (debug >= 2)
|
||||
printf(PROGNAME ": %d done, user=%llu.%06us, "
|
||||
"system=%llu.%06us, maxrss=%ldB, ex=0x%x\n",
|
||||
(int)pid,
|
||||
(unsigned long long) usage.ru_utime.tv_sec,
|
||||
(unsigned int) usage.ru_utime.tv_usec,
|
||||
(unsigned long long) usage.ru_stime.tv_sec,
|
||||
(unsigned int) usage.ru_stime.tv_usec,
|
||||
usage.ru_maxrss * 1024, status);
|
||||
}
|
||||
|
||||
if (debug) {
|
||||
struct timespec time_end = {};
|
||||
clock_gettime(CLOCK_MONOTONIC_RAW, &time_end);
|
||||
|
||||
struct rusage usage;
|
||||
getrusage(RUSAGE_SELF, &usage);
|
||||
printf(
|
||||
"\n"
|
||||
PROGNAME ": self : "
|
||||
"user=%llu.%06us, system=%llu.%06us, maxrss=%ldB\n",
|
||||
(unsigned long long) usage.ru_utime.tv_sec,
|
||||
(unsigned int) usage.ru_utime.tv_usec,
|
||||
(unsigned long long) usage.ru_stime.tv_sec,
|
||||
(unsigned int) usage.ru_stime.tv_usec,
|
||||
usage.ru_maxrss * 1024);
|
||||
|
||||
getrusage(RUSAGE_CHILDREN, &usage);
|
||||
printf(PROGNAME ": children: "
|
||||
PROGNAME ": "
|
||||
"user=%llu.%06us, system=%llu.%06us, maxrss=%ldB\n",
|
||||
(unsigned long long) usage.ru_utime.tv_sec,
|
||||
(unsigned int) usage.ru_utime.tv_usec,
|
||||
@ -1068,7 +977,7 @@ main(int argc, char **argv)
|
||||
time_init.tv_nsec / 1000000000;
|
||||
time_init.tv_nsec %= 1000000000;
|
||||
|
||||
printf(PROGNAME ": wall : "
|
||||
printf(PROGNAME ": "
|
||||
"total=%llu.%09llus = "
|
||||
"init=%llu.%09llus + real=%llu.%09llus\n",
|
||||
(unsigned long long) time_init.tv_sec,
|
||||
@ -1077,7 +986,15 @@ main(int argc, char **argv)
|
||||
(unsigned long long) time_start.tv_nsec,
|
||||
(unsigned long long) time_end.tv_sec,
|
||||
(unsigned long long) time_end.tv_nsec);
|
||||
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
if (FREE_STATICS) {
|
||||
closedir(fslist_dir);
|
||||
tdestroy(noauto_files, free);
|
||||
tdestroy(known_pools, free);
|
||||
regfree(&uri_regex);
|
||||
}
|
||||
_exit(ret);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
# This is a script with common functions etc used by zfs-import, zfs-mount,
|
||||
# zfs-share and zfs-zed.
|
||||
# This is a script with common functions etc used by zfs-import, zfs-load-key,
|
||||
# zfs-mount, zfs-share and zfs-zed.
|
||||
#
|
||||
# It is _NOT_ to be called independently
|
||||
#
|
||||
@ -92,6 +92,8 @@ ZPOOL="@sbindir@/zpool"
|
||||
ZPOOL_CACHE="@sysconfdir@/zfs/zpool.cache"
|
||||
|
||||
# Sensible defaults
|
||||
ZFS_LOAD_KEY='yes'
|
||||
ZFS_UNLOAD_KEY='no'
|
||||
ZFS_MOUNT='yes'
|
||||
ZFS_UNMOUNT='yes'
|
||||
ZFS_SHARE='yes'
|
||||
@ -104,7 +106,8 @@ fi
|
||||
|
||||
# ----------------------------------------------------
|
||||
|
||||
export ZFS ZED ZPOOL ZPOOL_CACHE ZFS_MOUNT ZFS_UNMOUNT ZFS_SHARE ZFS_UNSHARE
|
||||
export ZFS ZED ZPOOL ZPOOL_CACHE ZFS_LOAD_KEY ZFS_UNLOAD_KEY ZFS_MOUNT ZFS_UNMOUNT \
|
||||
ZFS_SHARE ZFS_UNSHARE
|
||||
|
||||
zfs_action()
|
||||
{
|
||||
|
@ -150,6 +150,7 @@ typedef enum zfs_error {
|
||||
EZFS_NO_RESILVER_DEFER, /* pool doesn't support resilver_defer */
|
||||
EZFS_EXPORT_IN_PROGRESS, /* currently exporting the pool */
|
||||
EZFS_REBUILDING, /* resilvering (sequential reconstrution) */
|
||||
EZFS_VDEV_NOTSUP, /* ops not supported for this type of vdev */
|
||||
EZFS_UNKNOWN
|
||||
} zfs_error_t;
|
||||
|
||||
@ -336,6 +337,24 @@ _LIBZFS_H int zpool_props_refresh(zpool_handle_t *);
|
||||
_LIBZFS_H const char *zpool_prop_to_name(zpool_prop_t);
|
||||
_LIBZFS_H const char *zpool_prop_values(zpool_prop_t);
|
||||
|
||||
/*
|
||||
* Functions to manage vdev properties
|
||||
*/
|
||||
_LIBZFS_H int zpool_get_vdev_prop_value(nvlist_t *, vdev_prop_t, char *, char *,
|
||||
size_t, zprop_source_t *, boolean_t);
|
||||
_LIBZFS_H int zpool_get_vdev_prop(zpool_handle_t *, const char *, vdev_prop_t,
|
||||
char *, char *, size_t, zprop_source_t *, boolean_t);
|
||||
_LIBZFS_H int zpool_get_all_vdev_props(zpool_handle_t *, const char *,
|
||||
nvlist_t **);
|
||||
_LIBZFS_H int zpool_set_vdev_prop(zpool_handle_t *, const char *, const char *,
|
||||
const char *);
|
||||
|
||||
_LIBZFS_H const char *vdev_prop_to_name(vdev_prop_t);
|
||||
_LIBZFS_H const char *vdev_prop_values(vdev_prop_t);
|
||||
_LIBZFS_H boolean_t vdev_prop_user(const char *name);
|
||||
_LIBZFS_H const char *vdev_prop_column_name(vdev_prop_t);
|
||||
_LIBZFS_H boolean_t vdev_prop_align_right(vdev_prop_t);
|
||||
|
||||
/*
|
||||
* Pool health statistics.
|
||||
*/
|
||||
@ -552,6 +571,8 @@ typedef struct zprop_list {
|
||||
_LIBZFS_H int zfs_expand_proplist(zfs_handle_t *, zprop_list_t **, boolean_t,
|
||||
boolean_t);
|
||||
_LIBZFS_H void zfs_prune_proplist(zfs_handle_t *, uint8_t *);
|
||||
_LIBZFS_H int vdev_expand_proplist(zpool_handle_t *, const char *,
|
||||
zprop_list_t **);
|
||||
|
||||
#define ZFS_MOUNTPOINT_NONE "none"
|
||||
#define ZFS_MOUNTPOINT_LEGACY "legacy"
|
||||
@ -567,7 +588,7 @@ _LIBZFS_H void zfs_prune_proplist(zfs_handle_t *, uint8_t *);
|
||||
* zpool property management
|
||||
*/
|
||||
_LIBZFS_H int zpool_expand_proplist(zpool_handle_t *, zprop_list_t **,
|
||||
boolean_t);
|
||||
zfs_type_t, boolean_t);
|
||||
_LIBZFS_H int zpool_prop_get_feature(zpool_handle_t *, const char *, char *,
|
||||
size_t);
|
||||
_LIBZFS_H const char *zpool_prop_default_string(zpool_prop_t);
|
||||
@ -598,6 +619,12 @@ typedef enum {
|
||||
/*
|
||||
* Functions for printing zfs or zpool properties
|
||||
*/
|
||||
typedef struct vdev_cbdata {
|
||||
int cb_name_flags;
|
||||
char **cb_names;
|
||||
unsigned int cb_names_count;
|
||||
} vdev_cbdata_t;
|
||||
|
||||
typedef struct zprop_get_cbdata {
|
||||
int cb_sources;
|
||||
zfs_get_column_t cb_columns[ZFS_GET_NCOLS];
|
||||
@ -607,6 +634,7 @@ typedef struct zprop_get_cbdata {
|
||||
boolean_t cb_first;
|
||||
zprop_list_t *cb_proplist;
|
||||
zfs_type_t cb_type;
|
||||
vdev_cbdata_t cb_vdevs;
|
||||
} zprop_get_cbdata_t;
|
||||
|
||||
_LIBZFS_H void zprop_print_one_property(const char *, zprop_get_cbdata_t *,
|
||||
@ -807,9 +835,10 @@ _LIBZFS_H int zfs_receive(libzfs_handle_t *, const char *, nvlist_t *,
|
||||
recvflags_t *, int, avl_tree_t *);
|
||||
|
||||
typedef enum diff_flags {
|
||||
ZFS_DIFF_PARSEABLE = 0x1,
|
||||
ZFS_DIFF_TIMESTAMP = 0x2,
|
||||
ZFS_DIFF_CLASSIFY = 0x4
|
||||
ZFS_DIFF_PARSEABLE = 1 << 0,
|
||||
ZFS_DIFF_TIMESTAMP = 1 << 1,
|
||||
ZFS_DIFF_CLASSIFY = 1 << 2,
|
||||
ZFS_DIFF_NO_MANGLE = 1 << 3
|
||||
} diff_flags_t;
|
||||
|
||||
_LIBZFS_H int zfs_show_diffs(zfs_handle_t *, int, const char *, const char *,
|
||||
@ -879,7 +908,7 @@ _LIBZFS_H void zfs_commit_shares(const char *);
|
||||
_LIBZFS_H int zfs_nicestrtonum(libzfs_handle_t *, const char *, uint64_t *);
|
||||
|
||||
/*
|
||||
* Utility functions to run an external process.
|
||||
* Utility functions to run an _LIBZFS_Hal process.
|
||||
*/
|
||||
#define STDOUT_VERBOSE 0x01
|
||||
#define STDERR_VERBOSE 0x02
|
||||
|
@ -146,6 +146,10 @@ _LIBZFS_CORE_H int lzc_wait_fs(const char *, zfs_wait_activity_t, boolean_t *);
|
||||
|
||||
_LIBZFS_CORE_H int lzc_set_bootenv(const char *, const nvlist_t *);
|
||||
_LIBZFS_CORE_H int lzc_get_bootenv(const char *, nvlist_t **);
|
||||
|
||||
_LIBZFS_CORE_H int lzc_get_vdev_prop(const char *, nvlist_t *, nvlist_t **);
|
||||
_LIBZFS_CORE_H int lzc_set_vdev_prop(const char *, nvlist_t *, nvlist_t **);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -88,6 +88,9 @@
|
||||
#if defined(HAVE_KERNEL_FPU_API_HEADER)
|
||||
#include <asm/fpu/api.h>
|
||||
#include <asm/fpu/internal.h>
|
||||
#if defined(HAVE_KERNEL_FPU_XCR_HEADER)
|
||||
#include <asm/fpu/xcr.h>
|
||||
#endif
|
||||
#else
|
||||
#include <asm/i387.h>
|
||||
#include <asm/xcr.h>
|
||||
|
@ -54,7 +54,8 @@ typedef enum {
|
||||
ZFS_TYPE_SNAPSHOT = (1 << 1),
|
||||
ZFS_TYPE_VOLUME = (1 << 2),
|
||||
ZFS_TYPE_POOL = (1 << 3),
|
||||
ZFS_TYPE_BOOKMARK = (1 << 4)
|
||||
ZFS_TYPE_BOOKMARK = (1 << 4),
|
||||
ZFS_TYPE_VDEV = (1 << 5),
|
||||
} zfs_type_t;
|
||||
|
||||
/*
|
||||
@ -252,6 +253,7 @@ typedef enum {
|
||||
|
||||
/* Small enough to not hog a whole line of printout in zpool(8). */
|
||||
#define ZPROP_MAX_COMMENT 32
|
||||
#define ZPROP_BOOLEAN_NA 2
|
||||
|
||||
#define ZPROP_VALUE "value"
|
||||
#define ZPROP_SOURCE "source"
|
||||
@ -298,6 +300,59 @@ typedef int (*zprop_func)(int, void *);
|
||||
*/
|
||||
#define ZFS_WRITTEN_PROP_PREFIX_LEN 8
|
||||
|
||||
/*
|
||||
* VDEV properties are identified by these constants and must be added to the
|
||||
* end of this list to ensure that external consumers are not affected
|
||||
* by the change. If you make any changes to this list, be sure to update
|
||||
* the property table in usr/src/common/zfs/zpool_prop.c.
|
||||
*/
|
||||
typedef enum {
|
||||
VDEV_PROP_INVAL = -1,
|
||||
#define VDEV_PROP_USER VDEV_PROP_INVAL
|
||||
VDEV_PROP_NAME,
|
||||
VDEV_PROP_CAPACITY,
|
||||
VDEV_PROP_STATE,
|
||||
VDEV_PROP_GUID,
|
||||
VDEV_PROP_ASIZE,
|
||||
VDEV_PROP_PSIZE,
|
||||
VDEV_PROP_ASHIFT,
|
||||
VDEV_PROP_SIZE,
|
||||
VDEV_PROP_FREE,
|
||||
VDEV_PROP_ALLOCATED,
|
||||
VDEV_PROP_COMMENT,
|
||||
VDEV_PROP_EXPANDSZ,
|
||||
VDEV_PROP_FRAGMENTATION,
|
||||
VDEV_PROP_BOOTSIZE,
|
||||
VDEV_PROP_PARITY,
|
||||
VDEV_PROP_PATH,
|
||||
VDEV_PROP_DEVID,
|
||||
VDEV_PROP_PHYS_PATH,
|
||||
VDEV_PROP_ENC_PATH,
|
||||
VDEV_PROP_FRU,
|
||||
VDEV_PROP_PARENT,
|
||||
VDEV_PROP_CHILDREN,
|
||||
VDEV_PROP_NUMCHILDREN,
|
||||
VDEV_PROP_READ_ERRORS,
|
||||
VDEV_PROP_WRITE_ERRORS,
|
||||
VDEV_PROP_CHECKSUM_ERRORS,
|
||||
VDEV_PROP_INITIALIZE_ERRORS,
|
||||
VDEV_PROP_OPS_NULL,
|
||||
VDEV_PROP_OPS_READ,
|
||||
VDEV_PROP_OPS_WRITE,
|
||||
VDEV_PROP_OPS_FREE,
|
||||
VDEV_PROP_OPS_CLAIM,
|
||||
VDEV_PROP_OPS_TRIM,
|
||||
VDEV_PROP_BYTES_NULL,
|
||||
VDEV_PROP_BYTES_READ,
|
||||
VDEV_PROP_BYTES_WRITE,
|
||||
VDEV_PROP_BYTES_FREE,
|
||||
VDEV_PROP_BYTES_CLAIM,
|
||||
VDEV_PROP_BYTES_TRIM,
|
||||
VDEV_PROP_REMOVING,
|
||||
VDEV_PROP_ALLOCATING,
|
||||
VDEV_NUM_PROPS
|
||||
} vdev_prop_t;
|
||||
|
||||
/*
|
||||
* Dataset property functions shared between libzfs and kernel.
|
||||
*/
|
||||
@ -337,6 +392,22 @@ _SYS_FS_ZFS_H int zpool_prop_string_to_index(zpool_prop_t, const char *,
|
||||
uint64_t *);
|
||||
_SYS_FS_ZFS_H uint64_t zpool_prop_random_value(zpool_prop_t, uint64_t seed);
|
||||
|
||||
/*
|
||||
* VDEV property functions shared between libzfs and kernel.
|
||||
*/
|
||||
_SYS_FS_ZFS_H vdev_prop_t vdev_name_to_prop(const char *);
|
||||
_SYS_FS_ZFS_H boolean_t vdev_prop_user(const char *name);
|
||||
_SYS_FS_ZFS_H const char *vdev_prop_to_name(vdev_prop_t);
|
||||
_SYS_FS_ZFS_H const char *vdev_prop_default_string(vdev_prop_t);
|
||||
_SYS_FS_ZFS_H uint64_t vdev_prop_default_numeric(vdev_prop_t);
|
||||
_SYS_FS_ZFS_H boolean_t vdev_prop_readonly(vdev_prop_t prop);
|
||||
_SYS_FS_ZFS_H int vdev_prop_index_to_string(vdev_prop_t, uint64_t,
|
||||
const char **);
|
||||
_SYS_FS_ZFS_H int vdev_prop_string_to_index(vdev_prop_t, const char *,
|
||||
uint64_t *);
|
||||
_SYS_FS_ZFS_H boolean_t zpool_prop_vdev(const char *name);
|
||||
_SYS_FS_ZFS_H uint64_t vdev_prop_random_value(vdev_prop_t prop, uint64_t seed);
|
||||
|
||||
/*
|
||||
* Definitions for the Delegation.
|
||||
*/
|
||||
@ -712,6 +783,7 @@ typedef struct zpool_load_policy {
|
||||
#define ZPOOL_CONFIG_ORIG_GUID "orig_guid"
|
||||
#define ZPOOL_CONFIG_SPLIT_GUID "split_guid"
|
||||
#define ZPOOL_CONFIG_SPLIT_LIST "guid_list"
|
||||
#define ZPOOL_CONFIG_NONALLOCATING "non_allocating"
|
||||
#define ZPOOL_CONFIG_REMOVING "removing"
|
||||
#define ZPOOL_CONFIG_RESILVER_TXG "resilver_txg"
|
||||
#define ZPOOL_CONFIG_REBUILD_TXG "rebuild_txg"
|
||||
@ -1109,6 +1181,7 @@ typedef struct vdev_stat {
|
||||
uint64_t vs_configured_ashift; /* TLV vdev_ashift */
|
||||
uint64_t vs_logical_ashift; /* vdev_logical_ashift */
|
||||
uint64_t vs_physical_ashift; /* vdev_physical_ashift */
|
||||
uint64_t vs_noalloc; /* allocations halted? */
|
||||
} vdev_stat_t;
|
||||
|
||||
/* BEGIN CSTYLED */
|
||||
@ -1362,6 +1435,8 @@ typedef enum zfs_ioc {
|
||||
ZFS_IOC_GET_BOOKMARK_PROPS, /* 0x5a52 */
|
||||
ZFS_IOC_WAIT, /* 0x5a53 */
|
||||
ZFS_IOC_WAIT_FS, /* 0x5a54 */
|
||||
ZFS_IOC_VDEV_GET_PROPS, /* 0x5a55 */
|
||||
ZFS_IOC_VDEV_SET_PROPS, /* 0x5a56 */
|
||||
|
||||
/*
|
||||
* Per-platform (Optional) - 8/128 numbers reserved.
|
||||
@ -1417,6 +1492,7 @@ typedef enum {
|
||||
ZFS_ERR_RESILVER_IN_PROGRESS,
|
||||
ZFS_ERR_REBUILD_IN_PROGRESS,
|
||||
ZFS_ERR_BADPROP,
|
||||
ZFS_ERR_VDEV_NOTSUP,
|
||||
} zfs_errno_t;
|
||||
|
||||
/*
|
||||
@ -1508,6 +1584,18 @@ typedef enum {
|
||||
#define ZPOOL_WAIT_TAG "wait_tag"
|
||||
#define ZPOOL_WAIT_WAITED "wait_waited"
|
||||
|
||||
/*
|
||||
* The following are names used when invoking ZFS_IOC_VDEV_GET_PROP.
|
||||
*/
|
||||
#define ZPOOL_VDEV_PROPS_GET_VDEV "vdevprops_get_vdev"
|
||||
#define ZPOOL_VDEV_PROPS_GET_PROPS "vdevprops_get_props"
|
||||
|
||||
/*
|
||||
* The following are names used when invoking ZFS_IOC_VDEV_SET_PROP.
|
||||
*/
|
||||
#define ZPOOL_VDEV_PROPS_SET_VDEV "vdevprops_set_vdev"
|
||||
#define ZPOOL_VDEV_PROPS_SET_PROPS "vdevprops_set_props"
|
||||
|
||||
/*
|
||||
* The following are names used when invoking ZFS_IOC_WAIT_FS.
|
||||
*/
|
||||
|
@ -154,7 +154,7 @@ _SYS_NVPAIR_H void nvlist_free(nvlist_t *);
|
||||
_SYS_NVPAIR_H int nvlist_size(nvlist_t *, size_t *, int);
|
||||
_SYS_NVPAIR_H int nvlist_pack(nvlist_t *, char **, size_t *, int, int);
|
||||
_SYS_NVPAIR_H int nvlist_unpack(char *, size_t, nvlist_t **, int);
|
||||
_SYS_NVPAIR_H int nvlist_dup(nvlist_t *, nvlist_t **, int);
|
||||
_SYS_NVPAIR_H int nvlist_dup(const nvlist_t *, nvlist_t **, int);
|
||||
_SYS_NVPAIR_H int nvlist_merge(nvlist_t *, nvlist_t *, int);
|
||||
|
||||
_SYS_NVPAIR_H uint_t nvlist_nvflag(nvlist_t *);
|
||||
@ -163,7 +163,7 @@ _SYS_NVPAIR_H int nvlist_xalloc(nvlist_t **, uint_t, nv_alloc_t *);
|
||||
_SYS_NVPAIR_H int nvlist_xpack(nvlist_t *, char **, size_t *, int,
|
||||
nv_alloc_t *);
|
||||
_SYS_NVPAIR_H int nvlist_xunpack(char *, size_t, nvlist_t **, nv_alloc_t *);
|
||||
_SYS_NVPAIR_H int nvlist_xdup(nvlist_t *, nvlist_t **, nv_alloc_t *);
|
||||
_SYS_NVPAIR_H int nvlist_xdup(const nvlist_t *, nvlist_t **, nv_alloc_t *);
|
||||
_SYS_NVPAIR_H nv_alloc_t *nvlist_lookup_nv_alloc(nvlist_t *);
|
||||
|
||||
_SYS_NVPAIR_H int nvlist_add_nvpair(nvlist_t *, nvpair_t *);
|
||||
@ -179,31 +179,31 @@ _SYS_NVPAIR_H int nvlist_add_uint32(nvlist_t *, const char *, uint32_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_int64(nvlist_t *, const char *, int64_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_uint64(nvlist_t *, const char *, uint64_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_string(nvlist_t *, const char *, const char *);
|
||||
_SYS_NVPAIR_H int nvlist_add_nvlist(nvlist_t *, const char *, nvlist_t *);
|
||||
_SYS_NVPAIR_H int nvlist_add_nvlist(nvlist_t *, const char *, const nvlist_t *);
|
||||
_SYS_NVPAIR_H int nvlist_add_boolean_array(nvlist_t *, const char *,
|
||||
boolean_t *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_byte_array(nvlist_t *, const char *, uchar_t *,
|
||||
uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_int8_array(nvlist_t *, const char *, int8_t *,
|
||||
uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_uint8_array(nvlist_t *, const char *, uint8_t *,
|
||||
uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_int16_array(nvlist_t *, const char *, int16_t *,
|
||||
uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_uint16_array(nvlist_t *, const char *, uint16_t *,
|
||||
uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_int32_array(nvlist_t *, const char *, int32_t *,
|
||||
uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_uint32_array(nvlist_t *, const char *, uint32_t *,
|
||||
uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_int64_array(nvlist_t *, const char *, int64_t *,
|
||||
uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_uint64_array(nvlist_t *, const char *, uint64_t *,
|
||||
uint_t);
|
||||
const boolean_t *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_byte_array(nvlist_t *, const char *,
|
||||
const uchar_t *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_int8_array(nvlist_t *, const char *,
|
||||
const int8_t *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_uint8_array(nvlist_t *, const char *,
|
||||
const uint8_t *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_int16_array(nvlist_t *, const char *,
|
||||
const int16_t *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_uint16_array(nvlist_t *, const char *,
|
||||
const uint16_t *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_int32_array(nvlist_t *, const char *,
|
||||
const int32_t *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_uint32_array(nvlist_t *, const char *,
|
||||
const uint32_t *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_int64_array(nvlist_t *, const char *,
|
||||
const int64_t *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_uint64_array(nvlist_t *, const char *,
|
||||
const uint64_t *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_string_array(nvlist_t *, const char *,
|
||||
char * const *, uint_t);
|
||||
const char * const *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_nvlist_array(nvlist_t *, const char *,
|
||||
nvlist_t **, uint_t);
|
||||
const nvlist_t * const *, uint_t);
|
||||
_SYS_NVPAIR_H int nvlist_add_hrtime(nvlist_t *, const char *, hrtime_t);
|
||||
#if !defined(_KERNEL) && !defined(_STANDALONE)
|
||||
_SYS_NVPAIR_H int nvlist_add_double(nvlist_t *, const char *, double);
|
||||
@ -213,18 +213,25 @@ _SYS_NVPAIR_H int nvlist_remove(nvlist_t *, const char *, data_type_t);
|
||||
_SYS_NVPAIR_H int nvlist_remove_all(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H int nvlist_remove_nvpair(nvlist_t *, nvpair_t *);
|
||||
|
||||
_SYS_NVPAIR_H int nvlist_lookup_boolean(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_boolean_value(nvlist_t *, const char *,
|
||||
_SYS_NVPAIR_H int nvlist_lookup_boolean(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_boolean_value(const nvlist_t *, const char *,
|
||||
boolean_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_byte(nvlist_t *, const char *, uchar_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_int8(nvlist_t *, const char *, int8_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_uint8(nvlist_t *, const char *, uint8_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_int16(nvlist_t *, const char *, int16_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_uint16(nvlist_t *, const char *, uint16_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_int32(nvlist_t *, const char *, int32_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_uint32(nvlist_t *, const char *, uint32_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_int64(nvlist_t *, const char *, int64_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_uint64(nvlist_t *, const char *, uint64_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_byte(const nvlist_t *, const char *, uchar_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_int8(const nvlist_t *, const char *, int8_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_uint8(const nvlist_t *, const char *,
|
||||
uint8_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_int16(const nvlist_t *, const char *,
|
||||
int16_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_uint16(const nvlist_t *, const char *,
|
||||
uint16_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_int32(const nvlist_t *, const char *,
|
||||
int32_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_uint32(const nvlist_t *, const char *,
|
||||
uint32_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_int64(const nvlist_t *, const char *,
|
||||
int64_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_uint64(const nvlist_t *, const char *,
|
||||
uint64_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_string(nvlist_t *, const char *, char **);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_nvlist(nvlist_t *, const char *, nvlist_t **);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_boolean_array(nvlist_t *, const char *,
|
||||
@ -254,31 +261,32 @@ _SYS_NVPAIR_H int nvlist_lookup_nvlist_array(nvlist_t *, const char *,
|
||||
_SYS_NVPAIR_H int nvlist_lookup_hrtime(nvlist_t *, const char *, hrtime_t *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_pairs(nvlist_t *, int, ...);
|
||||
#if !defined(_KERNEL) && !defined(_STANDALONE)
|
||||
_SYS_NVPAIR_H int nvlist_lookup_double(nvlist_t *, const char *, double *);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_double(const nvlist_t *, const char *,
|
||||
double *);
|
||||
#endif
|
||||
|
||||
_SYS_NVPAIR_H int nvlist_lookup_nvpair(nvlist_t *, const char *, nvpair_t **);
|
||||
_SYS_NVPAIR_H int nvlist_lookup_nvpair_embedded_index(nvlist_t *, const char *,
|
||||
nvpair_t **, int *, char **);
|
||||
_SYS_NVPAIR_H boolean_t nvlist_exists(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H boolean_t nvlist_empty(nvlist_t *);
|
||||
_SYS_NVPAIR_H boolean_t nvlist_exists(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H boolean_t nvlist_empty(const nvlist_t *);
|
||||
|
||||
/* processing nvpair */
|
||||
_SYS_NVPAIR_H nvpair_t *nvlist_next_nvpair(nvlist_t *, nvpair_t *);
|
||||
_SYS_NVPAIR_H nvpair_t *nvlist_prev_nvpair(nvlist_t *, nvpair_t *);
|
||||
_SYS_NVPAIR_H char *nvpair_name(nvpair_t *);
|
||||
_SYS_NVPAIR_H data_type_t nvpair_type(nvpair_t *);
|
||||
_SYS_NVPAIR_H int nvpair_type_is_array(nvpair_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_boolean_value(nvpair_t *, boolean_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_byte(nvpair_t *, uchar_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_int8(nvpair_t *, int8_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_uint8(nvpair_t *, uint8_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_int16(nvpair_t *, int16_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_uint16(nvpair_t *, uint16_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_int32(nvpair_t *, int32_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_uint32(nvpair_t *, uint32_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_int64(nvpair_t *, int64_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_uint64(nvpair_t *, uint64_t *);
|
||||
_SYS_NVPAIR_H nvpair_t *nvlist_next_nvpair(nvlist_t *, const nvpair_t *);
|
||||
_SYS_NVPAIR_H nvpair_t *nvlist_prev_nvpair(nvlist_t *, const nvpair_t *);
|
||||
_SYS_NVPAIR_H char *nvpair_name(const nvpair_t *);
|
||||
_SYS_NVPAIR_H data_type_t nvpair_type(const nvpair_t *);
|
||||
_SYS_NVPAIR_H int nvpair_type_is_array(const nvpair_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_boolean_value(const nvpair_t *, boolean_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_byte(const nvpair_t *, uchar_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_int8(const nvpair_t *, int8_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_uint8(const nvpair_t *, uint8_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_int16(const nvpair_t *, int16_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_uint16(const nvpair_t *, uint16_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_int32(const nvpair_t *, int32_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_uint32(const nvpair_t *, uint32_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_int64(const nvpair_t *, int64_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_uint64(const nvpair_t *, uint64_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_string(nvpair_t *, char **);
|
||||
_SYS_NVPAIR_H int nvpair_value_nvlist(nvpair_t *, nvlist_t **);
|
||||
_SYS_NVPAIR_H int nvpair_value_boolean_array(nvpair_t *, boolean_t **,
|
||||
@ -296,7 +304,7 @@ _SYS_NVPAIR_H int nvpair_value_string_array(nvpair_t *, char ***, uint_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_nvlist_array(nvpair_t *, nvlist_t ***, uint_t *);
|
||||
_SYS_NVPAIR_H int nvpair_value_hrtime(nvpair_t *, hrtime_t *);
|
||||
#if !defined(_KERNEL) && !defined(_STANDALONE)
|
||||
_SYS_NVPAIR_H int nvpair_value_double(nvpair_t *, double *);
|
||||
_SYS_NVPAIR_H int nvpair_value_double(const nvpair_t *, double *);
|
||||
#endif
|
||||
|
||||
_SYS_NVPAIR_H nvlist_t *fnvlist_alloc(void);
|
||||
@ -305,7 +313,7 @@ _SYS_NVPAIR_H size_t fnvlist_size(nvlist_t *);
|
||||
_SYS_NVPAIR_H char *fnvlist_pack(nvlist_t *, size_t *);
|
||||
_SYS_NVPAIR_H void fnvlist_pack_free(char *, size_t);
|
||||
_SYS_NVPAIR_H nvlist_t *fnvlist_unpack(char *, size_t);
|
||||
_SYS_NVPAIR_H nvlist_t *fnvlist_dup(nvlist_t *);
|
||||
_SYS_NVPAIR_H nvlist_t *fnvlist_dup(const nvlist_t *);
|
||||
_SYS_NVPAIR_H void fnvlist_merge(nvlist_t *, nvlist_t *);
|
||||
_SYS_NVPAIR_H size_t fnvlist_num_pairs(nvlist_t *);
|
||||
|
||||
@ -325,45 +333,46 @@ _SYS_NVPAIR_H void fnvlist_add_string(nvlist_t *, const char *, const char *);
|
||||
_SYS_NVPAIR_H void fnvlist_add_nvlist(nvlist_t *, const char *, nvlist_t *);
|
||||
_SYS_NVPAIR_H void fnvlist_add_nvpair(nvlist_t *, nvpair_t *);
|
||||
_SYS_NVPAIR_H void fnvlist_add_boolean_array(nvlist_t *, const char *,
|
||||
boolean_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_byte_array(nvlist_t *, const char *, uchar_t *,
|
||||
uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_int8_array(nvlist_t *, const char *, int8_t *,
|
||||
uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_uint8_array(nvlist_t *, const char *, uint8_t *,
|
||||
uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_int16_array(nvlist_t *, const char *, int16_t *,
|
||||
uint_t);
|
||||
const boolean_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_byte_array(nvlist_t *, const char *,
|
||||
const uchar_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_int8_array(nvlist_t *, const char *,
|
||||
const int8_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_uint8_array(nvlist_t *, const char *,
|
||||
const uint8_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_int16_array(nvlist_t *, const char *,
|
||||
const int16_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_uint16_array(nvlist_t *, const char *,
|
||||
uint16_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_int32_array(nvlist_t *, const char *, int32_t *,
|
||||
uint_t);
|
||||
const uint16_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_int32_array(nvlist_t *, const char *,
|
||||
const int32_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_uint32_array(nvlist_t *, const char *,
|
||||
uint32_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_int64_array(nvlist_t *, const char *, int64_t *,
|
||||
uint_t);
|
||||
const uint32_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_int64_array(nvlist_t *, const char *,
|
||||
const int64_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_uint64_array(nvlist_t *, const char *,
|
||||
uint64_t *, uint_t);
|
||||
const uint64_t *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_string_array(nvlist_t *, const char *,
|
||||
char * const *, uint_t);
|
||||
const char * const *, uint_t);
|
||||
_SYS_NVPAIR_H void fnvlist_add_nvlist_array(nvlist_t *, const char *,
|
||||
nvlist_t **, uint_t);
|
||||
const nvlist_t * const *, uint_t);
|
||||
|
||||
_SYS_NVPAIR_H void fnvlist_remove(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H void fnvlist_remove_nvpair(nvlist_t *, nvpair_t *);
|
||||
|
||||
_SYS_NVPAIR_H nvpair_t *fnvlist_lookup_nvpair(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H boolean_t fnvlist_lookup_boolean(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H boolean_t fnvlist_lookup_boolean_value(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H uchar_t fnvlist_lookup_byte(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H int8_t fnvlist_lookup_int8(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H int16_t fnvlist_lookup_int16(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H int32_t fnvlist_lookup_int32(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H int64_t fnvlist_lookup_int64(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H uint8_t fnvlist_lookup_uint8(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H uint16_t fnvlist_lookup_uint16(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H uint32_t fnvlist_lookup_uint32(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H uint64_t fnvlist_lookup_uint64(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H boolean_t fnvlist_lookup_boolean(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H boolean_t fnvlist_lookup_boolean_value(const nvlist_t *,
|
||||
const char *);
|
||||
_SYS_NVPAIR_H uchar_t fnvlist_lookup_byte(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H int8_t fnvlist_lookup_int8(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H int16_t fnvlist_lookup_int16(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H int32_t fnvlist_lookup_int32(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H int64_t fnvlist_lookup_int64(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H uint8_t fnvlist_lookup_uint8(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H uint16_t fnvlist_lookup_uint16(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H uint32_t fnvlist_lookup_uint32(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H uint64_t fnvlist_lookup_uint64(const nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H char *fnvlist_lookup_string(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H nvlist_t *fnvlist_lookup_nvlist(nvlist_t *, const char *);
|
||||
_SYS_NVPAIR_H boolean_t *fnvlist_lookup_boolean_array(nvlist_t *, const char *,
|
||||
@ -387,16 +396,16 @@ _SYS_NVPAIR_H int64_t *fnvlist_lookup_int64_array(nvlist_t *, const char *,
|
||||
_SYS_NVPAIR_H uint64_t *fnvlist_lookup_uint64_array(nvlist_t *, const char *,
|
||||
uint_t *);
|
||||
|
||||
_SYS_NVPAIR_H boolean_t fnvpair_value_boolean_value(nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H uchar_t fnvpair_value_byte(nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H int8_t fnvpair_value_int8(nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H int16_t fnvpair_value_int16(nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H int32_t fnvpair_value_int32(nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H int64_t fnvpair_value_int64(nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H uint8_t fnvpair_value_uint8(nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H uint16_t fnvpair_value_uint16(nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H uint32_t fnvpair_value_uint32(nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H uint64_t fnvpair_value_uint64(nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H boolean_t fnvpair_value_boolean_value(const nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H uchar_t fnvpair_value_byte(const nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H int8_t fnvpair_value_int8(const nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H int16_t fnvpair_value_int16(const nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H int32_t fnvpair_value_int32(const nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H int64_t fnvpair_value_int64(const nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H uint8_t fnvpair_value_uint8(const nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H uint16_t fnvpair_value_uint16(const nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H uint32_t fnvpair_value_uint32(const nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H uint64_t fnvpair_value_uint64(const nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H char *fnvpair_value_string(nvpair_t *nvp);
|
||||
_SYS_NVPAIR_H nvlist_t *fnvpair_value_nvlist(nvpair_t *nvp);
|
||||
|
||||
|
@ -74,7 +74,7 @@ struct i_nvp {
|
||||
typedef struct {
|
||||
i_nvp_t *nvp_list; /* linked list of nvpairs */
|
||||
i_nvp_t *nvp_last; /* last nvpair */
|
||||
i_nvp_t *nvp_curr; /* current walker nvpair */
|
||||
const i_nvp_t *nvp_curr; /* current walker nvpair */
|
||||
nv_alloc_t *nvp_nva; /* pluggable allocator */
|
||||
uint32_t nvp_stat; /* internal state */
|
||||
|
||||
|
@ -792,7 +792,8 @@ extern int spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot,
|
||||
int replacing, int rebuild);
|
||||
extern int spa_vdev_detach(spa_t *spa, uint64_t guid, uint64_t pguid,
|
||||
int replace_done);
|
||||
extern int spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare);
|
||||
extern int spa_vdev_alloc(spa_t *spa, uint64_t guid);
|
||||
extern int spa_vdev_noalloc(spa_t *spa, uint64_t guid);
|
||||
extern boolean_t spa_vdev_remove_active(spa_t *spa);
|
||||
extern int spa_vdev_initialize(spa_t *spa, nvlist_t *nv, uint64_t cmd_type,
|
||||
nvlist_t *vdev_errlist);
|
||||
|
@ -308,6 +308,7 @@ struct spa {
|
||||
uint64_t spa_missing_tvds; /* unopenable tvds on load */
|
||||
uint64_t spa_missing_tvds_allowed; /* allow loading spa? */
|
||||
|
||||
uint64_t spa_nonallocating_dspace;
|
||||
spa_removing_phys_t spa_removing_phys;
|
||||
spa_vdev_removal_t *spa_vdev_removal;
|
||||
|
||||
|
@ -219,6 +219,9 @@ typedef enum {
|
||||
|
||||
extern int vdev_label_init(vdev_t *vd, uint64_t txg, vdev_labeltype_t reason);
|
||||
|
||||
extern int vdev_prop_set(vdev_t *vd, nvlist_t *innvl, nvlist_t *outnvl);
|
||||
extern int vdev_prop_get(vdev_t *vd, nvlist_t *nvprops, nvlist_t *outnvl);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -295,6 +295,7 @@ struct vdev {
|
||||
list_node_t vdev_state_dirty_node; /* state dirty list */
|
||||
uint64_t vdev_deflate_ratio; /* deflation ratio (x512) */
|
||||
uint64_t vdev_islog; /* is an intent log device */
|
||||
uint64_t vdev_noalloc; /* device is passivated? */
|
||||
uint64_t vdev_removing; /* device is being removed? */
|
||||
boolean_t vdev_ishole; /* is a hole in the namespace */
|
||||
uint64_t vdev_top_zap;
|
||||
|
@ -39,6 +39,7 @@ _SYS_ZFS_SYSFS_H boolean_t zfs_mod_supported(const char *, const char *);
|
||||
#endif
|
||||
|
||||
#define ZFS_SYSFS_POOL_PROPERTIES "properties.pool"
|
||||
#define ZFS_SYSFS_VDEV_PROPERTIES "properties.vdev"
|
||||
#define ZFS_SYSFS_DATASET_PROPERTIES "properties.dataset"
|
||||
#define ZFS_SYSFS_KERNEL_FEATURES "features.kernel"
|
||||
#define ZFS_SYSFS_POOL_FEATURES "features.pool"
|
||||
|
@ -99,6 +99,13 @@ _ZFS_PROP_H void zpool_prop_init(void);
|
||||
_ZFS_PROP_H zprop_type_t zpool_prop_get_type(zpool_prop_t);
|
||||
_ZFS_PROP_H zprop_desc_t *zpool_prop_get_table(void);
|
||||
|
||||
/*
|
||||
* vdev property functions
|
||||
*/
|
||||
_ZFS_PROP_H void vdev_prop_init(void);
|
||||
_ZFS_PROP_H zprop_type_t vdev_prop_get_type(vdev_prop_t prop);
|
||||
_ZFS_PROP_H zprop_desc_t *vdev_prop_get_table(void);
|
||||
|
||||
/*
|
||||
* Common routines to initialize property tables
|
||||
*/
|
||||
@ -122,11 +129,13 @@ _ZFS_PROP_H int zprop_iter_common(zprop_func, void *, boolean_t, boolean_t,
|
||||
_ZFS_PROP_H int zprop_name_to_prop(const char *, zfs_type_t);
|
||||
_ZFS_PROP_H int zprop_string_to_index(int, const char *, uint64_t *,
|
||||
zfs_type_t);
|
||||
_ZFS_PROP_H int zprop_index_to_string(int, uint64_t, const char **, zfs_type_t);
|
||||
_ZFS_PROP_H int zprop_index_to_string(int, uint64_t, const char **,
|
||||
zfs_type_t);
|
||||
_ZFS_PROP_H uint64_t zprop_random_value(int, uint64_t, zfs_type_t);
|
||||
_ZFS_PROP_H const char *zprop_values(int, zfs_type_t);
|
||||
_ZFS_PROP_H size_t zprop_width(int, boolean_t *, zfs_type_t);
|
||||
_ZFS_PROP_H boolean_t zprop_valid_for_type(int, zfs_type_t, boolean_t);
|
||||
_ZFS_PROP_H int zprop_valid_char(char c);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -3,6 +3,8 @@
|
||||
<dependency name='libc.so.6'/>
|
||||
</elf-needed>
|
||||
<elf-function-symbols>
|
||||
<elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='dump_nvlist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='fnvlist_add_boolean' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='fnvlist_add_boolean_array' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -262,7 +264,7 @@
|
||||
<return type-id='5ce45b60'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_dup' mangled-name='fnvlist_dup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_dup'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<return type-id='5ce45b60'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_merge' mangled-name='fnvlist_merge' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_merge'>
|
||||
@ -359,84 +361,84 @@
|
||||
<function-decl name='fnvlist_add_boolean_array' mangled-name='fnvlist_add_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_boolean_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='37e3bd22' name='val'/>
|
||||
<parameter type-id='c5f6c15b' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_byte_array' mangled-name='fnvlist_add_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_byte_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='45b65157' name='val'/>
|
||||
<parameter type-id='d1db479e' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_int8_array' mangled-name='fnvlist_add_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int8_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='256d5229' name='val'/>
|
||||
<parameter type-id='a06445da' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_uint8_array' mangled-name='fnvlist_add_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint8_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='ae3e8ca6' name='val'/>
|
||||
<parameter type-id='9f7200cf' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_int16_array' mangled-name='fnvlist_add_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int16_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='f76f73d0' name='val'/>
|
||||
<parameter type-id='a3eb883d' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_uint16_array' mangled-name='fnvlist_add_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint16_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='8a121f49' name='val'/>
|
||||
<parameter type-id='1b7d11c6' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_int32_array' mangled-name='fnvlist_add_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int32_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='4aafb922' name='val'/>
|
||||
<parameter type-id='1f526493' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_uint32_array' mangled-name='fnvlist_add_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint32_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='90421557' name='val'/>
|
||||
<parameter type-id='a6798dcc' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_int64_array' mangled-name='fnvlist_add_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int64_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='cb785ebf' name='val'/>
|
||||
<parameter type-id='505bed1a' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_uint64_array' mangled-name='fnvlist_add_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint64_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='5d6479ae' name='val'/>
|
||||
<parameter type-id='713a56f5' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_string_array' mangled-name='fnvlist_add_string_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_string_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='f319fae0' name='val'/>
|
||||
<parameter type-id='13956559' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_nvlist_array' mangled-name='fnvlist_add_nvlist_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_nvlist_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='857bb57e' name='val'/>
|
||||
<parameter type-id='3bbfee2e' name='val'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
@ -456,57 +458,57 @@
|
||||
<return type-id='3fa542f0'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_lookup_boolean' mangled-name='fnvlist_lookup_boolean' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_boolean'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_lookup_boolean_value' mangled-name='fnvlist_lookup_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_boolean_value'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_lookup_byte' mangled-name='fnvlist_lookup_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_byte'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='d8bf0010'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_lookup_int8' mangled-name='fnvlist_lookup_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int8'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='ee31ee44'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_lookup_int16' mangled-name='fnvlist_lookup_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int16'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='23bd8cb5'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_lookup_int32' mangled-name='fnvlist_lookup_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int32'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='3ff5601b'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_lookup_int64' mangled-name='fnvlist_lookup_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int64'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='9da381c4'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_lookup_uint8' mangled-name='fnvlist_lookup_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint8'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='b96825af'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_lookup_uint16' mangled-name='fnvlist_lookup_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint16'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='149c6638'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_lookup_uint32' mangled-name='fnvlist_lookup_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint32'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='8f92235e'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_lookup_uint64' mangled-name='fnvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint64'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='9c313c2d'/>
|
||||
</function-decl>
|
||||
@ -581,43 +583,43 @@
|
||||
<return type-id='5d6479ae'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvpair_value_boolean_value' mangled-name='fnvpair_value_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_boolean_value'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvpair_value_byte' mangled-name='fnvpair_value_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_byte'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='d8bf0010'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvpair_value_int8' mangled-name='fnvpair_value_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int8'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='ee31ee44'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvpair_value_int16' mangled-name='fnvpair_value_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int16'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='23bd8cb5'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvpair_value_int32' mangled-name='fnvpair_value_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int32'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='3ff5601b'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvpair_value_int64' mangled-name='fnvpair_value_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int64'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='9da381c4'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvpair_value_uint8' mangled-name='fnvpair_value_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint8'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='b96825af'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvpair_value_uint16' mangled-name='fnvpair_value_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint16'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='149c6638'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvpair_value_uint32' mangled-name='fnvpair_value_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint32'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='8f92235e'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvpair_value_uint64' mangled-name='fnvpair_value_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint64'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='9c313c2d'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvpair_value_string' mangled-name='fnvpair_value_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_string'>
|
||||
@ -631,9 +633,35 @@
|
||||
</abi-instr>
|
||||
<abi-instr address-size='64' path='../../module/nvpair/nvpair.c' language='LANG_C99'>
|
||||
<pointer-type-def type-id='37e3bd22' size-in-bits='64' id='03829398'/>
|
||||
<qualified-type-def type-id='26a90f95' const='yes' id='57de658a'/>
|
||||
<pointer-type-def type-id='57de658a' size-in-bits='64' id='f319fae0'/>
|
||||
<pointer-type-def type-id='9b23c9ad' size-in-bits='64' id='c0563f85'/>
|
||||
<qualified-type-def type-id='c19b74c3' const='yes' id='12373e33'/>
|
||||
<pointer-type-def type-id='12373e33' size-in-bits='64' id='c5f6c15b'/>
|
||||
<qualified-type-def type-id='80f4b756' const='yes' id='b99c00c9'/>
|
||||
<pointer-type-def type-id='b99c00c9' size-in-bits='64' id='13956559'/>
|
||||
<qualified-type-def type-id='23bd8cb5' const='yes' id='75f7b0c5'/>
|
||||
<pointer-type-def type-id='75f7b0c5' size-in-bits='64' id='a3eb883d'/>
|
||||
<qualified-type-def type-id='3ff5601b' const='yes' id='922df12b'/>
|
||||
<pointer-type-def type-id='922df12b' size-in-bits='64' id='1f526493'/>
|
||||
<qualified-type-def type-id='9da381c4' const='yes' id='f07b7694'/>
|
||||
<pointer-type-def type-id='f07b7694' size-in-bits='64' id='505bed1a'/>
|
||||
<qualified-type-def type-id='ee31ee44' const='yes' id='721c32d4'/>
|
||||
<pointer-type-def type-id='721c32d4' size-in-bits='64' id='a06445da'/>
|
||||
<qualified-type-def type-id='8e8d4be3' const='yes' id='693c3853'/>
|
||||
<pointer-type-def type-id='693c3853' size-in-bits='64' id='22cce67b'/>
|
||||
<qualified-type-def type-id='22cce67b' const='yes' id='d2816df0'/>
|
||||
<pointer-type-def type-id='d2816df0' size-in-bits='64' id='3bbfee2e'/>
|
||||
<qualified-type-def type-id='57928edf' const='yes' id='642ee20f'/>
|
||||
<pointer-type-def type-id='642ee20f' size-in-bits='64' id='dace003f'/>
|
||||
<qualified-type-def type-id='d8bf0010' const='yes' id='a9125480'/>
|
||||
<pointer-type-def type-id='a9125480' size-in-bits='64' id='d1db479e'/>
|
||||
<qualified-type-def type-id='149c6638' const='yes' id='b01a5ac8'/>
|
||||
<pointer-type-def type-id='b01a5ac8' size-in-bits='64' id='1b7d11c6'/>
|
||||
<qualified-type-def type-id='8f92235e' const='yes' id='b9930aae'/>
|
||||
<pointer-type-def type-id='b9930aae' size-in-bits='64' id='a6798dcc'/>
|
||||
<qualified-type-def type-id='9c313c2d' const='yes' id='c3b7ba7d'/>
|
||||
<pointer-type-def type-id='c3b7ba7d' size-in-bits='64' id='713a56f5'/>
|
||||
<qualified-type-def type-id='b96825af' const='yes' id='2b61797f'/>
|
||||
<pointer-type-def type-id='2b61797f' size-in-bits='64' id='9f7200cf'/>
|
||||
<pointer-type-def type-id='a0eb0f08' size-in-bits='64' id='7408d286'/>
|
||||
<pointer-type-def type-id='cebdd548' size-in-bits='64' id='e379e62d'/>
|
||||
<pointer-type-def type-id='95e97e5e' size-in-bits='64' id='7292109c'/>
|
||||
@ -689,13 +717,13 @@
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_dup' mangled-name='nvlist_dup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_dup'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='857bb57e' name='nvlp'/>
|
||||
<parameter type-id='95e97e5e' name='kmflag'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_xdup' mangled-name='nvlist_xdup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_xdup'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='857bb57e' name='nvlp'/>
|
||||
<parameter type-id='11871392' name='nva'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
@ -796,77 +824,77 @@
|
||||
<function-decl name='nvlist_add_boolean_array' mangled-name='nvlist_add_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_boolean_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='37e3bd22' name='a'/>
|
||||
<parameter type-id='c5f6c15b' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_byte_array' mangled-name='nvlist_add_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_byte_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='45b65157' name='a'/>
|
||||
<parameter type-id='d1db479e' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int8_array' mangled-name='nvlist_add_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int8_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='256d5229' name='a'/>
|
||||
<parameter type-id='a06445da' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint8_array' mangled-name='nvlist_add_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint8_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='ae3e8ca6' name='a'/>
|
||||
<parameter type-id='9f7200cf' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int16_array' mangled-name='nvlist_add_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int16_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='f76f73d0' name='a'/>
|
||||
<parameter type-id='a3eb883d' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint16_array' mangled-name='nvlist_add_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint16_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='8a121f49' name='a'/>
|
||||
<parameter type-id='1b7d11c6' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int32_array' mangled-name='nvlist_add_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int32_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='4aafb922' name='a'/>
|
||||
<parameter type-id='1f526493' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint32_array' mangled-name='nvlist_add_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint32_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='90421557' name='a'/>
|
||||
<parameter type-id='a6798dcc' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int64_array' mangled-name='nvlist_add_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int64_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='cb785ebf' name='a'/>
|
||||
<parameter type-id='505bed1a' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint64_array' mangled-name='nvlist_add_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint64_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='5d6479ae' name='a'/>
|
||||
<parameter type-id='713a56f5' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_string_array' mangled-name='nvlist_add_string_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_string_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='f319fae0' name='a'/>
|
||||
<parameter type-id='13956559' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
@ -879,109 +907,109 @@
|
||||
<function-decl name='nvlist_add_nvlist' mangled-name='nvlist_add_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_nvlist'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='5ce45b60' name='val'/>
|
||||
<parameter type-id='22cce67b' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_nvlist_array' mangled-name='nvlist_add_nvlist_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_nvlist_array'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='857bb57e' name='a'/>
|
||||
<parameter type-id='3bbfee2e' name='a'/>
|
||||
<parameter type-id='3502e3ff' name='n'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_next_nvpair' mangled-name='nvlist_next_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_next_nvpair'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='3fa542f0'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_prev_nvpair' mangled-name='nvlist_prev_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_prev_nvpair'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='3fa542f0'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_empty' mangled-name='nvlist_empty' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_empty'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_name' mangled-name='nvpair_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_name'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='26a90f95'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_type' mangled-name='nvpair_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_type'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='8d0687d2'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_type_is_array' mangled-name='nvpair_type_is_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_type_is_array'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_boolean' mangled-name='nvlist_lookup_boolean' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_boolean'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_boolean_value' mangled-name='nvlist_lookup_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_boolean_value'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='37e3bd22' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_byte' mangled-name='nvlist_lookup_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_byte'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='45b65157' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_int8' mangled-name='nvlist_lookup_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int8'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='256d5229' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_uint8' mangled-name='nvlist_lookup_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint8'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='ae3e8ca6' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_int16' mangled-name='nvlist_lookup_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int16'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='f76f73d0' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_uint16' mangled-name='nvlist_lookup_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint16'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='8a121f49' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_int32' mangled-name='nvlist_lookup_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int32'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='4aafb922' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_uint32' mangled-name='nvlist_lookup_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint32'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='90421557' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_int64' mangled-name='nvlist_lookup_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int64'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='cb785ebf' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_uint64' mangled-name='nvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint64'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='5d6479ae' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_double' mangled-name='nvlist_lookup_double' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_double'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<parameter type-id='7408d286' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
@ -1109,62 +1137,62 @@
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_exists' mangled-name='nvlist_exists' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_exists'>
|
||||
<parameter type-id='5ce45b60' name='nvl'/>
|
||||
<parameter type-id='22cce67b' name='nvl'/>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_value_boolean_value' mangled-name='nvpair_value_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_boolean_value'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<parameter type-id='37e3bd22' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_value_byte' mangled-name='nvpair_value_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_byte'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<parameter type-id='45b65157' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_value_int8' mangled-name='nvpair_value_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int8'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<parameter type-id='256d5229' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_value_uint8' mangled-name='nvpair_value_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint8'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<parameter type-id='ae3e8ca6' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_value_int16' mangled-name='nvpair_value_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int16'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<parameter type-id='f76f73d0' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_value_uint16' mangled-name='nvpair_value_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint16'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<parameter type-id='8a121f49' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_value_int32' mangled-name='nvpair_value_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int32'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<parameter type-id='4aafb922' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_value_uint32' mangled-name='nvpair_value_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint32'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<parameter type-id='90421557' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_value_int64' mangled-name='nvpair_value_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int64'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<parameter type-id='cb785ebf' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_value_uint64' mangled-name='nvpair_value_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint64'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<parameter type-id='5d6479ae' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvpair_value_double' mangled-name='nvpair_value_double' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_double'>
|
||||
<parameter type-id='3fa542f0' name='nvp'/>
|
||||
<parameter type-id='dace003f' name='nvp'/>
|
||||
<parameter type-id='7408d286' name='val'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
@ -1314,10 +1342,6 @@
|
||||
<array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'>
|
||||
<subrange length='20' type-id='7359adad' id='fdca39cf'/>
|
||||
</array-type-def>
|
||||
<class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/>
|
||||
<class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/>
|
||||
<class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/>
|
||||
<class-decl name='re_dfa_t' is-struct='yes' visibility='default' is-declaration-only='yes' id='b48d2441'/>
|
||||
<type-decl name='double' size-in-bits='64' id='a0eb0f08'/>
|
||||
<type-decl name='int' size-in-bits='32' id='95e97e5e'/>
|
||||
<type-decl name='long int' size-in-bits='64' id='bd54fe1a'/>
|
||||
@ -1330,7 +1354,6 @@
|
||||
<type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/>
|
||||
<type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/>
|
||||
<type-decl name='variadic parameter type' id='2c1145c5'/>
|
||||
<type-decl name='void' id='48b5725f'/>
|
||||
<typedef-decl name='nvlist_prtctl_t' type-id='196db161' id='b0c1ff8d'/>
|
||||
<enum-decl name='nvlist_indent_mode' id='628aafab'>
|
||||
<underlying-type type-id='9cac1fee'/>
|
||||
@ -1752,17 +1775,16 @@
|
||||
<var-decl name='nvprt_custops' type-id='7be54adb' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__re_long_size_t' type-id='7359adad' id='ba516949'/>
|
||||
<typedef-decl name='reg_syntax_t' type-id='7359adad' id='1b72c3b3'/>
|
||||
<class-decl name='re_pattern_buffer' size-in-bits='512' is-struct='yes' visibility='default' id='19fc9a8c'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='buffer' type-id='33976309' visibility='default'/>
|
||||
<var-decl name='buffer' type-id='cf536864' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='allocated' type-id='ba516949' visibility='default'/>
|
||||
<var-decl name='allocated' type-id='7359adad' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='used' type-id='ba516949' visibility='default'/>
|
||||
<var-decl name='used' type-id='7359adad' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='192'>
|
||||
<var-decl name='syntax' type-id='1b72c3b3' visibility='default'/>
|
||||
@ -1799,26 +1821,18 @@
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='regex_t' type-id='19fc9a8c' id='aca3bac8'/>
|
||||
<typedef-decl name='int8_t' type-id='2171a512' id='ee31ee44'/>
|
||||
<typedef-decl name='int16_t' type-id='03896e23' id='23bd8cb5'/>
|
||||
<typedef-decl name='int32_t' type-id='33f57a65' id='3ff5601b'/>
|
||||
<typedef-decl name='int64_t' type-id='0c9942d2' id='9da381c4'/>
|
||||
<typedef-decl name='uint8_t' type-id='c51d6389' id='b96825af'/>
|
||||
<typedef-decl name='uint16_t' type-id='253c2d2a' id='149c6638'/>
|
||||
<typedef-decl name='uint32_t' type-id='62f1140c' id='8f92235e'/>
|
||||
<typedef-decl name='uint64_t' type-id='8910171f' id='9c313c2d'/>
|
||||
<typedef-decl name='__int8_t' type-id='28577a57' id='2171a512'/>
|
||||
<typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/>
|
||||
<typedef-decl name='__int16_t' type-id='a2185560' id='03896e23'/>
|
||||
<typedef-decl name='__uint16_t' type-id='8efea9e5' id='253c2d2a'/>
|
||||
<typedef-decl name='__int32_t' type-id='95e97e5e' id='33f57a65'/>
|
||||
<typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/>
|
||||
<typedef-decl name='__int64_t' type-id='bd54fe1a' id='0c9942d2'/>
|
||||
<typedef-decl name='__uint64_t' type-id='7359adad' id='8910171f'/>
|
||||
<typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/>
|
||||
<typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/>
|
||||
<typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/>
|
||||
<typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/>
|
||||
<class-decl name='_IO_marker' size-in-bits='192' is-struct='yes' visibility='default' id='010ae0b9'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='_next' type-id='e4c6fa61' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='_sbuf' type-id='dca988a5' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='_pos' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='_flags' type-id='95e97e5e' visibility='default'/>
|
||||
@ -1887,16 +1901,16 @@
|
||||
<var-decl name='_offset' type-id='724e4de6' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1216'>
|
||||
<var-decl name='_codecvt' type-id='570f8c59' visibility='default'/>
|
||||
<var-decl name='__pad1' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1280'>
|
||||
<var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/>
|
||||
<var-decl name='__pad2' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1344'>
|
||||
<var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/>
|
||||
<var-decl name='__pad3' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1408'>
|
||||
<var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/>
|
||||
<var-decl name='__pad4' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1472'>
|
||||
<var-decl name='__pad5' type-id='b59d7dce' visibility='default'/>
|
||||
@ -1908,13 +1922,30 @@
|
||||
<var-decl name='_unused2' type-id='664ac0b7' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='int8_t' type-id='2171a512' id='ee31ee44'/>
|
||||
<typedef-decl name='int16_t' type-id='03896e23' id='23bd8cb5'/>
|
||||
<typedef-decl name='int32_t' type-id='33f57a65' id='3ff5601b'/>
|
||||
<typedef-decl name='int64_t' type-id='0c9942d2' id='9da381c4'/>
|
||||
<typedef-decl name='uint8_t' type-id='c51d6389' id='b96825af'/>
|
||||
<typedef-decl name='uint16_t' type-id='253c2d2a' id='149c6638'/>
|
||||
<typedef-decl name='uint32_t' type-id='62f1140c' id='8f92235e'/>
|
||||
<typedef-decl name='uint64_t' type-id='8910171f' id='9c313c2d'/>
|
||||
<typedef-decl name='__int8_t' type-id='28577a57' id='2171a512'/>
|
||||
<typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/>
|
||||
<typedef-decl name='__int16_t' type-id='a2185560' id='03896e23'/>
|
||||
<typedef-decl name='__uint16_t' type-id='8efea9e5' id='253c2d2a'/>
|
||||
<typedef-decl name='__int32_t' type-id='95e97e5e' id='33f57a65'/>
|
||||
<typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/>
|
||||
<typedef-decl name='__int64_t' type-id='bd54fe1a' id='0c9942d2'/>
|
||||
<typedef-decl name='__uint64_t' type-id='7359adad' id='8910171f'/>
|
||||
<typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/>
|
||||
<typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/>
|
||||
<typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/>
|
||||
<typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/>
|
||||
<pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/>
|
||||
<pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/>
|
||||
<pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/>
|
||||
<pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/>
|
||||
<pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/>
|
||||
<pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/>
|
||||
<pointer-type-def type-id='c19b74c3' size-in-bits='64' id='37e3bd22'/>
|
||||
<pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/>
|
||||
<pointer-type-def type-id='26a90f95' size-in-bits='64' id='9b23c9ad'/>
|
||||
@ -1983,7 +2014,6 @@
|
||||
<pointer-type-def type-id='8e8d4be3' size-in-bits='64' id='5ce45b60'/>
|
||||
<pointer-type-def type-id='5ce45b60' size-in-bits='64' id='857bb57e'/>
|
||||
<pointer-type-def type-id='57928edf' size-in-bits='64' id='3fa542f0'/>
|
||||
<pointer-type-def type-id='b48d2441' size-in-bits='64' id='33976309'/>
|
||||
<pointer-type-def type-id='aca3bac8' size-in-bits='64' id='d33f11cb'/>
|
||||
<pointer-type-def type-id='d8bf0010' size-in-bits='64' id='45b65157'/>
|
||||
<pointer-type-def type-id='149c6638' size-in-bits='64' id='8a121f49'/>
|
||||
@ -1992,10 +2022,6 @@
|
||||
<pointer-type-def type-id='b96825af' size-in-bits='64' id='ae3e8ca6'/>
|
||||
<pointer-type-def type-id='002ac4a6' size-in-bits='64' id='cf536864'/>
|
||||
<pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/>
|
||||
<class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/>
|
||||
<class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/>
|
||||
<class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/>
|
||||
<class-decl name='re_dfa_t' is-struct='yes' visibility='default' is-declaration-only='yes' id='b48d2441'/>
|
||||
<function-decl name='nvlist_prtctl_setdest' mangled-name='nvlist_prtctl_setdest' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_prtctl_setdest'>
|
||||
<parameter type-id='b0c1ff8d' name='pctl'/>
|
||||
<parameter type-id='822cd80b' name='fp'/>
|
||||
@ -2684,6 +2710,7 @@
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-type>
|
||||
<type-decl name='void' id='48b5725f'/>
|
||||
</abi-instr>
|
||||
<abi-instr address-size='64' path='libnvpair_json.c' language='LANG_C99'>
|
||||
<function-decl name='nvlist_print_json' mangled-name='nvlist_print_json' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_print_json'>
|
||||
|
@ -83,7 +83,7 @@ _sol_getmntent(FILE *fp, struct mnttab *mgetp)
|
||||
}
|
||||
|
||||
static int
|
||||
getextmntent_impl(FILE *fp, struct extmnttab *mp, int len)
|
||||
getextmntent_impl(FILE *fp, struct extmnttab *mp)
|
||||
{
|
||||
int ret;
|
||||
struct stat64 st;
|
||||
@ -137,7 +137,7 @@ getextmntent(const char *path, struct extmnttab *entry, struct stat64 *statbuf)
|
||||
*/
|
||||
|
||||
match = 0;
|
||||
while (getextmntent_impl(fp, entry, sizeof (*entry)) == 0) {
|
||||
while (getextmntent_impl(fp, entry) == 0) {
|
||||
if (makedev(entry->mnt_major, entry->mnt_minor) ==
|
||||
statbuf->st_dev) {
|
||||
match = 1;
|
||||
|
@ -5,6 +5,8 @@
|
||||
<dependency name='ld-linux-x86-64.so.2'/>
|
||||
</elf-needed>
|
||||
<elf-function-symbols>
|
||||
<elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='_sol_getmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='atomic_add_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='atomic_add_16_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -853,9 +855,6 @@
|
||||
<array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'>
|
||||
<subrange length='20' type-id='7359adad' id='fdca39cf'/>
|
||||
</array-type-def>
|
||||
<class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/>
|
||||
<class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/>
|
||||
<class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/>
|
||||
<class-decl name='mnttab' size-in-bits='256' is-struct='yes' visibility='default' id='1b055409'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='mnt_special' type-id='26a90f95' visibility='default'/>
|
||||
@ -890,66 +889,18 @@
|
||||
<var-decl name='mnt_minor' type-id='3502e3ff' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<class-decl name='stat64' size-in-bits='1152' is-struct='yes' visibility='default' id='0bbec9cd'>
|
||||
<typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/>
|
||||
<class-decl name='_IO_marker' size-in-bits='192' is-struct='yes' visibility='default' id='010ae0b9'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='st_dev' type-id='35ed8932' visibility='default'/>
|
||||
<var-decl name='_next' type-id='e4c6fa61' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='st_ino' type-id='71288a47' visibility='default'/>
|
||||
<var-decl name='_sbuf' type-id='dca988a5' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='st_nlink' type-id='80f0b9df' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='192'>
|
||||
<var-decl name='st_mode' type-id='e1c52942' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='224'>
|
||||
<var-decl name='st_uid' type-id='cc5fcceb' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='256'>
|
||||
<var-decl name='st_gid' type-id='d94ec6d9' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='288'>
|
||||
<var-decl name='__pad0' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='320'>
|
||||
<var-decl name='st_rdev' type-id='35ed8932' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='384'>
|
||||
<var-decl name='st_size' type-id='79989e9c' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='448'>
|
||||
<var-decl name='st_blksize' type-id='d3f10a7f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='512'>
|
||||
<var-decl name='st_blocks' type-id='4e711bf1' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='576'>
|
||||
<var-decl name='st_atim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='704'>
|
||||
<var-decl name='st_mtim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='832'>
|
||||
<var-decl name='st_ctim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='960'>
|
||||
<var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/>
|
||||
<var-decl name='_pos' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__dev_t' type-id='7359adad' id='35ed8932'/>
|
||||
<typedef-decl name='__uid_t' type-id='f0981eeb' id='cc5fcceb'/>
|
||||
<typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/>
|
||||
<typedef-decl name='__ino64_t' type-id='7359adad' id='71288a47'/>
|
||||
<typedef-decl name='__nlink_t' type-id='7359adad' id='80f0b9df'/>
|
||||
<typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/>
|
||||
<typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/>
|
||||
<typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/>
|
||||
<typedef-decl name='__blksize_t' type-id='bd54fe1a' id='d3f10a7f'/>
|
||||
<typedef-decl name='__blkcnt64_t' type-id='bd54fe1a' id='4e711bf1'/>
|
||||
<typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/>
|
||||
<typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/>
|
||||
<typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/>
|
||||
<class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='_flags' type-id='95e97e5e' visibility='default'/>
|
||||
@ -1018,16 +969,16 @@
|
||||
<var-decl name='_offset' type-id='724e4de6' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1216'>
|
||||
<var-decl name='_codecvt' type-id='570f8c59' visibility='default'/>
|
||||
<var-decl name='__pad1' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1280'>
|
||||
<var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/>
|
||||
<var-decl name='__pad2' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1344'>
|
||||
<var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/>
|
||||
<var-decl name='__pad3' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1408'>
|
||||
<var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/>
|
||||
<var-decl name='__pad4' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1472'>
|
||||
<var-decl name='__pad5' type-id='b59d7dce' visibility='default'/>
|
||||
@ -1039,6 +990,65 @@
|
||||
<var-decl name='_unused2' type-id='664ac0b7' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<class-decl name='stat64' size-in-bits='1152' is-struct='yes' visibility='default' id='0bbec9cd'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='st_dev' type-id='35ed8932' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='st_ino' type-id='71288a47' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='st_nlink' type-id='80f0b9df' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='192'>
|
||||
<var-decl name='st_mode' type-id='e1c52942' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='224'>
|
||||
<var-decl name='st_uid' type-id='cc5fcceb' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='256'>
|
||||
<var-decl name='st_gid' type-id='d94ec6d9' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='288'>
|
||||
<var-decl name='__pad0' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='320'>
|
||||
<var-decl name='st_rdev' type-id='35ed8932' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='384'>
|
||||
<var-decl name='st_size' type-id='79989e9c' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='448'>
|
||||
<var-decl name='st_blksize' type-id='d3f10a7f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='512'>
|
||||
<var-decl name='st_blocks' type-id='4e711bf1' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='576'>
|
||||
<var-decl name='st_atim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='704'>
|
||||
<var-decl name='st_mtim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='832'>
|
||||
<var-decl name='st_ctim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='960'>
|
||||
<var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__dev_t' type-id='7359adad' id='35ed8932'/>
|
||||
<typedef-decl name='__uid_t' type-id='f0981eeb' id='cc5fcceb'/>
|
||||
<typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/>
|
||||
<typedef-decl name='__ino64_t' type-id='7359adad' id='71288a47'/>
|
||||
<typedef-decl name='__nlink_t' type-id='7359adad' id='80f0b9df'/>
|
||||
<typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/>
|
||||
<typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/>
|
||||
<typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/>
|
||||
<typedef-decl name='__blksize_t' type-id='bd54fe1a' id='d3f10a7f'/>
|
||||
<typedef-decl name='__blkcnt64_t' type-id='bd54fe1a' id='4e711bf1'/>
|
||||
<typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/>
|
||||
<typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/>
|
||||
<class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' id='a9c79a1f'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='tv_sec' type-id='65eda9c0' visibility='default'/>
|
||||
@ -1049,16 +1059,11 @@
|
||||
</class-decl>
|
||||
<pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/>
|
||||
<pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/>
|
||||
<pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/>
|
||||
<pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/>
|
||||
<pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/>
|
||||
<pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/>
|
||||
<pointer-type-def type-id='0c544dc0' size-in-bits='64' id='394fc496'/>
|
||||
<pointer-type-def type-id='1b055409' size-in-bits='64' id='9d424d31'/>
|
||||
<pointer-type-def type-id='0bbec9cd' size-in-bits='64' id='62f7a03d'/>
|
||||
<class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/>
|
||||
<class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/>
|
||||
<class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/>
|
||||
<function-decl name='getmntany' mangled-name='getmntany' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getmntany'>
|
||||
<parameter type-id='822cd80b' name='fp'/>
|
||||
<parameter type-id='9d424d31' name='mgetp'/>
|
||||
@ -1114,7 +1119,6 @@
|
||||
<type-decl name='char' size-in-bits='8' id='a84c031d'/>
|
||||
<type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/>
|
||||
<type-decl name='variadic parameter type' id='2c1145c5'/>
|
||||
<type-decl name='void' id='48b5725f'/>
|
||||
<typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/>
|
||||
<pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/>
|
||||
<qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/>
|
||||
@ -1147,6 +1151,7 @@
|
||||
<parameter is-variadic='yes'/>
|
||||
<return type-id='26a90f95'/>
|
||||
</function-decl>
|
||||
<type-decl name='void' id='48b5725f'/>
|
||||
</abi-instr>
|
||||
<abi-instr address-size='64' path='uu_avl.c' language='LANG_C99'>
|
||||
<array-type-def dimensions='1' type-id='bf311473' size-in-bits='128' id='f0f65199'>
|
||||
@ -1299,6 +1304,15 @@
|
||||
<typedef-decl name='int8_t' type-id='2171a512' id='ee31ee44'/>
|
||||
<typedef-decl name='uint8_t' type-id='c51d6389' id='b96825af'/>
|
||||
<typedef-decl name='uint32_t' type-id='62f1140c' id='8f92235e'/>
|
||||
<class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' id='0e01899c'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='__prev' type-id='4d98cd5a' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='__next' type-id='4d98cd5a' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__pthread_list_t' type-id='0e01899c' id='518fb49c'/>
|
||||
<class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' id='4c734837'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='__lock' type-id='95e97e5e' visibility='default'/>
|
||||
@ -1325,15 +1339,6 @@
|
||||
<var-decl name='__list' type-id='518fb49c' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' id='0e01899c'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='__prev' type-id='4d98cd5a' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='__next' type-id='4d98cd5a' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__pthread_list_t' type-id='0e01899c' id='518fb49c'/>
|
||||
<typedef-decl name='__int8_t' type-id='28577a57' id='2171a512'/>
|
||||
<typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/>
|
||||
<typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/>
|
||||
|
@ -10,11 +10,14 @@
|
||||
<dependency name='libm.so.6'/>
|
||||
<dependency name='libcrypto.so.1.1'/>
|
||||
<dependency name='libz.so.1'/>
|
||||
<dependency name='libdl.so.2'/>
|
||||
<dependency name='libpthread.so.0'/>
|
||||
<dependency name='libc.so.6'/>
|
||||
<dependency name='ld-linux-x86-64.so.2'/>
|
||||
</elf-needed>
|
||||
<elf-function-symbols>
|
||||
<elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='_sol_getmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='atomic_add_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='atomic_add_16_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -259,6 +262,22 @@
|
||||
<elf-symbol name='tpool_suspended' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='tpool_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='update_vdev_config_dev_strs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_expand_proplist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_name_to_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_align_right' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_column_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_default_numeric' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_default_string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_get_table' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_get_type' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_index_to_string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_random_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_readonly' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_string_to_index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_to_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_user' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='vdev_prop_values' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zfeature_depends_on' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zfeature_is_supported' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zfeature_is_valid_guid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -463,6 +482,7 @@
|
||||
<elf-symbol name='zpool_find_vdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_find_vdev_by_physpath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_free_handles' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_get_all_vdev_props' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_get_bootenv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_get_config' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_get_errlog' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -477,6 +497,8 @@
|
||||
<elf-symbol name='zpool_get_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_get_state_str' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_get_status' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_get_vdev_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_get_vdev_prop_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_history_unpack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_import' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_import_props' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -514,6 +536,7 @@
|
||||
<elf-symbol name='zpool_prop_to_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_prop_unsupported' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_prop_values' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_prop_vdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_props_refresh' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_read_label' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_refresh_stats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -523,6 +546,7 @@
|
||||
<elf-symbol name='zpool_search_import' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_set_bootenv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_set_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_set_vdev_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_skip_pool' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_state_to_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zpool_sync_one' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -557,6 +581,7 @@
|
||||
<elf-symbol name='zprop_register_number' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zprop_register_string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zprop_string_to_index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zprop_valid_char' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zprop_valid_for_type' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zprop_values' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zprop_width' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -1376,9 +1401,6 @@
|
||||
<array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'>
|
||||
<subrange length='20' type-id='7359adad' id='fdca39cf'/>
|
||||
</array-type-def>
|
||||
<class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/>
|
||||
<class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/>
|
||||
<class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/>
|
||||
<class-decl name='extmnttab' size-in-bits='320' is-struct='yes' visibility='default' id='0c544dc0'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='mnt_special' type-id='26a90f95' visibility='default'/>
|
||||
@ -1399,66 +1421,18 @@
|
||||
<var-decl name='mnt_minor' type-id='3502e3ff' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<class-decl name='stat64' size-in-bits='1152' is-struct='yes' visibility='default' id='0bbec9cd'>
|
||||
<typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/>
|
||||
<class-decl name='_IO_marker' size-in-bits='192' is-struct='yes' visibility='default' id='010ae0b9'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='st_dev' type-id='35ed8932' visibility='default'/>
|
||||
<var-decl name='_next' type-id='e4c6fa61' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='st_ino' type-id='71288a47' visibility='default'/>
|
||||
<var-decl name='_sbuf' type-id='dca988a5' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='st_nlink' type-id='80f0b9df' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='192'>
|
||||
<var-decl name='st_mode' type-id='e1c52942' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='224'>
|
||||
<var-decl name='st_uid' type-id='cc5fcceb' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='256'>
|
||||
<var-decl name='st_gid' type-id='d94ec6d9' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='288'>
|
||||
<var-decl name='__pad0' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='320'>
|
||||
<var-decl name='st_rdev' type-id='35ed8932' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='384'>
|
||||
<var-decl name='st_size' type-id='79989e9c' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='448'>
|
||||
<var-decl name='st_blksize' type-id='d3f10a7f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='512'>
|
||||
<var-decl name='st_blocks' type-id='4e711bf1' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='576'>
|
||||
<var-decl name='st_atim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='704'>
|
||||
<var-decl name='st_mtim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='832'>
|
||||
<var-decl name='st_ctim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='960'>
|
||||
<var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/>
|
||||
<var-decl name='_pos' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__dev_t' type-id='7359adad' id='35ed8932'/>
|
||||
<typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/>
|
||||
<typedef-decl name='__ino64_t' type-id='7359adad' id='71288a47'/>
|
||||
<typedef-decl name='__mode_t' type-id='f0981eeb' id='e1c52942'/>
|
||||
<typedef-decl name='__nlink_t' type-id='7359adad' id='80f0b9df'/>
|
||||
<typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/>
|
||||
<typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/>
|
||||
<typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/>
|
||||
<typedef-decl name='__blksize_t' type-id='bd54fe1a' id='d3f10a7f'/>
|
||||
<typedef-decl name='__blkcnt64_t' type-id='bd54fe1a' id='4e711bf1'/>
|
||||
<typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/>
|
||||
<typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/>
|
||||
<typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/>
|
||||
<class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='_flags' type-id='95e97e5e' visibility='default'/>
|
||||
@ -1527,16 +1501,16 @@
|
||||
<var-decl name='_offset' type-id='724e4de6' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1216'>
|
||||
<var-decl name='_codecvt' type-id='570f8c59' visibility='default'/>
|
||||
<var-decl name='__pad1' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1280'>
|
||||
<var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/>
|
||||
<var-decl name='__pad2' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1344'>
|
||||
<var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/>
|
||||
<var-decl name='__pad3' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1408'>
|
||||
<var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/>
|
||||
<var-decl name='__pad4' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1472'>
|
||||
<var-decl name='__pad5' type-id='b59d7dce' visibility='default'/>
|
||||
@ -1548,6 +1522,65 @@
|
||||
<var-decl name='_unused2' type-id='664ac0b7' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<class-decl name='stat64' size-in-bits='1152' is-struct='yes' visibility='default' id='0bbec9cd'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='st_dev' type-id='35ed8932' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='st_ino' type-id='71288a47' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='st_nlink' type-id='80f0b9df' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='192'>
|
||||
<var-decl name='st_mode' type-id='e1c52942' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='224'>
|
||||
<var-decl name='st_uid' type-id='cc5fcceb' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='256'>
|
||||
<var-decl name='st_gid' type-id='d94ec6d9' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='288'>
|
||||
<var-decl name='__pad0' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='320'>
|
||||
<var-decl name='st_rdev' type-id='35ed8932' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='384'>
|
||||
<var-decl name='st_size' type-id='79989e9c' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='448'>
|
||||
<var-decl name='st_blksize' type-id='d3f10a7f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='512'>
|
||||
<var-decl name='st_blocks' type-id='4e711bf1' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='576'>
|
||||
<var-decl name='st_atim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='704'>
|
||||
<var-decl name='st_mtim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='832'>
|
||||
<var-decl name='st_ctim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='960'>
|
||||
<var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__dev_t' type-id='7359adad' id='35ed8932'/>
|
||||
<typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/>
|
||||
<typedef-decl name='__ino64_t' type-id='7359adad' id='71288a47'/>
|
||||
<typedef-decl name='__mode_t' type-id='f0981eeb' id='e1c52942'/>
|
||||
<typedef-decl name='__nlink_t' type-id='7359adad' id='80f0b9df'/>
|
||||
<typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/>
|
||||
<typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/>
|
||||
<typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/>
|
||||
<typedef-decl name='__blksize_t' type-id='bd54fe1a' id='d3f10a7f'/>
|
||||
<typedef-decl name='__blkcnt64_t' type-id='bd54fe1a' id='4e711bf1'/>
|
||||
<typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/>
|
||||
<typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/>
|
||||
<class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' id='a9c79a1f'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='tv_sec' type-id='65eda9c0' visibility='default'/>
|
||||
@ -1558,15 +1591,10 @@
|
||||
</class-decl>
|
||||
<pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/>
|
||||
<pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/>
|
||||
<pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/>
|
||||
<pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/>
|
||||
<pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/>
|
||||
<pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/>
|
||||
<pointer-type-def type-id='0c544dc0' size-in-bits='64' id='394fc496'/>
|
||||
<pointer-type-def type-id='0bbec9cd' size-in-bits='64' id='62f7a03d'/>
|
||||
<class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/>
|
||||
<class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/>
|
||||
<class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/>
|
||||
<function-decl name='getmntany' mangled-name='getmntany' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getmntany'>
|
||||
<parameter type-id='822cd80b' name='fp'/>
|
||||
<parameter type-id='9d424d31' name='mgetp'/>
|
||||
@ -2683,6 +2711,73 @@
|
||||
<parameter type-id='5d0c23fb' name='prop'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_get_table' mangled-name='vdev_prop_get_table' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_get_table'>
|
||||
<return type-id='76c8174b'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_init' mangled-name='vdev_prop_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_init'>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_name_to_prop' mangled-name='vdev_name_to_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_name_to_prop'>
|
||||
<parameter type-id='80f4b756' name='propname'/>
|
||||
<return type-id='5aa5c90c'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_user' mangled-name='vdev_prop_user' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_user'>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_to_name' mangled-name='vdev_prop_to_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_to_name'>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<return type-id='80f4b756'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_get_type' mangled-name='vdev_prop_get_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_get_type'>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<return type-id='31429eff'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_readonly' mangled-name='vdev_prop_readonly' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_readonly'>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_default_string' mangled-name='vdev_prop_default_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_default_string'>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<return type-id='80f4b756'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_default_numeric' mangled-name='vdev_prop_default_numeric' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_default_numeric'>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<return type-id='9c313c2d'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_string_to_index' mangled-name='vdev_prop_string_to_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_string_to_index'>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<parameter type-id='80f4b756' name='string'/>
|
||||
<parameter type-id='5d6479ae' name='index'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_index_to_string' mangled-name='vdev_prop_index_to_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_index_to_string'>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<parameter type-id='9c313c2d' name='index'/>
|
||||
<parameter type-id='7d3cd834' name='string'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='zpool_prop_vdev' mangled-name='zpool_prop_vdev' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_vdev'>
|
||||
<parameter type-id='80f4b756' name='name'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_random_value' mangled-name='vdev_prop_random_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_random_value'>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<parameter type-id='9c313c2d' name='seed'/>
|
||||
<return type-id='9c313c2d'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_values' mangled-name='vdev_prop_values' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_values'>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<return type-id='80f4b756'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_column_name' mangled-name='vdev_prop_column_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_column_name'>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<return type-id='80f4b756'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_prop_align_right' mangled-name='vdev_prop_align_right' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_align_right'>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
</abi-instr>
|
||||
<abi-instr address-size='64' path='../../module/zcommon/zprop_common.c' language='LANG_C99'>
|
||||
<function-decl name='zprop_register_impl' mangled-name='zprop_register_impl' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_register_impl'>
|
||||
@ -2784,6 +2879,10 @@
|
||||
<parameter type-id='c19b74c3' name='headcheck'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
<function-decl name='zprop_valid_char' mangled-name='zprop_valid_char' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_valid_char'>
|
||||
<parameter type-id='a84c031d' name='c'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='zprop_width' mangled-name='zprop_width' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_width'>
|
||||
<parameter type-id='95e97e5e' name='prop'/>
|
||||
<parameter type-id='37e3bd22' name='fixed'/>
|
||||
@ -2808,9 +2907,6 @@
|
||||
<array-type-def dimensions='1' type-id='a84c031d' size-in-bits='320' id='36c46961'>
|
||||
<subrange length='40' type-id='7359adad' id='8f80b239'/>
|
||||
</array-type-def>
|
||||
<class-decl name='re_dfa_t' is-struct='yes' visibility='default' is-declaration-only='yes' id='b48d2441'/>
|
||||
<class-decl name='uu_avl' is-struct='yes' visibility='default' is-declaration-only='yes' id='4af029d1'/>
|
||||
<class-decl name='uu_avl_pool' is-struct='yes' visibility='default' is-declaration-only='yes' id='12a530a8'/>
|
||||
<type-decl name='int' size-in-bits='32' id='95e97e5e'/>
|
||||
<type-decl name='long int' size-in-bits='64' id='bd54fe1a'/>
|
||||
<type-decl name='long long int' size-in-bits='64' id='1eb56b1e'/>
|
||||
@ -2886,6 +2982,7 @@
|
||||
<enumerator name='ZFS_TYPE_VOLUME' value='4'/>
|
||||
<enumerator name='ZFS_TYPE_POOL' value='8'/>
|
||||
<enumerator name='ZFS_TYPE_BOOKMARK' value='16'/>
|
||||
<enumerator name='ZFS_TYPE_VDEV' value='32'/>
|
||||
</enum-decl>
|
||||
<typedef-decl name='zfs_type_t' type-id='5d8f7321' id='2e45de5d'/>
|
||||
<enum-decl name='dmu_objset_type' id='6b1b19f9'>
|
||||
@ -3052,17 +3149,16 @@
|
||||
<var-decl name='zpool_start_block' type-id='804dc465' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__re_long_size_t' type-id='7359adad' id='ba516949'/>
|
||||
<typedef-decl name='reg_syntax_t' type-id='7359adad' id='1b72c3b3'/>
|
||||
<class-decl name='re_pattern_buffer' size-in-bits='512' is-struct='yes' visibility='default' id='19fc9a8c'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='buffer' type-id='33976309' visibility='default'/>
|
||||
<var-decl name='buffer' type-id='cf536864' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='allocated' type-id='ba516949' visibility='default'/>
|
||||
<var-decl name='allocated' type-id='7359adad' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='used' type-id='ba516949' visibility='default'/>
|
||||
<var-decl name='used' type-id='7359adad' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='192'>
|
||||
<var-decl name='syntax' type-id='1b72c3b3' visibility='default'/>
|
||||
@ -3116,6 +3212,15 @@
|
||||
<typedef-decl name='uint8_t' type-id='c51d6389' id='b96825af'/>
|
||||
<typedef-decl name='uint32_t' type-id='62f1140c' id='8f92235e'/>
|
||||
<typedef-decl name='uint64_t' type-id='8910171f' id='9c313c2d'/>
|
||||
<class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' id='0e01899c'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='__prev' type-id='4d98cd5a' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='__next' type-id='4d98cd5a' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__pthread_list_t' type-id='0e01899c' id='518fb49c'/>
|
||||
<class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' id='4c734837'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='__lock' type-id='95e97e5e' visibility='default'/>
|
||||
@ -3142,15 +3247,6 @@
|
||||
<var-decl name='__list' type-id='518fb49c' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' id='0e01899c'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='__prev' type-id='4d98cd5a' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='__next' type-id='4d98cd5a' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__pthread_list_t' type-id='0e01899c' id='518fb49c'/>
|
||||
<typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/>
|
||||
<typedef-decl name='__int32_t' type-id='95e97e5e' id='33f57a65'/>
|
||||
<typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/>
|
||||
@ -3168,7 +3264,6 @@
|
||||
<pointer-type-def type-id='95942d0c' size-in-bits='64' id='b0382bb3'/>
|
||||
<pointer-type-def type-id='8e8d4be3' size-in-bits='64' id='5ce45b60'/>
|
||||
<pointer-type-def type-id='5ce45b60' size-in-bits='64' id='857bb57e'/>
|
||||
<pointer-type-def type-id='b48d2441' size-in-bits='64' id='33976309'/>
|
||||
<pointer-type-def type-id='b96825af' size-in-bits='64' id='ae3e8ca6'/>
|
||||
<pointer-type-def type-id='002ac4a6' size-in-bits='64' id='cf536864'/>
|
||||
<pointer-type-def type-id='7f84e390' size-in-bits='64' id='de82c773'/>
|
||||
@ -3176,7 +3271,6 @@
|
||||
<pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/>
|
||||
<pointer-type-def type-id='775509eb' size-in-bits='64' id='9200a744'/>
|
||||
<pointer-type-def type-id='b1efc708' size-in-bits='64' id='4c81de99'/>
|
||||
<class-decl name='re_dfa_t' is-struct='yes' visibility='default' is-declaration-only='yes' id='b48d2441'/>
|
||||
<class-decl name='uu_avl' is-struct='yes' visibility='default' is-declaration-only='yes' id='4af029d1'/>
|
||||
<class-decl name='uu_avl_pool' is-struct='yes' visibility='default' is-declaration-only='yes' id='12a530a8'/>
|
||||
<function-decl name='zpool_get_config' mangled-name='zpool_get_config' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_config'>
|
||||
@ -4081,6 +4175,10 @@
|
||||
<parameter type-id='9200a744' name='zhp'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='zfs_shareall' mangled-name='zfs_shareall' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_shareall'>
|
||||
<parameter type-id='9200a744' name='zhp'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='zfs_unshare_nfs' mangled-name='zfs_unshare_nfs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshare_nfs'>
|
||||
<parameter type-id='9200a744' name='zhp'/>
|
||||
<parameter type-id='80f4b756' name='mountpoint'/>
|
||||
@ -4216,6 +4314,53 @@
|
||||
<enumerator name='ZPOOL_NUM_PROPS' value='33'/>
|
||||
</enum-decl>
|
||||
<typedef-decl name='zpool_prop_t' type-id='af1ba157' id='5d0c23fb'/>
|
||||
<enum-decl name='vdev_prop_t' naming-typedef-id='5aa5c90c' id='1573bec8'>
|
||||
<underlying-type type-id='9cac1fee'/>
|
||||
<enumerator name='VDEV_PROP_INVAL' value='-1'/>
|
||||
<enumerator name='VDEV_PROP_NAME' value='0'/>
|
||||
<enumerator name='VDEV_PROP_CAPACITY' value='1'/>
|
||||
<enumerator name='VDEV_PROP_STATE' value='2'/>
|
||||
<enumerator name='VDEV_PROP_GUID' value='3'/>
|
||||
<enumerator name='VDEV_PROP_ASIZE' value='4'/>
|
||||
<enumerator name='VDEV_PROP_PSIZE' value='5'/>
|
||||
<enumerator name='VDEV_PROP_ASHIFT' value='6'/>
|
||||
<enumerator name='VDEV_PROP_SIZE' value='7'/>
|
||||
<enumerator name='VDEV_PROP_FREE' value='8'/>
|
||||
<enumerator name='VDEV_PROP_ALLOCATED' value='9'/>
|
||||
<enumerator name='VDEV_PROP_COMMENT' value='10'/>
|
||||
<enumerator name='VDEV_PROP_EXPANDSZ' value='11'/>
|
||||
<enumerator name='VDEV_PROP_FRAGMENTATION' value='12'/>
|
||||
<enumerator name='VDEV_PROP_BOOTSIZE' value='13'/>
|
||||
<enumerator name='VDEV_PROP_PARITY' value='14'/>
|
||||
<enumerator name='VDEV_PROP_PATH' value='15'/>
|
||||
<enumerator name='VDEV_PROP_DEVID' value='16'/>
|
||||
<enumerator name='VDEV_PROP_PHYS_PATH' value='17'/>
|
||||
<enumerator name='VDEV_PROP_ENC_PATH' value='18'/>
|
||||
<enumerator name='VDEV_PROP_FRU' value='19'/>
|
||||
<enumerator name='VDEV_PROP_PARENT' value='20'/>
|
||||
<enumerator name='VDEV_PROP_CHILDREN' value='21'/>
|
||||
<enumerator name='VDEV_PROP_NUMCHILDREN' value='22'/>
|
||||
<enumerator name='VDEV_PROP_READ_ERRORS' value='23'/>
|
||||
<enumerator name='VDEV_PROP_WRITE_ERRORS' value='24'/>
|
||||
<enumerator name='VDEV_PROP_CHECKSUM_ERRORS' value='25'/>
|
||||
<enumerator name='VDEV_PROP_INITIALIZE_ERRORS' value='26'/>
|
||||
<enumerator name='VDEV_PROP_OPS_NULL' value='27'/>
|
||||
<enumerator name='VDEV_PROP_OPS_READ' value='28'/>
|
||||
<enumerator name='VDEV_PROP_OPS_WRITE' value='29'/>
|
||||
<enumerator name='VDEV_PROP_OPS_FREE' value='30'/>
|
||||
<enumerator name='VDEV_PROP_OPS_CLAIM' value='31'/>
|
||||
<enumerator name='VDEV_PROP_OPS_TRIM' value='32'/>
|
||||
<enumerator name='VDEV_PROP_BYTES_NULL' value='33'/>
|
||||
<enumerator name='VDEV_PROP_BYTES_READ' value='34'/>
|
||||
<enumerator name='VDEV_PROP_BYTES_WRITE' value='35'/>
|
||||
<enumerator name='VDEV_PROP_BYTES_FREE' value='36'/>
|
||||
<enumerator name='VDEV_PROP_BYTES_CLAIM' value='37'/>
|
||||
<enumerator name='VDEV_PROP_BYTES_TRIM' value='38'/>
|
||||
<enumerator name='VDEV_PROP_REMOVING' value='39'/>
|
||||
<enumerator name='VDEV_PROP_ALLOCATING' value='40'/>
|
||||
<enumerator name='VDEV_NUM_PROPS' value='41'/>
|
||||
</enum-decl>
|
||||
<typedef-decl name='vdev_prop_t' type-id='1573bec8' id='5aa5c90c'/>
|
||||
<enum-decl name='vdev_state' id='21566197'>
|
||||
<underlying-type type-id='9cac1fee'/>
|
||||
<enumerator name='VDEV_STATE_UNKNOWN' value='0'/>
|
||||
@ -4342,9 +4487,16 @@
|
||||
<function-decl name='zpool_expand_proplist' mangled-name='zpool_expand_proplist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_expand_proplist'>
|
||||
<parameter type-id='4c81de99' name='zhp'/>
|
||||
<parameter type-id='e4378506' name='plp'/>
|
||||
<parameter type-id='2e45de5d' name='type'/>
|
||||
<parameter type-id='c19b74c3' name='literal'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='vdev_expand_proplist' mangled-name='vdev_expand_proplist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_expand_proplist'>
|
||||
<parameter type-id='4c81de99' name='zhp'/>
|
||||
<parameter type-id='80f4b756' name='vdevname'/>
|
||||
<parameter type-id='e4378506' name='plp'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='zpool_prop_get_feature' mangled-name='zpool_prop_get_feature' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_get_feature'>
|
||||
<parameter type-id='4c81de99' name='zhp'/>
|
||||
<parameter type-id='80f4b756' name='propname'/>
|
||||
@ -4680,6 +4832,40 @@
|
||||
<parameter type-id='b59d7dce' name='rlen'/>
|
||||
<return type-id='901b78d1'/>
|
||||
</function-decl>
|
||||
<function-decl name='zpool_get_vdev_prop_value' mangled-name='zpool_get_vdev_prop_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_vdev_prop_value'>
|
||||
<parameter type-id='5ce45b60' name='nvprop'/>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<parameter type-id='26a90f95' name='prop_name'/>
|
||||
<parameter type-id='26a90f95' name='buf'/>
|
||||
<parameter type-id='b59d7dce' name='len'/>
|
||||
<parameter type-id='debc6aa3' name='srctype'/>
|
||||
<parameter type-id='c19b74c3' name='literal'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='zpool_get_vdev_prop' mangled-name='zpool_get_vdev_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_vdev_prop'>
|
||||
<parameter type-id='4c81de99' name='zhp'/>
|
||||
<parameter type-id='80f4b756' name='vdevname'/>
|
||||
<parameter type-id='5aa5c90c' name='prop'/>
|
||||
<parameter type-id='26a90f95' name='prop_name'/>
|
||||
<parameter type-id='26a90f95' name='buf'/>
|
||||
<parameter type-id='b59d7dce' name='len'/>
|
||||
<parameter type-id='debc6aa3' name='srctype'/>
|
||||
<parameter type-id='c19b74c3' name='literal'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='zpool_get_all_vdev_props' mangled-name='zpool_get_all_vdev_props' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_all_vdev_props'>
|
||||
<parameter type-id='4c81de99' name='zhp'/>
|
||||
<parameter type-id='80f4b756' name='vdevname'/>
|
||||
<parameter type-id='857bb57e' name='outnvl'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='zpool_set_vdev_prop' mangled-name='zpool_set_vdev_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_set_vdev_prop'>
|
||||
<parameter type-id='4c81de99' name='zhp'/>
|
||||
<parameter type-id='80f4b756' name='vdevname'/>
|
||||
<parameter type-id='80f4b756' name='propname'/>
|
||||
<parameter type-id='80f4b756' name='propval'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
</abi-instr>
|
||||
<abi-instr address-size='64' path='libzfs_sendrecv.c' language='LANG_C99'>
|
||||
<class-decl name='sendflags' size-in-bits='544' is-struct='yes' visibility='default' id='f6aa15be'>
|
||||
@ -4922,7 +5108,19 @@
|
||||
<enumerator name='GET_COL_SOURCE' value='5'/>
|
||||
</enum-decl>
|
||||
<typedef-decl name='zfs_get_column_t' type-id='223bdcaa' id='19cefcee'/>
|
||||
<class-decl name='zprop_get_cbdata' size-in-bits='640' is-struct='yes' visibility='default' id='f3d3c319'>
|
||||
<class-decl name='vdev_cbdata' size-in-bits='192' is-struct='yes' visibility='default' id='b8006be8'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='cb_name_flags' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='cb_names' type-id='9b23c9ad' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='cb_names_count' type-id='f0981eeb' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='vdev_cbdata_t' type-id='b8006be8' id='a9679c94'/>
|
||||
<class-decl name='zprop_get_cbdata' size-in-bits='832' is-struct='yes' visibility='default' id='f3d3c319'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='cb_sources' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
@ -4947,6 +5145,9 @@
|
||||
<data-member access='public' layout-offset-in-bits='576'>
|
||||
<var-decl name='cb_type' type-id='2e45de5d' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='640'>
|
||||
<var-decl name='cb_vdevs' type-id='a9679c94' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='zprop_get_cbdata_t' type-id='f3d3c319' id='f3d87113'/>
|
||||
<typedef-decl name='zprop_func' type-id='2e711a2a' id='1ec3747a'/>
|
||||
@ -5422,7 +5623,6 @@
|
||||
</function-decl>
|
||||
</abi-instr>
|
||||
<abi-instr address-size='64' path='os/linux/zutil_import_os.c' language='LANG_C99'>
|
||||
<class-decl name='udev_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='640b33ca'/>
|
||||
<qualified-type-def type-id='80f4b756' const='yes' id='b99c00c9'/>
|
||||
<pointer-type-def type-id='b99c00c9' size-in-bits='64' id='13956559'/>
|
||||
<pointer-type-def type-id='b59d7dce' size-in-bits='64' id='78c01427'/>
|
||||
|
@ -200,7 +200,7 @@ get_format_prompt_string(zfs_keyformat_t format)
|
||||
/* do basic validation of the key material */
|
||||
static int
|
||||
validate_key(libzfs_handle_t *hdl, zfs_keyformat_t keyformat,
|
||||
const char *key, size_t keylen)
|
||||
const char *key, size_t keylen, boolean_t do_verify)
|
||||
{
|
||||
switch (keyformat) {
|
||||
case ZFS_KEYFORMAT_RAW:
|
||||
@ -245,7 +245,12 @@ validate_key(libzfs_handle_t *hdl, zfs_keyformat_t keyformat,
|
||||
}
|
||||
break;
|
||||
case ZFS_KEYFORMAT_PASSPHRASE:
|
||||
/* verify the length is within bounds */
|
||||
/*
|
||||
* Verify the length is within bounds when setting a new key,
|
||||
* but not when loading an existing key.
|
||||
*/
|
||||
if (!do_verify)
|
||||
break;
|
||||
if (keylen > MAX_PASSPHRASE_LEN) {
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
"Passphrase too long (max %u)."),
|
||||
@ -380,7 +385,8 @@ get_key_interactive(libzfs_handle_t *restrict hdl, const char *fsname,
|
||||
if (!confirm_key)
|
||||
goto out;
|
||||
|
||||
if ((ret = validate_key(hdl, keyformat, buf, buflen)) != 0) {
|
||||
if ((ret = validate_key(hdl, keyformat, buf, buflen, confirm_key)) !=
|
||||
0) {
|
||||
free(buf);
|
||||
return (ret);
|
||||
}
|
||||
@ -740,7 +746,8 @@ get_key_material(libzfs_handle_t *hdl, boolean_t do_verify, boolean_t newkey,
|
||||
goto error;
|
||||
}
|
||||
|
||||
if ((ret = validate_key(hdl, keyformat, (const char *)km, kmlen)) != 0)
|
||||
if ((ret = validate_key(hdl, keyformat, (const char *)km, kmlen,
|
||||
do_verify)) != 0)
|
||||
goto error;
|
||||
|
||||
*km_out = km;
|
||||
|
@ -51,9 +51,9 @@
|
||||
#define ZDIFF_PREFIX "zfs-diff-%d"
|
||||
|
||||
#define ZDIFF_ADDED '+'
|
||||
#define ZDIFF_MODIFIED 'M'
|
||||
#define ZDIFF_MODIFIED "M"
|
||||
#define ZDIFF_REMOVED '-'
|
||||
#define ZDIFF_RENAMED 'R'
|
||||
#define ZDIFF_RENAMED "R"
|
||||
|
||||
|
||||
/*
|
||||
@ -122,62 +122,54 @@ stream_bytes(FILE *fp, const char *string)
|
||||
|
||||
while ((c = *string++) != '\0') {
|
||||
if (c > ' ' && c != '\\' && c < '\177') {
|
||||
(void) fprintf(fp, "%c", c);
|
||||
(void) fputc(c, fp);
|
||||
} else {
|
||||
(void) fprintf(fp, "\\%04o", (uint8_t)c);
|
||||
(void) fprintf(fp, "\\%04hho", (uint8_t)c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_what(FILE *fp, mode_t what)
|
||||
static char
|
||||
get_what(mode_t what)
|
||||
{
|
||||
char symbol;
|
||||
|
||||
switch (what & S_IFMT) {
|
||||
case S_IFBLK:
|
||||
symbol = 'B';
|
||||
break;
|
||||
return ('B');
|
||||
case S_IFCHR:
|
||||
symbol = 'C';
|
||||
break;
|
||||
return ('C');
|
||||
case S_IFDIR:
|
||||
symbol = '/';
|
||||
break;
|
||||
return ('/');
|
||||
#ifdef S_IFDOOR
|
||||
case S_IFDOOR:
|
||||
symbol = '>';
|
||||
break;
|
||||
return ('>');
|
||||
#endif
|
||||
case S_IFIFO:
|
||||
symbol = '|';
|
||||
break;
|
||||
return ('|');
|
||||
case S_IFLNK:
|
||||
symbol = '@';
|
||||
break;
|
||||
return ('@');
|
||||
#ifdef S_IFPORT
|
||||
case S_IFPORT:
|
||||
symbol = 'P';
|
||||
break;
|
||||
return ('P');
|
||||
#endif
|
||||
case S_IFSOCK:
|
||||
symbol = '=';
|
||||
break;
|
||||
return ('=');
|
||||
case S_IFREG:
|
||||
symbol = 'F';
|
||||
break;
|
||||
return ('F');
|
||||
default:
|
||||
symbol = '?';
|
||||
break;
|
||||
return ('?');
|
||||
}
|
||||
(void) fprintf(fp, "%c", symbol);
|
||||
}
|
||||
|
||||
static void
|
||||
print_cmn(FILE *fp, differ_info_t *di, const char *file)
|
||||
{
|
||||
stream_bytes(fp, di->dsmnt);
|
||||
stream_bytes(fp, file);
|
||||
if (!di->no_mangle) {
|
||||
stream_bytes(fp, di->dsmnt);
|
||||
stream_bytes(fp, file);
|
||||
} else {
|
||||
(void) fputs(di->dsmnt, fp);
|
||||
(void) fputs(file, fp);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -188,18 +180,13 @@ print_rename(FILE *fp, differ_info_t *di, const char *old, const char *new,
|
||||
(void) fprintf(fp, "%10lld.%09lld\t",
|
||||
(longlong_t)isb->zs_ctime[0],
|
||||
(longlong_t)isb->zs_ctime[1]);
|
||||
(void) fprintf(fp, "%c\t", ZDIFF_RENAMED);
|
||||
if (di->classify) {
|
||||
print_what(fp, isb->zs_mode);
|
||||
(void) fprintf(fp, "\t");
|
||||
}
|
||||
(void) fputs(ZDIFF_RENAMED "\t", fp);
|
||||
if (di->classify)
|
||||
(void) fprintf(fp, "%c\t", get_what(isb->zs_mode));
|
||||
print_cmn(fp, di, old);
|
||||
if (di->scripted)
|
||||
(void) fprintf(fp, "\t");
|
||||
else
|
||||
(void) fprintf(fp, " -> ");
|
||||
(void) fputs(di->scripted ? "\t" : " -> ", fp);
|
||||
print_cmn(fp, di, new);
|
||||
(void) fprintf(fp, "\n");
|
||||
(void) fputc('\n', fp);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -210,14 +197,11 @@ print_link_change(FILE *fp, differ_info_t *di, int delta, const char *file,
|
||||
(void) fprintf(fp, "%10lld.%09lld\t",
|
||||
(longlong_t)isb->zs_ctime[0],
|
||||
(longlong_t)isb->zs_ctime[1]);
|
||||
(void) fprintf(fp, "%c\t", ZDIFF_MODIFIED);
|
||||
if (di->classify) {
|
||||
print_what(fp, isb->zs_mode);
|
||||
(void) fprintf(fp, "\t");
|
||||
}
|
||||
(void) fputs(ZDIFF_MODIFIED "\t", fp);
|
||||
if (di->classify)
|
||||
(void) fprintf(fp, "%c\t", get_what(isb->zs_mode));
|
||||
print_cmn(fp, di, file);
|
||||
(void) fprintf(fp, "\t(%+d)", delta);
|
||||
(void) fprintf(fp, "\n");
|
||||
(void) fprintf(fp, "\t(%+d)\n", delta);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -229,12 +213,10 @@ print_file(FILE *fp, differ_info_t *di, char type, const char *file,
|
||||
(longlong_t)isb->zs_ctime[0],
|
||||
(longlong_t)isb->zs_ctime[1]);
|
||||
(void) fprintf(fp, "%c\t", type);
|
||||
if (di->classify) {
|
||||
print_what(fp, isb->zs_mode);
|
||||
(void) fprintf(fp, "\t");
|
||||
}
|
||||
if (di->classify)
|
||||
(void) fprintf(fp, "%c\t", get_what(isb->zs_mode));
|
||||
print_cmn(fp, di, file);
|
||||
(void) fprintf(fp, "\n");
|
||||
(void) fputc('\n', fp);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -327,7 +309,7 @@ write_inuse_diffs_one(FILE *fp, differ_info_t *di, uint64_t dobj)
|
||||
print_link_change(fp, di, change,
|
||||
change > 0 ? fobjname : tobjname, &tsb);
|
||||
} else if (strcmp(fobjname, tobjname) == 0) {
|
||||
print_file(fp, di, ZDIFF_MODIFIED, fobjname, &tsb);
|
||||
print_file(fp, di, *ZDIFF_MODIFIED, fobjname, &tsb);
|
||||
} else {
|
||||
print_rename(fp, di, fobjname, tobjname, &tsb);
|
||||
}
|
||||
@ -752,6 +734,7 @@ zfs_show_diffs(zfs_handle_t *zhp, int outfd, const char *fromsnap,
|
||||
di.scripted = (flags & ZFS_DIFF_PARSEABLE);
|
||||
di.classify = (flags & ZFS_DIFF_CLASSIFY);
|
||||
di.timestamped = (flags & ZFS_DIFF_TIMESTAMP);
|
||||
di.no_mangle = (flags & ZFS_DIFF_NO_MANGLE);
|
||||
|
||||
di.outputfd = outfd;
|
||||
di.datafd = pipefd[0];
|
||||
|
@ -232,6 +232,7 @@ typedef struct differ_info {
|
||||
boolean_t scripted;
|
||||
boolean_t classify;
|
||||
boolean_t timestamped;
|
||||
boolean_t no_mangle;
|
||||
uint64_t shares;
|
||||
int zerr;
|
||||
int cleanupfd;
|
||||
|
@ -595,9 +595,13 @@ unmount_one(zfs_handle_t *zhp, const char *mountpoint, int flags)
|
||||
default:
|
||||
libzfs_err = EZFS_UMOUNTFAILED;
|
||||
}
|
||||
return (zfs_error_fmt(zhp->zfs_hdl, libzfs_err,
|
||||
dgettext(TEXT_DOMAIN, "cannot unmount '%s'"),
|
||||
mountpoint));
|
||||
if (zhp) {
|
||||
return (zfs_error_fmt(zhp->zfs_hdl, libzfs_err,
|
||||
dgettext(TEXT_DOMAIN, "cannot unmount '%s'"),
|
||||
mountpoint));
|
||||
} else {
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
|
@ -29,6 +29,7 @@
|
||||
* Copyright (c) 2017, Intel Corporation.
|
||||
* Copyright (c) 2018, loli10K <ezomori.nozomu@gmail.com>
|
||||
* Copyright (c) 2021, Colm Buckley <colm@tuatha.org>
|
||||
* Copyright (c) 2021, Klara Inc.
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
@ -61,6 +62,7 @@ static boolean_t zpool_vdev_is_interior(const char *name);
|
||||
typedef struct prop_flags {
|
||||
int create:1; /* Validate property on creation */
|
||||
int import:1; /* Validate property on import */
|
||||
int vdevprop:1; /* Validate property as a VDEV property */
|
||||
} prop_flags_t;
|
||||
|
||||
/*
|
||||
@ -478,6 +480,35 @@ zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname,
|
||||
while ((elem = nvlist_next_nvpair(props, elem)) != NULL) {
|
||||
const char *propname = nvpair_name(elem);
|
||||
|
||||
if (flags.vdevprop && zpool_prop_vdev(propname)) {
|
||||
vdev_prop_t vprop = vdev_name_to_prop(propname);
|
||||
|
||||
if (vdev_prop_readonly(vprop)) {
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "'%s' "
|
||||
"is readonly"), propname);
|
||||
(void) zfs_error(hdl, EZFS_PROPREADONLY,
|
||||
errbuf);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (zprop_parse_value(hdl, elem, vprop, ZFS_TYPE_VDEV,
|
||||
retprops, &strval, &intval, errbuf) != 0)
|
||||
goto error;
|
||||
|
||||
continue;
|
||||
} else if (flags.vdevprop && vdev_prop_user(propname)) {
|
||||
if (nvlist_add_nvpair(retprops, elem) != 0) {
|
||||
(void) no_memory(hdl);
|
||||
goto error;
|
||||
}
|
||||
continue;
|
||||
} else if (flags.vdevprop) {
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
"invalid property: '%s'"), propname);
|
||||
(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
|
||||
goto error;
|
||||
}
|
||||
|
||||
prop = zpool_name_to_prop(propname);
|
||||
if (prop == ZPOOL_PROP_INVAL && zpool_prop_feature(propname)) {
|
||||
int err;
|
||||
@ -806,7 +837,7 @@ zpool_set_prop(zpool_handle_t *zhp, const char *propname, const char *propval)
|
||||
|
||||
int
|
||||
zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp,
|
||||
boolean_t literal)
|
||||
zfs_type_t type, boolean_t literal)
|
||||
{
|
||||
libzfs_handle_t *hdl = zhp->zpool_hdl;
|
||||
zprop_list_t *entry;
|
||||
@ -817,9 +848,12 @@ zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp,
|
||||
boolean_t firstexpand = (NULL == *plp);
|
||||
int i;
|
||||
|
||||
if (zprop_expand_list(hdl, plp, ZFS_TYPE_POOL) != 0)
|
||||
if (zprop_expand_list(hdl, plp, type) != 0)
|
||||
return (-1);
|
||||
|
||||
if (type == ZFS_TYPE_VDEV)
|
||||
return (0);
|
||||
|
||||
last = plp;
|
||||
while (*last != NULL)
|
||||
last = &(*last)->pl_next;
|
||||
@ -899,6 +933,77 @@ zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp,
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
vdev_expand_proplist(zpool_handle_t *zhp, const char *vdevname,
|
||||
zprop_list_t **plp)
|
||||
{
|
||||
zprop_list_t *entry;
|
||||
char buf[ZFS_MAXPROPLEN];
|
||||
char *strval = NULL;
|
||||
int err = 0;
|
||||
nvpair_t *elem = NULL;
|
||||
nvlist_t *vprops = NULL;
|
||||
nvlist_t *propval = NULL;
|
||||
const char *propname;
|
||||
vdev_prop_t prop;
|
||||
zprop_list_t **last;
|
||||
|
||||
for (entry = *plp; entry != NULL; entry = entry->pl_next) {
|
||||
if (entry->pl_fixed)
|
||||
continue;
|
||||
|
||||
if (zpool_get_vdev_prop(zhp, vdevname, entry->pl_prop,
|
||||
entry->pl_user_prop, buf, sizeof (buf), NULL,
|
||||
B_FALSE) == 0) {
|
||||
if (strlen(buf) > entry->pl_width)
|
||||
entry->pl_width = strlen(buf);
|
||||
}
|
||||
if (entry->pl_prop == VDEV_PROP_NAME &&
|
||||
strlen(vdevname) > entry->pl_width)
|
||||
entry->pl_width = strlen(vdevname);
|
||||
}
|
||||
|
||||
/* Handle the all properties case */
|
||||
last = plp;
|
||||
if (*last != NULL && (*last)->pl_all == B_TRUE) {
|
||||
while (*last != NULL)
|
||||
last = &(*last)->pl_next;
|
||||
|
||||
err = zpool_get_all_vdev_props(zhp, vdevname, &vprops);
|
||||
if (err != 0)
|
||||
return (err);
|
||||
|
||||
while ((elem = nvlist_next_nvpair(vprops, elem)) != NULL) {
|
||||
propname = nvpair_name(elem);
|
||||
|
||||
/* Skip properties that are not user defined */
|
||||
if ((prop = vdev_name_to_prop(propname)) !=
|
||||
VDEV_PROP_USER)
|
||||
continue;
|
||||
|
||||
if (nvpair_value_nvlist(elem, &propval) != 0)
|
||||
continue;
|
||||
|
||||
verify(nvlist_lookup_string(propval, ZPROP_VALUE,
|
||||
&strval) == 0);
|
||||
|
||||
if ((entry = zfs_alloc(zhp->zpool_hdl,
|
||||
sizeof (zprop_list_t))) == NULL)
|
||||
return (ENOMEM);
|
||||
|
||||
entry->pl_prop = prop;
|
||||
entry->pl_user_prop = zfs_strdup(zhp->zpool_hdl,
|
||||
propname);
|
||||
entry->pl_width = strlen(strval);
|
||||
entry->pl_all = B_TRUE;
|
||||
*last = entry;
|
||||
last = &entry->pl_next;
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the state for the given feature on the given ZFS pool.
|
||||
*/
|
||||
@ -3702,8 +3807,8 @@ zpool_vdev_split(zpool_handle_t *zhp, char *newname, nvlist_t **newroot,
|
||||
}
|
||||
|
||||
/* Add all the children we found */
|
||||
if (nvlist_add_nvlist_array(*newroot, ZPOOL_CONFIG_CHILDREN, varray,
|
||||
lastlog == 0 ? vcount : lastlog) != 0)
|
||||
if (nvlist_add_nvlist_array(*newroot, ZPOOL_CONFIG_CHILDREN,
|
||||
(const nvlist_t **)varray, lastlog == 0 ? vcount : lastlog) != 0)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
@ -4446,7 +4551,7 @@ zpool_get_history(zpool_handle_t *zhp, nvlist_t **nvhisp, uint64_t *off,
|
||||
if (!err) {
|
||||
verify(nvlist_alloc(nvhisp, NV_UNIQUE_NAME, 0) == 0);
|
||||
verify(nvlist_add_nvlist_array(*nvhisp, ZPOOL_HIST_RECORD,
|
||||
records, numrecords) == 0);
|
||||
(const nvlist_t **)records, numrecords) == 0);
|
||||
}
|
||||
for (i = 0; i < numrecords; i++)
|
||||
nvlist_free(records[i]);
|
||||
@ -4959,3 +5064,350 @@ zpool_load_compat(const char *compat, boolean_t *features, char *report,
|
||||
strlcpy(report, gettext("compatibility set ok"), rlen);
|
||||
return (ZPOOL_COMPATIBILITY_OK);
|
||||
}
|
||||
|
||||
static int
|
||||
zpool_vdev_guid(zpool_handle_t *zhp, const char *vdevname, uint64_t *vdev_guid)
|
||||
{
|
||||
nvlist_t *tgt;
|
||||
boolean_t avail_spare, l2cache;
|
||||
|
||||
verify(zhp != NULL);
|
||||
if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
|
||||
char errbuf[1024];
|
||||
(void) snprintf(errbuf, sizeof (errbuf),
|
||||
dgettext(TEXT_DOMAIN, "pool is in an unavailable state"));
|
||||
return (zfs_error(zhp->zpool_hdl, EZFS_POOLUNAVAIL, errbuf));
|
||||
}
|
||||
|
||||
if ((tgt = zpool_find_vdev(zhp, vdevname, &avail_spare, &l2cache,
|
||||
NULL)) == NULL) {
|
||||
char errbuf[1024];
|
||||
(void) snprintf(errbuf, sizeof (errbuf),
|
||||
dgettext(TEXT_DOMAIN, "can not find %s in %s"),
|
||||
vdevname, zhp->zpool_name);
|
||||
return (zfs_error(zhp->zpool_hdl, EZFS_NODEVICE, errbuf));
|
||||
}
|
||||
|
||||
verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, vdev_guid) == 0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get a vdev property value for 'prop' and return the value in
|
||||
* a pre-allocated buffer.
|
||||
*/
|
||||
int
|
||||
zpool_get_vdev_prop_value(nvlist_t *nvprop, vdev_prop_t prop, char *prop_name,
|
||||
char *buf, size_t len, zprop_source_t *srctype, boolean_t literal)
|
||||
{
|
||||
nvlist_t *nv;
|
||||
uint64_t intval;
|
||||
char *strval;
|
||||
zprop_source_t src = ZPROP_SRC_NONE;
|
||||
|
||||
if (prop == VDEV_PROP_USER) {
|
||||
/* user property, prop_name must contain the property name */
|
||||
assert(prop_name != NULL);
|
||||
if (nvlist_lookup_nvlist(nvprop, prop_name, &nv) == 0) {
|
||||
verify(nvlist_lookup_uint64(nv, ZPROP_SOURCE,
|
||||
&intval) == 0);
|
||||
src = intval;
|
||||
verify(nvlist_lookup_string(nv, ZPROP_VALUE,
|
||||
&strval) == 0);
|
||||
} else {
|
||||
/* user prop not found */
|
||||
return (-1);
|
||||
}
|
||||
(void) strlcpy(buf, strval, len);
|
||||
if (srctype)
|
||||
*srctype = src;
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (prop_name == NULL)
|
||||
prop_name = (char *)vdev_prop_to_name(prop);
|
||||
|
||||
switch (vdev_prop_get_type(prop)) {
|
||||
case PROP_TYPE_STRING:
|
||||
if (nvlist_lookup_nvlist(nvprop, prop_name, &nv) == 0) {
|
||||
verify(nvlist_lookup_uint64(nv, ZPROP_SOURCE,
|
||||
&intval) == 0);
|
||||
src = intval;
|
||||
verify(nvlist_lookup_string(nv, ZPROP_VALUE,
|
||||
&strval) == 0);
|
||||
} else {
|
||||
src = ZPROP_SRC_DEFAULT;
|
||||
if ((strval = (char *)vdev_prop_default_string(prop))
|
||||
== NULL)
|
||||
strval = "-";
|
||||
}
|
||||
(void) strlcpy(buf, strval, len);
|
||||
break;
|
||||
|
||||
case PROP_TYPE_NUMBER:
|
||||
if (nvlist_lookup_nvlist(nvprop, prop_name, &nv) == 0) {
|
||||
verify(nvlist_lookup_uint64(nv, ZPROP_SOURCE,
|
||||
&intval) == 0);
|
||||
src = intval;
|
||||
verify(nvlist_lookup_uint64(nv, ZPROP_VALUE,
|
||||
&intval) == 0);
|
||||
} else {
|
||||
src = ZPROP_SRC_DEFAULT;
|
||||
intval = vdev_prop_default_numeric(prop);
|
||||
}
|
||||
|
||||
switch (prop) {
|
||||
case VDEV_PROP_ASIZE:
|
||||
case VDEV_PROP_PSIZE:
|
||||
case VDEV_PROP_SIZE:
|
||||
case VDEV_PROP_ALLOCATED:
|
||||
case VDEV_PROP_FREE:
|
||||
case VDEV_PROP_READ_ERRORS:
|
||||
case VDEV_PROP_WRITE_ERRORS:
|
||||
case VDEV_PROP_CHECKSUM_ERRORS:
|
||||
case VDEV_PROP_INITIALIZE_ERRORS:
|
||||
case VDEV_PROP_OPS_NULL:
|
||||
case VDEV_PROP_OPS_READ:
|
||||
case VDEV_PROP_OPS_WRITE:
|
||||
case VDEV_PROP_OPS_FREE:
|
||||
case VDEV_PROP_OPS_CLAIM:
|
||||
case VDEV_PROP_OPS_TRIM:
|
||||
case VDEV_PROP_BYTES_NULL:
|
||||
case VDEV_PROP_BYTES_READ:
|
||||
case VDEV_PROP_BYTES_WRITE:
|
||||
case VDEV_PROP_BYTES_FREE:
|
||||
case VDEV_PROP_BYTES_CLAIM:
|
||||
case VDEV_PROP_BYTES_TRIM:
|
||||
if (literal) {
|
||||
(void) snprintf(buf, len, "%llu",
|
||||
(u_longlong_t)intval);
|
||||
} else {
|
||||
(void) zfs_nicenum(intval, buf, len);
|
||||
}
|
||||
break;
|
||||
case VDEV_PROP_EXPANDSZ:
|
||||
if (intval == 0) {
|
||||
(void) strlcpy(buf, "-", len);
|
||||
} else if (literal) {
|
||||
(void) snprintf(buf, len, "%llu",
|
||||
(u_longlong_t)intval);
|
||||
} else {
|
||||
(void) zfs_nicenum(intval, buf, len);
|
||||
}
|
||||
break;
|
||||
case VDEV_PROP_CAPACITY:
|
||||
if (literal) {
|
||||
(void) snprintf(buf, len, "%llu",
|
||||
(u_longlong_t)intval);
|
||||
} else {
|
||||
(void) snprintf(buf, len, "%llu%%",
|
||||
(u_longlong_t)intval);
|
||||
}
|
||||
break;
|
||||
case VDEV_PROP_FRAGMENTATION:
|
||||
if (intval == UINT64_MAX) {
|
||||
(void) strlcpy(buf, "-", len);
|
||||
} else {
|
||||
(void) snprintf(buf, len, "%llu%%",
|
||||
(u_longlong_t)intval);
|
||||
}
|
||||
break;
|
||||
case VDEV_PROP_STATE:
|
||||
if (literal) {
|
||||
(void) snprintf(buf, len, "%llu",
|
||||
(u_longlong_t)intval);
|
||||
} else {
|
||||
(void) strlcpy(buf, zpool_state_to_name(intval,
|
||||
VDEV_AUX_NONE), len);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
(void) snprintf(buf, len, "%llu",
|
||||
(u_longlong_t)intval);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_TYPE_INDEX:
|
||||
if (nvlist_lookup_nvlist(nvprop, prop_name, &nv) == 0) {
|
||||
verify(nvlist_lookup_uint64(nv, ZPROP_SOURCE,
|
||||
&intval) == 0);
|
||||
src = intval;
|
||||
verify(nvlist_lookup_uint64(nv, ZPROP_VALUE,
|
||||
&intval) == 0);
|
||||
} else {
|
||||
src = ZPROP_SRC_DEFAULT;
|
||||
intval = vdev_prop_default_numeric(prop);
|
||||
}
|
||||
if (vdev_prop_index_to_string(prop, intval,
|
||||
(const char **)&strval) != 0)
|
||||
return (-1);
|
||||
(void) strlcpy(buf, strval, len);
|
||||
break;
|
||||
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
|
||||
if (srctype)
|
||||
*srctype = src;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get a vdev property value for 'prop_name' and return the value in
|
||||
* a pre-allocated buffer.
|
||||
*/
|
||||
int
|
||||
zpool_get_vdev_prop(zpool_handle_t *zhp, const char *vdevname, vdev_prop_t prop,
|
||||
char *prop_name, char *buf, size_t len, zprop_source_t *srctype,
|
||||
boolean_t literal)
|
||||
{
|
||||
nvlist_t *reqnvl, *reqprops;
|
||||
nvlist_t *retprops = NULL;
|
||||
uint64_t vdev_guid;
|
||||
int ret;
|
||||
|
||||
if ((ret = zpool_vdev_guid(zhp, vdevname, &vdev_guid)) != 0)
|
||||
return (ret);
|
||||
|
||||
if (nvlist_alloc(&reqnvl, NV_UNIQUE_NAME, 0) != 0)
|
||||
return (no_memory(zhp->zpool_hdl));
|
||||
if (nvlist_alloc(&reqprops, NV_UNIQUE_NAME, 0) != 0)
|
||||
return (no_memory(zhp->zpool_hdl));
|
||||
|
||||
fnvlist_add_uint64(reqnvl, ZPOOL_VDEV_PROPS_GET_VDEV, vdev_guid);
|
||||
|
||||
if (prop != VDEV_PROP_USER) {
|
||||
/* prop_name overrides prop value */
|
||||
if (prop_name != NULL)
|
||||
prop = vdev_name_to_prop(prop_name);
|
||||
else
|
||||
prop_name = (char *)vdev_prop_to_name(prop);
|
||||
assert(prop < VDEV_NUM_PROPS);
|
||||
}
|
||||
|
||||
assert(prop_name != NULL);
|
||||
if (nvlist_add_uint64(reqprops, prop_name, prop) != 0) {
|
||||
nvlist_free(reqnvl);
|
||||
nvlist_free(reqprops);
|
||||
return (no_memory(zhp->zpool_hdl));
|
||||
}
|
||||
|
||||
fnvlist_add_nvlist(reqnvl, ZPOOL_VDEV_PROPS_GET_PROPS, reqprops);
|
||||
|
||||
ret = lzc_get_vdev_prop(zhp->zpool_name, reqnvl, &retprops);
|
||||
|
||||
if (ret == 0) {
|
||||
ret = zpool_get_vdev_prop_value(retprops, prop, prop_name, buf,
|
||||
len, srctype, literal);
|
||||
} else {
|
||||
char errbuf[1024];
|
||||
(void) snprintf(errbuf, sizeof (errbuf),
|
||||
dgettext(TEXT_DOMAIN, "cannot get vdev property %s from"
|
||||
" %s in %s"), prop_name, vdevname, zhp->zpool_name);
|
||||
(void) zpool_standard_error(zhp->zpool_hdl, ret, errbuf);
|
||||
}
|
||||
|
||||
nvlist_free(reqnvl);
|
||||
nvlist_free(reqprops);
|
||||
nvlist_free(retprops);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get all vdev properties
|
||||
*/
|
||||
int
|
||||
zpool_get_all_vdev_props(zpool_handle_t *zhp, const char *vdevname,
|
||||
nvlist_t **outnvl)
|
||||
{
|
||||
nvlist_t *nvl = NULL;
|
||||
uint64_t vdev_guid;
|
||||
int ret;
|
||||
|
||||
if ((ret = zpool_vdev_guid(zhp, vdevname, &vdev_guid)) != 0)
|
||||
return (ret);
|
||||
|
||||
if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0)
|
||||
return (no_memory(zhp->zpool_hdl));
|
||||
|
||||
fnvlist_add_uint64(nvl, ZPOOL_VDEV_PROPS_GET_VDEV, vdev_guid);
|
||||
|
||||
ret = lzc_get_vdev_prop(zhp->zpool_name, nvl, outnvl);
|
||||
|
||||
nvlist_free(nvl);
|
||||
|
||||
if (ret) {
|
||||
char errbuf[1024];
|
||||
(void) snprintf(errbuf, sizeof (errbuf),
|
||||
dgettext(TEXT_DOMAIN, "cannot get vdev properties for"
|
||||
" %s in %s"), vdevname, zhp->zpool_name);
|
||||
(void) zpool_standard_error(zhp->zpool_hdl, errno, errbuf);
|
||||
}
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set vdev property
|
||||
*/
|
||||
int
|
||||
zpool_set_vdev_prop(zpool_handle_t *zhp, const char *vdevname,
|
||||
const char *propname, const char *propval)
|
||||
{
|
||||
int ret;
|
||||
nvlist_t *nvl = NULL;
|
||||
nvlist_t *outnvl = NULL;
|
||||
nvlist_t *props;
|
||||
nvlist_t *realprops;
|
||||
prop_flags_t flags = { 0 };
|
||||
uint64_t version;
|
||||
uint64_t vdev_guid;
|
||||
|
||||
if ((ret = zpool_vdev_guid(zhp, vdevname, &vdev_guid)) != 0)
|
||||
return (ret);
|
||||
|
||||
if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0)
|
||||
return (no_memory(zhp->zpool_hdl));
|
||||
if (nvlist_alloc(&props, NV_UNIQUE_NAME, 0) != 0)
|
||||
return (no_memory(zhp->zpool_hdl));
|
||||
|
||||
fnvlist_add_uint64(nvl, ZPOOL_VDEV_PROPS_SET_VDEV, vdev_guid);
|
||||
|
||||
if (nvlist_add_string(props, propname, propval) != 0) {
|
||||
nvlist_free(props);
|
||||
return (no_memory(zhp->zpool_hdl));
|
||||
}
|
||||
|
||||
char errbuf[1024];
|
||||
(void) snprintf(errbuf, sizeof (errbuf),
|
||||
dgettext(TEXT_DOMAIN, "cannot set property %s for %s on %s"),
|
||||
propname, vdevname, zhp->zpool_name);
|
||||
|
||||
flags.vdevprop = 1;
|
||||
version = zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL);
|
||||
if ((realprops = zpool_valid_proplist(zhp->zpool_hdl,
|
||||
zhp->zpool_name, props, version, flags, errbuf)) == NULL) {
|
||||
nvlist_free(props);
|
||||
nvlist_free(nvl);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
nvlist_free(props);
|
||||
props = realprops;
|
||||
|
||||
fnvlist_add_nvlist(nvl, ZPOOL_VDEV_PROPS_SET_PROPS, props);
|
||||
|
||||
ret = lzc_set_vdev_prop(zhp->zpool_name, nvl, &outnvl);
|
||||
|
||||
nvlist_free(props);
|
||||
nvlist_free(nvl);
|
||||
nvlist_free(outnvl);
|
||||
|
||||
if (ret)
|
||||
(void) zpool_standard_error(zhp->zpool_hdl, errno, errbuf);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
@ -296,6 +296,9 @@ libzfs_error_description(libzfs_handle_t *hdl)
|
||||
case EZFS_REBUILDING:
|
||||
return (dgettext(TEXT_DOMAIN, "currently sequentially "
|
||||
"resilvering"));
|
||||
case EZFS_VDEV_NOTSUP:
|
||||
return (dgettext(TEXT_DOMAIN, "operation not supported "
|
||||
"on this type of vdev"));
|
||||
case EZFS_UNKNOWN:
|
||||
return (dgettext(TEXT_DOMAIN, "unknown error"));
|
||||
default:
|
||||
@ -716,6 +719,9 @@ zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
|
||||
case ZFS_ERR_BADPROP:
|
||||
zfs_verror(hdl, EZFS_BADPROP, fmt, ap);
|
||||
break;
|
||||
case ZFS_ERR_VDEV_NOTSUP:
|
||||
zfs_verror(hdl, EZFS_VDEV_NOTSUP, fmt, ap);
|
||||
break;
|
||||
case ZFS_ERR_IOC_CMD_UNAVAIL:
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "the loaded zfs "
|
||||
"module does not support this operation. A reboot may "
|
||||
@ -1034,6 +1040,7 @@ libzfs_init(void)
|
||||
zfs_prop_init();
|
||||
zpool_prop_init();
|
||||
zpool_feature_init();
|
||||
vdev_prop_init();
|
||||
libzfs_mnttab_init(hdl);
|
||||
fletcher_4_init();
|
||||
|
||||
@ -1267,7 +1274,8 @@ zprop_print_headers(zprop_get_cbdata_t *cbp, zfs_type_t type)
|
||||
|
||||
/* first property is always NAME */
|
||||
assert(cbp->cb_proplist->pl_prop ==
|
||||
((type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME : ZFS_PROP_NAME));
|
||||
((type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME :
|
||||
((type == ZFS_TYPE_VDEV) ? VDEV_PROP_NAME : ZFS_PROP_NAME)));
|
||||
|
||||
/*
|
||||
* Go through and calculate the widths for each column. For the
|
||||
@ -1284,12 +1292,16 @@ zprop_print_headers(zprop_get_cbdata_t *cbp, zfs_type_t type)
|
||||
if (pl->pl_prop != ZPROP_INVAL) {
|
||||
const char *propname = (type == ZFS_TYPE_POOL) ?
|
||||
zpool_prop_to_name(pl->pl_prop) :
|
||||
zfs_prop_to_name(pl->pl_prop);
|
||||
((type == ZFS_TYPE_VDEV) ?
|
||||
vdev_prop_to_name(pl->pl_prop) :
|
||||
zfs_prop_to_name(pl->pl_prop));
|
||||
|
||||
assert(propname != NULL);
|
||||
len = strlen(propname);
|
||||
if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
|
||||
cbp->cb_colwidths[GET_COL_PROPERTY] = len;
|
||||
} else {
|
||||
assert(pl->pl_user_prop != NULL);
|
||||
len = strlen(pl->pl_user_prop);
|
||||
if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
|
||||
cbp->cb_colwidths[GET_COL_PROPERTY] = len;
|
||||
@ -1314,9 +1326,10 @@ zprop_print_headers(zprop_get_cbdata_t *cbp, zfs_type_t type)
|
||||
/*
|
||||
* 'NAME' and 'SOURCE' columns
|
||||
*/
|
||||
if (pl->pl_prop == (type == ZFS_TYPE_POOL ? ZPOOL_PROP_NAME :
|
||||
ZFS_PROP_NAME) &&
|
||||
pl->pl_width > cbp->cb_colwidths[GET_COL_NAME]) {
|
||||
if (pl->pl_prop == ((type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME :
|
||||
((type == ZFS_TYPE_VDEV) ? VDEV_PROP_NAME :
|
||||
ZFS_PROP_NAME)) && pl->pl_width >
|
||||
cbp->cb_colwidths[GET_COL_NAME]) {
|
||||
cbp->cb_colwidths[GET_COL_NAME] = pl->pl_width;
|
||||
cbp->cb_colwidths[GET_COL_SOURCE] = pl->pl_width +
|
||||
strlen(dgettext(TEXT_DOMAIN, "inherited from"));
|
||||
@ -1597,6 +1610,9 @@ zprop_parse_value(libzfs_handle_t *hdl, nvpair_t *elem, int prop,
|
||||
if (type == ZFS_TYPE_POOL) {
|
||||
proptype = zpool_prop_get_type(prop);
|
||||
propname = zpool_prop_to_name(prop);
|
||||
} else if (type == ZFS_TYPE_VDEV) {
|
||||
proptype = vdev_prop_get_type(prop);
|
||||
propname = vdev_prop_to_name(prop);
|
||||
} else {
|
||||
proptype = zfs_prop_get_type(prop);
|
||||
propname = zfs_prop_to_name(prop);
|
||||
@ -1747,15 +1763,15 @@ addlist(libzfs_handle_t *hdl, char *propname, zprop_list_t **listp,
|
||||
prop = ZPROP_INVAL;
|
||||
|
||||
/*
|
||||
* When no property table entry can be found, return failure if
|
||||
* this is a pool property or if this isn't a user-defined
|
||||
* dataset property,
|
||||
* Return failure if no property table entry was found and this isn't
|
||||
* a user-defined property.
|
||||
*/
|
||||
if (prop == ZPROP_INVAL && ((type == ZFS_TYPE_POOL &&
|
||||
!zpool_prop_feature(propname) &&
|
||||
!zpool_prop_unsupported(propname)) ||
|
||||
(type == ZFS_TYPE_DATASET && !zfs_prop_user(propname) &&
|
||||
!zfs_prop_userquota(propname) && !zfs_prop_written(propname)))) {
|
||||
((type == ZFS_TYPE_DATASET) && !zfs_prop_user(propname) &&
|
||||
!zfs_prop_userquota(propname) && !zfs_prop_written(propname)) ||
|
||||
((type == ZFS_TYPE_VDEV) && !vdev_prop_user(propname)))) {
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
"invalid property '%s'"), propname);
|
||||
return (zfs_error(hdl, EZFS_BADPROP,
|
||||
@ -1938,8 +1954,8 @@ zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, zfs_type_t type)
|
||||
if ((entry = zfs_alloc(hdl, sizeof (zprop_list_t))) == NULL)
|
||||
return (-1);
|
||||
|
||||
entry->pl_prop = (type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME :
|
||||
ZFS_PROP_NAME;
|
||||
entry->pl_prop = ((type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME :
|
||||
((type == ZFS_TYPE_VDEV) ? VDEV_PROP_NAME : ZFS_PROP_NAME));
|
||||
entry->pl_width = zprop_width(entry->pl_prop,
|
||||
&entry->pl_fixed, type);
|
||||
entry->pl_all = B_TRUE;
|
||||
|
@ -305,6 +305,10 @@ zfs_jail(zfs_handle_t *zhp, int jailid, int attach)
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
"bookmarks can not be jailed"));
|
||||
return (zfs_error(hdl, EZFS_BADTYPE, errbuf));
|
||||
case ZFS_TYPE_VDEV:
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
"vdevs can not be jailed"));
|
||||
return (zfs_error(hdl, EZFS_BADTYPE, errbuf));
|
||||
case ZFS_TYPE_POOL:
|
||||
case ZFS_TYPE_FILESYSTEM:
|
||||
/* OK */
|
||||
|
@ -6,6 +6,8 @@
|
||||
<dependency name='ld-linux-x86-64.so.2'/>
|
||||
</elf-needed>
|
||||
<elf-function-symbols>
|
||||
<elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='_sol_getmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='atomic_add_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='atomic_add_16_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -167,6 +169,7 @@
|
||||
<elf-symbol name='lzc_get_bookmarks' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_get_bootenv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_get_holds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_get_vdev_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_hold' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_initialize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_ioctl_fd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -192,6 +195,7 @@
|
||||
<elf-symbol name='lzc_send_space' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_send_space_resume_redacted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_set_bootenv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_set_vdev_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_snaprange_space' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_snapshot' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzc_sync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -711,9 +715,6 @@
|
||||
<array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'>
|
||||
<subrange length='20' type-id='7359adad' id='fdca39cf'/>
|
||||
</array-type-def>
|
||||
<class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/>
|
||||
<class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/>
|
||||
<class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/>
|
||||
<class-decl name='mnttab' size-in-bits='256' is-struct='yes' visibility='default' id='1b055409'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='mnt_special' type-id='26a90f95' visibility='default'/>
|
||||
@ -748,66 +749,18 @@
|
||||
<var-decl name='mnt_minor' type-id='3502e3ff' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<class-decl name='stat64' size-in-bits='1152' is-struct='yes' visibility='default' id='0bbec9cd'>
|
||||
<typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/>
|
||||
<class-decl name='_IO_marker' size-in-bits='192' is-struct='yes' visibility='default' id='010ae0b9'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='st_dev' type-id='35ed8932' visibility='default'/>
|
||||
<var-decl name='_next' type-id='e4c6fa61' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='st_ino' type-id='71288a47' visibility='default'/>
|
||||
<var-decl name='_sbuf' type-id='dca988a5' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='st_nlink' type-id='80f0b9df' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='192'>
|
||||
<var-decl name='st_mode' type-id='e1c52942' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='224'>
|
||||
<var-decl name='st_uid' type-id='cc5fcceb' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='256'>
|
||||
<var-decl name='st_gid' type-id='d94ec6d9' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='288'>
|
||||
<var-decl name='__pad0' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='320'>
|
||||
<var-decl name='st_rdev' type-id='35ed8932' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='384'>
|
||||
<var-decl name='st_size' type-id='79989e9c' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='448'>
|
||||
<var-decl name='st_blksize' type-id='d3f10a7f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='512'>
|
||||
<var-decl name='st_blocks' type-id='4e711bf1' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='576'>
|
||||
<var-decl name='st_atim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='704'>
|
||||
<var-decl name='st_mtim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='832'>
|
||||
<var-decl name='st_ctim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='960'>
|
||||
<var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/>
|
||||
<var-decl name='_pos' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__dev_t' type-id='7359adad' id='35ed8932'/>
|
||||
<typedef-decl name='__uid_t' type-id='f0981eeb' id='cc5fcceb'/>
|
||||
<typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/>
|
||||
<typedef-decl name='__ino64_t' type-id='7359adad' id='71288a47'/>
|
||||
<typedef-decl name='__nlink_t' type-id='7359adad' id='80f0b9df'/>
|
||||
<typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/>
|
||||
<typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/>
|
||||
<typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/>
|
||||
<typedef-decl name='__blksize_t' type-id='bd54fe1a' id='d3f10a7f'/>
|
||||
<typedef-decl name='__blkcnt64_t' type-id='bd54fe1a' id='4e711bf1'/>
|
||||
<typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/>
|
||||
<typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/>
|
||||
<typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/>
|
||||
<class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='_flags' type-id='95e97e5e' visibility='default'/>
|
||||
@ -876,16 +829,16 @@
|
||||
<var-decl name='_offset' type-id='724e4de6' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1216'>
|
||||
<var-decl name='_codecvt' type-id='570f8c59' visibility='default'/>
|
||||
<var-decl name='__pad1' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1280'>
|
||||
<var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/>
|
||||
<var-decl name='__pad2' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1344'>
|
||||
<var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/>
|
||||
<var-decl name='__pad3' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1408'>
|
||||
<var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/>
|
||||
<var-decl name='__pad4' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1472'>
|
||||
<var-decl name='__pad5' type-id='b59d7dce' visibility='default'/>
|
||||
@ -897,6 +850,65 @@
|
||||
<var-decl name='_unused2' type-id='664ac0b7' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<class-decl name='stat64' size-in-bits='1152' is-struct='yes' visibility='default' id='0bbec9cd'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='st_dev' type-id='35ed8932' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='st_ino' type-id='71288a47' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='st_nlink' type-id='80f0b9df' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='192'>
|
||||
<var-decl name='st_mode' type-id='e1c52942' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='224'>
|
||||
<var-decl name='st_uid' type-id='cc5fcceb' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='256'>
|
||||
<var-decl name='st_gid' type-id='d94ec6d9' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='288'>
|
||||
<var-decl name='__pad0' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='320'>
|
||||
<var-decl name='st_rdev' type-id='35ed8932' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='384'>
|
||||
<var-decl name='st_size' type-id='79989e9c' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='448'>
|
||||
<var-decl name='st_blksize' type-id='d3f10a7f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='512'>
|
||||
<var-decl name='st_blocks' type-id='4e711bf1' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='576'>
|
||||
<var-decl name='st_atim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='704'>
|
||||
<var-decl name='st_mtim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='832'>
|
||||
<var-decl name='st_ctim' type-id='a9c79a1f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='960'>
|
||||
<var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__dev_t' type-id='7359adad' id='35ed8932'/>
|
||||
<typedef-decl name='__uid_t' type-id='f0981eeb' id='cc5fcceb'/>
|
||||
<typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/>
|
||||
<typedef-decl name='__ino64_t' type-id='7359adad' id='71288a47'/>
|
||||
<typedef-decl name='__nlink_t' type-id='7359adad' id='80f0b9df'/>
|
||||
<typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/>
|
||||
<typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/>
|
||||
<typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/>
|
||||
<typedef-decl name='__blksize_t' type-id='bd54fe1a' id='d3f10a7f'/>
|
||||
<typedef-decl name='__blkcnt64_t' type-id='bd54fe1a' id='4e711bf1'/>
|
||||
<typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/>
|
||||
<typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/>
|
||||
<class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' id='a9c79a1f'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='tv_sec' type-id='65eda9c0' visibility='default'/>
|
||||
@ -907,16 +919,11 @@
|
||||
</class-decl>
|
||||
<pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/>
|
||||
<pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/>
|
||||
<pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/>
|
||||
<pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/>
|
||||
<pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/>
|
||||
<pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/>
|
||||
<pointer-type-def type-id='0c544dc0' size-in-bits='64' id='394fc496'/>
|
||||
<pointer-type-def type-id='1b055409' size-in-bits='64' id='9d424d31'/>
|
||||
<pointer-type-def type-id='0bbec9cd' size-in-bits='64' id='62f7a03d'/>
|
||||
<class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/>
|
||||
<class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/>
|
||||
<class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/>
|
||||
<function-decl name='getmntany' mangled-name='getmntany' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getmntany'>
|
||||
<parameter type-id='822cd80b' name='fp'/>
|
||||
<parameter type-id='9d424d31' name='mgetp'/>
|
||||
@ -1002,7 +1009,6 @@
|
||||
<type-decl name='unsigned char' size-in-bits='8' id='002ac4a6'/>
|
||||
<type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/>
|
||||
<type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/>
|
||||
<type-decl name='void' id='48b5725f'/>
|
||||
<enum-decl name='lzc_dataset_type' id='bc9887f1'>
|
||||
<underlying-type type-id='9cac1fee'/>
|
||||
<enumerator name='LZC_DATSET_TYPE_ZFS' value='2'/>
|
||||
@ -1823,6 +1829,18 @@
|
||||
<parameter type-id='857bb57e' name='outnvl'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzc_get_vdev_prop' mangled-name='lzc_get_vdev_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_get_vdev_prop'>
|
||||
<parameter type-id='80f4b756' name='poolname'/>
|
||||
<parameter type-id='5ce45b60' name='innvl'/>
|
||||
<parameter type-id='857bb57e' name='outnvl'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzc_set_vdev_prop' mangled-name='lzc_set_vdev_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_set_vdev_prop'>
|
||||
<parameter type-id='80f4b756' name='poolname'/>
|
||||
<parameter type-id='5ce45b60' name='innvl'/>
|
||||
<parameter type-id='857bb57e' name='outnvl'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzc_load_key' mangled-name='lzc_load_key' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_load_key'>
|
||||
<parameter type-id='80f4b756' name='fsname'/>
|
||||
<parameter type-id='c19b74c3' name='noop'/>
|
||||
@ -1898,6 +1916,7 @@
|
||||
<parameter type-id='857bb57e' name='outnvl'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<type-decl name='void' id='48b5725f'/>
|
||||
</abi-instr>
|
||||
<abi-instr address-size='64' path='os/linux/libzfs_core_ioctl.c' language='LANG_C99'>
|
||||
<array-type-def dimensions='1' type-id='a84c031d' size-in-bits='32768' id='d16c6df4'>
|
||||
|
@ -1394,6 +1394,18 @@ lzc_channel_program_nosync(const char *pool, const char *program,
|
||||
memlimit, argnvl, outnvl));
|
||||
}
|
||||
|
||||
int
|
||||
lzc_get_vdev_prop(const char *poolname, nvlist_t *innvl, nvlist_t **outnvl)
|
||||
{
|
||||
return (lzc_ioctl(ZFS_IOC_VDEV_GET_PROPS, poolname, innvl, outnvl));
|
||||
}
|
||||
|
||||
int
|
||||
lzc_set_vdev_prop(const char *poolname, nvlist_t *innvl, nvlist_t **outnvl)
|
||||
{
|
||||
return (lzc_ioctl(ZFS_IOC_VDEV_SET_PROPS, poolname, innvl, outnvl));
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs key management functions
|
||||
*
|
||||
|
@ -5,6 +5,8 @@
|
||||
<dependency name='libc.so.6'/>
|
||||
</elf-needed>
|
||||
<elf-function-symbols>
|
||||
<elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzbe_add_pair' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzbe_bootenv_print' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzbe_get_boot_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@ -18,7 +20,6 @@
|
||||
<type-decl name='char' size-in-bits='8' id='a84c031d'/>
|
||||
<type-decl name='int' size-in-bits='32' id='95e97e5e'/>
|
||||
<type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
|
||||
<type-decl name='void' id='48b5725f'/>
|
||||
<enum-decl name='lzbe_flags' id='2b77720b'>
|
||||
<underlying-type type-id='9cac1fee'/>
|
||||
<enumerator name='lzbe_add' value='0'/>
|
||||
@ -83,16 +84,21 @@
|
||||
<array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'>
|
||||
<subrange length='20' type-id='7359adad' id='fdca39cf'/>
|
||||
</array-type-def>
|
||||
<class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/>
|
||||
<class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/>
|
||||
<class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/>
|
||||
<type-decl name='long int' size-in-bits='64' id='bd54fe1a'/>
|
||||
<type-decl name='signed char' size-in-bits='8' id='28577a57'/>
|
||||
<type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/>
|
||||
<typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/>
|
||||
<typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/>
|
||||
<typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/>
|
||||
<typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/>
|
||||
<class-decl name='_IO_marker' size-in-bits='192' is-struct='yes' visibility='default' id='010ae0b9'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='_next' type-id='e4c6fa61' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='_sbuf' type-id='dca988a5' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='_pos' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='_flags' type-id='95e97e5e' visibility='default'/>
|
||||
@ -161,16 +167,16 @@
|
||||
<var-decl name='_offset' type-id='724e4de6' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1216'>
|
||||
<var-decl name='_codecvt' type-id='570f8c59' visibility='default'/>
|
||||
<var-decl name='__pad1' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1280'>
|
||||
<var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/>
|
||||
<var-decl name='__pad2' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1344'>
|
||||
<var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/>
|
||||
<var-decl name='__pad3' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1408'>
|
||||
<var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/>
|
||||
<var-decl name='__pad4' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1472'>
|
||||
<var-decl name='__pad5' type-id='b59d7dce' visibility='default'/>
|
||||
@ -182,20 +188,19 @@
|
||||
<var-decl name='_unused2' type-id='664ac0b7' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/>
|
||||
<typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/>
|
||||
<typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/>
|
||||
<pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/>
|
||||
<pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/>
|
||||
<pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/>
|
||||
<pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/>
|
||||
<pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/>
|
||||
<pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/>
|
||||
<class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/>
|
||||
<class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/>
|
||||
<class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/>
|
||||
<function-decl name='lzbe_bootenv_print' mangled-name='lzbe_bootenv_print' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_bootenv_print'>
|
||||
<parameter type-id='80f4b756' name='pool'/>
|
||||
<parameter type-id='80f4b756' name='nvlist'/>
|
||||
<parameter type-id='822cd80b' name='of'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<type-decl name='void' id='48b5725f'/>
|
||||
</abi-instr>
|
||||
</abi-corpus>
|
||||
|
@ -293,7 +293,8 @@ lzbe_add_pair(void *ptr, const char *key, const char *type, void *value,
|
||||
break;
|
||||
|
||||
case DATA_TYPE_NVLIST_ARRAY:
|
||||
rv = nvlist_add_nvlist_array(nv, key, value, size);
|
||||
rv = nvlist_add_nvlist_array(nv, key, (const nvlist_t **)value,
|
||||
size);
|
||||
break;
|
||||
|
||||
case DATA_TYPE_BOOLEAN_VALUE:
|
||||
|
@ -58,8 +58,8 @@ KERNEL_C = \
|
||||
bplist.c \
|
||||
bpobj.c \
|
||||
bptree.c \
|
||||
btree.c \
|
||||
bqueue.c \
|
||||
btree.c \
|
||||
cityhash.c \
|
||||
dbuf.c \
|
||||
dbuf_stats.c \
|
||||
@ -78,23 +78,23 @@ KERNEL_C = \
|
||||
dnode.c \
|
||||
dnode_sync.c \
|
||||
dsl_bookmark.c \
|
||||
dsl_crypt.c \
|
||||
dsl_dataset.c \
|
||||
dsl_deadlist.c \
|
||||
dsl_deleg.c \
|
||||
dsl_destroy.c \
|
||||
dsl_dir.c \
|
||||
dsl_crypt.c \
|
||||
dsl_pool.c \
|
||||
dsl_prop.c \
|
||||
dsl_scan.c \
|
||||
dsl_synctask.c \
|
||||
dsl_destroy.c \
|
||||
dsl_userhold.c \
|
||||
edonr_zfs.c \
|
||||
hkdf.c \
|
||||
fm.c \
|
||||
gzip.c \
|
||||
lzjb.c \
|
||||
hkdf.c \
|
||||
lz4.c \
|
||||
lzjb.c \
|
||||
metaslab.c \
|
||||
mmp.c \
|
||||
multilist.c \
|
||||
@ -117,8 +117,8 @@ KERNEL_C = \
|
||||
spa_stats.c \
|
||||
space_map.c \
|
||||
space_reftree.c \
|
||||
txg.c \
|
||||
trace.c \
|
||||
txg.c \
|
||||
uberblock.c \
|
||||
unique.c \
|
||||
vdev.c \
|
||||
@ -126,8 +126,8 @@ KERNEL_C = \
|
||||
vdev_draid.c \
|
||||
vdev_draid_rand.c \
|
||||
vdev_file.c \
|
||||
vdev_indirect_births.c \
|
||||
vdev_indirect.c \
|
||||
vdev_indirect_births.c \
|
||||
vdev_indirect_mapping.c \
|
||||
vdev_initialize.c \
|
||||
vdev_label.c \
|
||||
@ -135,16 +135,16 @@ KERNEL_C = \
|
||||
vdev_missing.c \
|
||||
vdev_queue.c \
|
||||
vdev_raidz.c \
|
||||
vdev_raidz_math.c \
|
||||
vdev_raidz_math_aarch64_neon.c \
|
||||
vdev_raidz_math_aarch64_neonx2.c \
|
||||
vdev_raidz_math_avx2.c \
|
||||
vdev_raidz_math_avx512bw.c \
|
||||
vdev_raidz_math_avx512f.c \
|
||||
vdev_raidz_math.c \
|
||||
vdev_raidz_math_powerpc_altivec.c \
|
||||
vdev_raidz_math_scalar.c \
|
||||
vdev_raidz_math_sse2.c \
|
||||
vdev_raidz_math_ssse3.c \
|
||||
vdev_raidz_math_powerpc_altivec.c \
|
||||
vdev_rebuild.c \
|
||||
vdev_removal.c \
|
||||
vdev_root.c \
|
||||
@ -165,9 +165,9 @@ KERNEL_C = \
|
||||
zfs_fuid.c \
|
||||
zfs_racct.c \
|
||||
zfs_sa.c \
|
||||
zfs_znode.c \
|
||||
zfs_ratelimit.c \
|
||||
zfs_rlock.c \
|
||||
zfs_znode.c \
|
||||
zil.c \
|
||||
zio.c \
|
||||
zio_checksum.c \
|
||||
|
@ -749,7 +749,7 @@ get_configs(libpc_handle_t *hdl, pool_list_t *pl, boolean_t active_ok,
|
||||
nvlist_add_uint64(nvroot, ZPOOL_CONFIG_ID, 0ULL) != 0 ||
|
||||
nvlist_add_uint64(nvroot, ZPOOL_CONFIG_GUID, guid) != 0 ||
|
||||
nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
|
||||
child, children) != 0) {
|
||||
(const nvlist_t **)child, children) != 0) {
|
||||
nvlist_free(nvroot);
|
||||
goto nomem;
|
||||
}
|
||||
@ -1888,6 +1888,15 @@ for_each_vdev_cb(void *zhp, nvlist_t *nv, pool_vdev_iter_f func,
|
||||
ZPOOL_CONFIG_CHILDREN
|
||||
};
|
||||
|
||||
if (nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) != 0)
|
||||
return (ret);
|
||||
|
||||
/* Don't run our function on root or indirect vdevs */
|
||||
if ((strcmp(type, VDEV_TYPE_ROOT) != 0) &&
|
||||
(strcmp(type, VDEV_TYPE_INDIRECT) != 0)) {
|
||||
ret |= func(zhp, nv, data);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(list); i++) {
|
||||
if (nvlist_lookup_nvlist_array(nv, list[i], &child,
|
||||
&children) == 0) {
|
||||
@ -1906,14 +1915,6 @@ for_each_vdev_cb(void *zhp, nvlist_t *nv, pool_vdev_iter_f func,
|
||||
}
|
||||
}
|
||||
|
||||
if (nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) != 0)
|
||||
return (ret);
|
||||
|
||||
/* Don't run our function on root vdevs */
|
||||
if (strcmp(type, VDEV_TYPE_ROOT) != 0) {
|
||||
ret |= func(zhp, nv, data);
|
||||
}
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
@ -1591,12 +1591,12 @@ Allow no-operation writes.
|
||||
The occurrence of nopwrites will further depend on other pool properties
|
||||
.Pq i.a. the checksumming and compression algorithms .
|
||||
.
|
||||
.It Sy zfs_dmu_offset_next_sync Ns = Ns Sy 0 Ns | Ns 1 Pq int
|
||||
.It Sy zfs_dmu_offset_next_sync Ns = Ns Sy 1 Ns | Ns 0 Pq int
|
||||
Enable forcing TXG sync to find holes.
|
||||
When enabled forces ZFS to act like prior versions when
|
||||
When enabled forces ZFS to sync data when
|
||||
.Sy SEEK_HOLE No or Sy SEEK_DATA
|
||||
flags are used, which, when a dnode is dirty,
|
||||
causes TXGs to be synced so that this data can be found.
|
||||
flags are used allowing holes in a file to be accurately reported.
|
||||
When disabled holes will not be reported in recently dirtied files.
|
||||
.
|
||||
.It Sy zfs_pd_bytes_max Ns = Ns Sy 52428800 Ns B Po 50MB Pc Pq int
|
||||
The number of bytes which should be prefetched during a pool traversal, like
|
||||
@ -1729,7 +1729,7 @@ A higher number indicates that we care more about how filled in a segment is,
|
||||
while a lower number indicates we care more about the size of the extent without
|
||||
considering the gaps within a segment.
|
||||
This value is only tunable upon module insertion.
|
||||
Changing the value afterwards will have no affect on scrub or resilver performance.
|
||||
Changing the value afterwards will have no effect on scrub or resilver performance.
|
||||
.
|
||||
.It Sy zfs_scan_issue_strategy Ns = Ns Sy 0 Pq int
|
||||
Determines the order that data will be verified while scrubbing or resilvering:
|
||||
|
172
sys/contrib/openzfs/man/man7/vdevprops.7
Normal file
172
sys/contrib/openzfs/man/man7/vdevprops.7
Normal file
@ -0,0 +1,172 @@
|
||||
.\"
|
||||
.\" CDDL HEADER START
|
||||
.\"
|
||||
.\" The contents of this file are subject to the terms of the
|
||||
.\" Common Development and Distribution License (the "License").
|
||||
.\" You may not use this file except in compliance with the License.
|
||||
.\"
|
||||
.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
.\" or http://www.opensolaris.org/os/licensing.
|
||||
.\" See the License for the specific language governing permissions
|
||||
.\" and limitations under the License.
|
||||
.\"
|
||||
.\" When distributing Covered Code, include this CDDL HEADER in each
|
||||
.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
.\" If applicable, add the following below this CDDL HEADER, with the
|
||||
.\" fields enclosed by brackets "[]" replaced with your own identifying
|
||||
.\" information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
.\"
|
||||
.\" CDDL HEADER END
|
||||
.\"
|
||||
.\" Copyright (c) 2021 Klara, Inc.
|
||||
.\"
|
||||
.Dd November 27, 2021
|
||||
.Dt VDEVPROPS 7
|
||||
.Os
|
||||
.
|
||||
.Sh NAME
|
||||
.Nm vdevprops
|
||||
.Nd native and user-defined properties of ZFS vdevs
|
||||
.
|
||||
.Sh DESCRIPTION
|
||||
Properties are divided into two types, native properties and user-defined
|
||||
.Pq or Qq user
|
||||
properties.
|
||||
Native properties either export internal statistics or control ZFS behavior.
|
||||
In addition, native properties are either editable or read-only.
|
||||
User properties have no effect on ZFS behavior, but you can use them to annotate
|
||||
vdevs in a way that is meaningful in your environment.
|
||||
For more information about user properties, see the
|
||||
.Sx User Properties
|
||||
section, below.
|
||||
.
|
||||
.Ss Native Properties
|
||||
Every vdev has a set of properties that export statistics about the vdev
|
||||
as well as control various behaviors.
|
||||
Properties are NOT inherited from top-level vdevs.
|
||||
.Pp
|
||||
The values of numeric properties can be specified using human-readable suffixes
|
||||
.Po for example,
|
||||
.Sy k , KB , M , Gb ,
|
||||
and so forth, up to
|
||||
.Sy Z
|
||||
for zettabyte
|
||||
.Pc .
|
||||
The following are all valid
|
||||
.Pq and equal
|
||||
specifications:
|
||||
.Li 1536M , 1.5g , 1.50GB .
|
||||
.Pp
|
||||
The values of non-numeric properties are case sensitive and must be lowercase.
|
||||
.Pp
|
||||
The following native properties consist of read-only statistics about the
|
||||
vdev.
|
||||
These properties can not be changed.
|
||||
.Bl -tag -width "fragmentation"
|
||||
.It Sy capacity
|
||||
Percentage of vdev space used
|
||||
.It Sy state
|
||||
state of this vdev such as online, faulted, or offline
|
||||
.It Sy guid
|
||||
globaly unique id of this vdev
|
||||
.It Sy asize
|
||||
The allocable size of this vdev
|
||||
.It Sy psize
|
||||
The physical size of this vdev
|
||||
.It Sy ashift
|
||||
The physical sector size of this vdev expressed as the power of two
|
||||
.It Sy size
|
||||
The total size of this vdev
|
||||
.It Sy free
|
||||
The amount of remaining free space on this vdev
|
||||
.It Sy allocated
|
||||
The amount of allocated space on this vdev
|
||||
.It Sy expandsize
|
||||
How much this vdev can expand by
|
||||
.It Sy fragmentation
|
||||
Percent of fragmentation in this vdev
|
||||
.It Sy parity
|
||||
The level of parity for this vdev
|
||||
.It Sy devid
|
||||
The device id for this vdev
|
||||
.It Sy physpath
|
||||
The physical path to the device
|
||||
.It Sy encpath
|
||||
The enclosure path to the device
|
||||
.It Sy fru
|
||||
Field Replacable Unit, usually a model number
|
||||
.It Sy parent
|
||||
Parent of this vdev
|
||||
.It Sy children
|
||||
Comma separated list of children of this vdev
|
||||
.It Sy numchildren
|
||||
The number of children belonging to this vdev
|
||||
.It Sy read_errors , write_errors , checksum_errors , initialize_errors
|
||||
The number of errors of each type encountered by this vdev
|
||||
.It Sy null_ops , read_ops , write_ops , free_ops , claim_ops , trim_ops
|
||||
The number of I/O operations of each type performed by this vdev
|
||||
.It Xo
|
||||
.Sy null_bytes , read_bytes , write_bytes , free_bytes , claim_bytes ,
|
||||
.Sy trim_bytes
|
||||
.Xc
|
||||
The cumulative size of all operations of each type performed by this vdev
|
||||
.It Sy removing
|
||||
If this device is currently being removed from the pool
|
||||
.El
|
||||
.Pp
|
||||
The following native properties can be used to change the behavior of a ZFS
|
||||
dataset.
|
||||
.Bl -tag -width "allocating"
|
||||
.It Sy comment
|
||||
A text comment up to 8192 characters long
|
||||
.It Sy bootsize
|
||||
The amount of space to reserve for the EFI system partition
|
||||
.It Sy path
|
||||
The path to the device for this vdev
|
||||
.It Sy allocating
|
||||
If this device should perform new allocations, used to disable a device
|
||||
when it is scheduled for later removal.
|
||||
See
|
||||
.Xr zpool-remove 8 .
|
||||
.El
|
||||
.Ss User Properties
|
||||
In addition to the standard native properties, ZFS supports arbitrary user
|
||||
properties.
|
||||
User properties have no effect on ZFS behavior, but applications or
|
||||
administrators can use them to annotate vdevs.
|
||||
.Pp
|
||||
User property names must contain a colon
|
||||
.Pq Qq Sy \&:
|
||||
character to distinguish them from native properties.
|
||||
They may contain lowercase letters, numbers, and the following punctuation
|
||||
characters: colon
|
||||
.Pq Qq Sy \&: ,
|
||||
dash
|
||||
.Pq Qq Sy - ,
|
||||
period
|
||||
.Pq Qq Sy \&. ,
|
||||
and underscore
|
||||
.Pq Qq Sy _ .
|
||||
The expected convention is that the property name is divided into two portions
|
||||
such as
|
||||
.Ar module : Ns Ar property ,
|
||||
but this namespace is not enforced by ZFS.
|
||||
User property names can be at most 256 characters, and cannot begin with a dash
|
||||
.Pq Qq Sy - .
|
||||
.Pp
|
||||
When making programmatic use of user properties, it is strongly suggested to use
|
||||
a reversed DNS domain name for the
|
||||
.Ar module
|
||||
component of property names to reduce the chance that two
|
||||
independently-developed packages use the same property name for different
|
||||
purposes.
|
||||
.Pp
|
||||
The values of user properties are arbitrary strings and
|
||||
are never validated.
|
||||
Use the
|
||||
.Nm zpool Cm set
|
||||
command with a blank value to clear a user property.
|
||||
Property values are limited to 8192 bytes.
|
||||
.Sh SEE ALSO
|
||||
.Xr zpoolprops 7 ,
|
||||
.Xr zpool-set 8
|
@ -266,12 +266,10 @@ the percentage of free space in each space map.
|
||||
.It Fl mmmm
|
||||
Display every spacemap record.
|
||||
.It Fl M
|
||||
Display the offset, spacemap, and free space of each metaslab.
|
||||
Display all "normal" vdev metaslab group information - per-vdev metaslab count, fragmentation,
|
||||
and free space histogram, as well as overall pool fragmentation and histogram.
|
||||
.It Fl MM
|
||||
Also display information about the maximum contiguous free space and the
|
||||
percentage of free space in each space map.
|
||||
.It Fl MMM
|
||||
Display every spacemap record.
|
||||
"Special" vdevs are added to -M's normal output.
|
||||
.It Fl O Ar dataset path
|
||||
Look up the specified
|
||||
.Ar path
|
||||
|
@ -39,7 +39,7 @@
|
||||
.Sh SYNOPSIS
|
||||
.Nm zfs
|
||||
.Cm diff
|
||||
.Op Fl FHt
|
||||
.Op Fl FHth
|
||||
.Ar snapshot Ar snapshot Ns | Ns Ar filesystem
|
||||
.
|
||||
.Sh DESCRIPTION
|
||||
@ -92,6 +92,10 @@ Give more parsable tab-separated output, without header lines and without
|
||||
arrows.
|
||||
.It Fl t
|
||||
Display the path's inode change time as the first column of output.
|
||||
.It Fl h
|
||||
Do not
|
||||
.Sy \e0 Ns Ar ooo Ns -escape
|
||||
non-ASCII paths.
|
||||
.El
|
||||
.
|
||||
.Sh SEE ALSO
|
||||
|
@ -142,22 +142,11 @@ ZEDLET, if enabled
|
||||
.Pq see Xr zed 8 .
|
||||
.
|
||||
.Sh ENVIRONMENT
|
||||
The
|
||||
If the
|
||||
.Sy ZFS_DEBUG
|
||||
environment variable can either be
|
||||
.Sy 0
|
||||
(default),
|
||||
.Sy 1
|
||||
(print summary accounting information at the end), or at least
|
||||
.Sy 2
|
||||
(print accounting information for each subprocess as it finishes).
|
||||
.
|
||||
If not present,
|
||||
.Pa /proc/cmdline
|
||||
is additionally checked for
|
||||
.Qq debug ,
|
||||
in which case the debug level is set to
|
||||
.Sy 2 .
|
||||
environment variable is nonzero
|
||||
.Pq or unset and Pa /proc/cmdline No contains Qq Sy debug ,
|
||||
print summary accounting information at the end.
|
||||
.
|
||||
.Sh EXAMPLES
|
||||
To begin, enable tracking for the pool:
|
||||
|
@ -280,7 +280,7 @@ If the send stream was sent with
|
||||
.Fl c
|
||||
then overriding the
|
||||
.Sy compression
|
||||
property will have no affect on received data but the
|
||||
property will have no effect on received data but the
|
||||
.Sy compression
|
||||
property will be set.
|
||||
To have the data recompressed on receive remove the
|
||||
|
@ -40,11 +40,27 @@
|
||||
.Op Fl o Ar field Ns Oo , Ns Ar field Oc Ns …
|
||||
.Sy all Ns | Ns Ar property Ns Oo , Ns Ar property Oc Ns …
|
||||
.Oo Ar pool Oc Ns …
|
||||
.
|
||||
.Nm zpool
|
||||
.Cm get
|
||||
.Op Fl Hp
|
||||
.Op Fl o Ar field Ns Oo , Ns Ar field Oc Ns …
|
||||
.Sy all Ns | Ns Ar property Ns Oo , Ns Ar property Oc Ns …
|
||||
.Ar pool
|
||||
.Oo Sy all-vdevs Ns | Ns
|
||||
.Ar vdev Oc Ns …
|
||||
.
|
||||
.Nm zpool
|
||||
.Cm set
|
||||
.Ar property Ns = Ns Ar value
|
||||
.Ar pool
|
||||
.
|
||||
.Nm zpool
|
||||
.Cm set
|
||||
.Ar property Ns = Ns Ar value
|
||||
.Ar pool
|
||||
.Ar vdev
|
||||
.
|
||||
.Sh DESCRIPTION
|
||||
.Bl -tag -width Ds
|
||||
.It Xo
|
||||
@ -91,6 +107,56 @@ Display numbers in parsable (exact) values.
|
||||
.El
|
||||
.It Xo
|
||||
.Nm zpool
|
||||
.Cm get
|
||||
.Op Fl Hp
|
||||
.Op Fl o Ar field Ns Oo , Ns Ar field Oc Ns …
|
||||
.Sy all Ns | Ns Ar property Ns Oo , Ns Ar property Oc Ns …
|
||||
.Ar pool
|
||||
.Oo Sy all-vdevs Ns | Ns
|
||||
.Ar vdev Oc Ns …
|
||||
.Xc
|
||||
Retrieves the given list of properties
|
||||
.Po
|
||||
or all properties if
|
||||
.Sy all
|
||||
is used
|
||||
.Pc
|
||||
for the specified vdevs
|
||||
.Po
|
||||
or all vdevs if
|
||||
.Sy all-vdevs
|
||||
is used
|
||||
.Pc
|
||||
in the specified pool.
|
||||
These properties are displayed with the following fields:
|
||||
.Bl -tag -compact -offset Ds -width "property"
|
||||
.It Sy name
|
||||
Name of vdev.
|
||||
.It Sy property
|
||||
Property name.
|
||||
.It Sy value
|
||||
Property value.
|
||||
.It Sy source
|
||||
Property source, either
|
||||
.Sy default No or Sy local .
|
||||
.El
|
||||
.Pp
|
||||
See the
|
||||
.Xr vdevprops 7
|
||||
manual page for more information on the available pool properties.
|
||||
.Bl -tag -compact -offset Ds -width "-o field"
|
||||
.It Fl H
|
||||
Scripted mode.
|
||||
Do not display headers, and separate fields by a single tab instead of arbitrary
|
||||
space.
|
||||
.It Fl o Ar field
|
||||
A comma-separated list of columns to display, defaults to
|
||||
.Sy name , Ns Sy property , Ns Sy value , Ns Sy source .
|
||||
.It Fl p
|
||||
Display numbers in parsable (exact) values.
|
||||
.El
|
||||
.It Xo
|
||||
.Nm zpool
|
||||
.Cm set
|
||||
.Ar property Ns = Ns Ar value
|
||||
.Ar pool
|
||||
@ -100,9 +166,22 @@ See the
|
||||
.Xr zpoolprops 7
|
||||
manual page for more information on what properties can be set and acceptable
|
||||
values.
|
||||
.It Xo
|
||||
.Nm zpool
|
||||
.Cm set
|
||||
.Ar property Ns = Ns Ar value
|
||||
.Ar pool
|
||||
.Ar vdev
|
||||
.Xc
|
||||
Sets the given property on the specified vdev in the specified pool.
|
||||
See the
|
||||
.Xr vdevprops 7
|
||||
manual page for more information on what properties can be set and acceptable
|
||||
values.
|
||||
.El
|
||||
.
|
||||
.Sh SEE ALSO
|
||||
.Xr vdevprops 7 ,
|
||||
.Xr zpool-features 7 ,
|
||||
.Xr zpoolprops 7 ,
|
||||
.Xr zpool-list 8
|
||||
|
@ -40,7 +40,7 @@
|
||||
.Cm version
|
||||
.Nm
|
||||
.Cm subcommand
|
||||
.Op Ar argumentss
|
||||
.Op Ar arguments
|
||||
.
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
|
@ -268,12 +268,12 @@ SRCS+= abd.c \
|
||||
vdev_raidz.c \
|
||||
vdev_raidz_math.c \
|
||||
vdev_raidz_math_scalar.c \
|
||||
vdev_rebuild.c \
|
||||
vdev_raidz_math_avx2.c \
|
||||
vdev_raidz_math_avx512bw.c \
|
||||
vdev_raidz_math_avx512f.c \
|
||||
vdev_raidz_math_sse2.c \
|
||||
vdev_raidz_math_ssse3.c \
|
||||
vdev_rebuild.c \
|
||||
vdev_removal.c \
|
||||
vdev_root.c \
|
||||
vdev_trim.c \
|
||||
|
@ -102,7 +102,7 @@ fnvlist_unpack(char *buf, size_t buflen)
|
||||
}
|
||||
|
||||
nvlist_t *
|
||||
fnvlist_dup(nvlist_t *nvl)
|
||||
fnvlist_dup(const nvlist_t *nvl)
|
||||
{
|
||||
nvlist_t *rv;
|
||||
VERIFY0(nvlist_dup(nvl, &rv, KM_SLEEP));
|
||||
@ -213,78 +213,84 @@ fnvlist_add_nvpair(nvlist_t *nvl, nvpair_t *pair)
|
||||
|
||||
void
|
||||
fnvlist_add_boolean_array(nvlist_t *nvl, const char *name,
|
||||
boolean_t *val, uint_t n)
|
||||
const boolean_t *val, uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_boolean_array(nvl, name, val, n));
|
||||
}
|
||||
|
||||
void
|
||||
fnvlist_add_byte_array(nvlist_t *nvl, const char *name, uchar_t *val, uint_t n)
|
||||
fnvlist_add_byte_array(nvlist_t *nvl, const char *name, const uchar_t *val,
|
||||
uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_byte_array(nvl, name, val, n));
|
||||
}
|
||||
|
||||
void
|
||||
fnvlist_add_int8_array(nvlist_t *nvl, const char *name, int8_t *val, uint_t n)
|
||||
fnvlist_add_int8_array(nvlist_t *nvl, const char *name, const int8_t *val,
|
||||
uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_int8_array(nvl, name, val, n));
|
||||
}
|
||||
|
||||
void
|
||||
fnvlist_add_uint8_array(nvlist_t *nvl, const char *name, uint8_t *val, uint_t n)
|
||||
fnvlist_add_uint8_array(nvlist_t *nvl, const char *name, const uint8_t *val,
|
||||
uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_uint8_array(nvl, name, val, n));
|
||||
}
|
||||
|
||||
void
|
||||
fnvlist_add_int16_array(nvlist_t *nvl, const char *name, int16_t *val, uint_t n)
|
||||
fnvlist_add_int16_array(nvlist_t *nvl, const char *name, const int16_t *val,
|
||||
uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_int16_array(nvl, name, val, n));
|
||||
}
|
||||
|
||||
void
|
||||
fnvlist_add_uint16_array(nvlist_t *nvl, const char *name,
|
||||
uint16_t *val, uint_t n)
|
||||
const uint16_t *val, uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_uint16_array(nvl, name, val, n));
|
||||
}
|
||||
|
||||
void
|
||||
fnvlist_add_int32_array(nvlist_t *nvl, const char *name, int32_t *val, uint_t n)
|
||||
fnvlist_add_int32_array(nvlist_t *nvl, const char *name, const int32_t *val,
|
||||
uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_int32_array(nvl, name, val, n));
|
||||
}
|
||||
|
||||
void
|
||||
fnvlist_add_uint32_array(nvlist_t *nvl, const char *name,
|
||||
uint32_t *val, uint_t n)
|
||||
const uint32_t *val, uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_uint32_array(nvl, name, val, n));
|
||||
}
|
||||
|
||||
void
|
||||
fnvlist_add_int64_array(nvlist_t *nvl, const char *name, int64_t *val, uint_t n)
|
||||
fnvlist_add_int64_array(nvlist_t *nvl, const char *name, const int64_t *val,
|
||||
uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_int64_array(nvl, name, val, n));
|
||||
}
|
||||
|
||||
void
|
||||
fnvlist_add_uint64_array(nvlist_t *nvl, const char *name,
|
||||
uint64_t *val, uint_t n)
|
||||
const uint64_t *val, uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_uint64_array(nvl, name, val, n));
|
||||
}
|
||||
|
||||
void
|
||||
fnvlist_add_string_array(nvlist_t *nvl, const char *name,
|
||||
char * const *val, uint_t n)
|
||||
const char * const *val, uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_string_array(nvl, name, val, n));
|
||||
}
|
||||
|
||||
void
|
||||
fnvlist_add_nvlist_array(nvlist_t *nvl, const char *name,
|
||||
nvlist_t **val, uint_t n)
|
||||
const nvlist_t * const *val, uint_t n)
|
||||
{
|
||||
VERIFY0(nvlist_add_nvlist_array(nvl, name, val, n));
|
||||
}
|
||||
@ -311,13 +317,13 @@ fnvlist_lookup_nvpair(nvlist_t *nvl, const char *name)
|
||||
|
||||
/* returns B_TRUE if the entry exists */
|
||||
boolean_t
|
||||
fnvlist_lookup_boolean(nvlist_t *nvl, const char *name)
|
||||
fnvlist_lookup_boolean(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
return (nvlist_lookup_boolean(nvl, name) == 0);
|
||||
}
|
||||
|
||||
boolean_t
|
||||
fnvlist_lookup_boolean_value(nvlist_t *nvl, const char *name)
|
||||
fnvlist_lookup_boolean_value(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
boolean_t rv;
|
||||
VERIFY0(nvlist_lookup_boolean_value(nvl, name, &rv));
|
||||
@ -325,7 +331,7 @@ fnvlist_lookup_boolean_value(nvlist_t *nvl, const char *name)
|
||||
}
|
||||
|
||||
uchar_t
|
||||
fnvlist_lookup_byte(nvlist_t *nvl, const char *name)
|
||||
fnvlist_lookup_byte(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
uchar_t rv;
|
||||
VERIFY0(nvlist_lookup_byte(nvl, name, &rv));
|
||||
@ -333,7 +339,7 @@ fnvlist_lookup_byte(nvlist_t *nvl, const char *name)
|
||||
}
|
||||
|
||||
int8_t
|
||||
fnvlist_lookup_int8(nvlist_t *nvl, const char *name)
|
||||
fnvlist_lookup_int8(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
int8_t rv;
|
||||
VERIFY0(nvlist_lookup_int8(nvl, name, &rv));
|
||||
@ -341,7 +347,7 @@ fnvlist_lookup_int8(nvlist_t *nvl, const char *name)
|
||||
}
|
||||
|
||||
int16_t
|
||||
fnvlist_lookup_int16(nvlist_t *nvl, const char *name)
|
||||
fnvlist_lookup_int16(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
int16_t rv;
|
||||
VERIFY0(nvlist_lookup_int16(nvl, name, &rv));
|
||||
@ -349,7 +355,7 @@ fnvlist_lookup_int16(nvlist_t *nvl, const char *name)
|
||||
}
|
||||
|
||||
int32_t
|
||||
fnvlist_lookup_int32(nvlist_t *nvl, const char *name)
|
||||
fnvlist_lookup_int32(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
int32_t rv;
|
||||
VERIFY0(nvlist_lookup_int32(nvl, name, &rv));
|
||||
@ -357,7 +363,7 @@ fnvlist_lookup_int32(nvlist_t *nvl, const char *name)
|
||||
}
|
||||
|
||||
int64_t
|
||||
fnvlist_lookup_int64(nvlist_t *nvl, const char *name)
|
||||
fnvlist_lookup_int64(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
int64_t rv;
|
||||
VERIFY0(nvlist_lookup_int64(nvl, name, &rv));
|
||||
@ -365,7 +371,7 @@ fnvlist_lookup_int64(nvlist_t *nvl, const char *name)
|
||||
}
|
||||
|
||||
uint8_t
|
||||
fnvlist_lookup_uint8(nvlist_t *nvl, const char *name)
|
||||
fnvlist_lookup_uint8(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
uint8_t rv;
|
||||
VERIFY0(nvlist_lookup_uint8(nvl, name, &rv));
|
||||
@ -373,7 +379,7 @@ fnvlist_lookup_uint8(nvlist_t *nvl, const char *name)
|
||||
}
|
||||
|
||||
uint16_t
|
||||
fnvlist_lookup_uint16(nvlist_t *nvl, const char *name)
|
||||
fnvlist_lookup_uint16(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
uint16_t rv;
|
||||
VERIFY0(nvlist_lookup_uint16(nvl, name, &rv));
|
||||
@ -381,7 +387,7 @@ fnvlist_lookup_uint16(nvlist_t *nvl, const char *name)
|
||||
}
|
||||
|
||||
uint32_t
|
||||
fnvlist_lookup_uint32(nvlist_t *nvl, const char *name)
|
||||
fnvlist_lookup_uint32(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
uint32_t rv;
|
||||
VERIFY0(nvlist_lookup_uint32(nvl, name, &rv));
|
||||
@ -389,7 +395,7 @@ fnvlist_lookup_uint32(nvlist_t *nvl, const char *name)
|
||||
}
|
||||
|
||||
uint64_t
|
||||
fnvlist_lookup_uint64(nvlist_t *nvl, const char *name)
|
||||
fnvlist_lookup_uint64(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
uint64_t rv;
|
||||
VERIFY0(nvlist_lookup_uint64(nvl, name, &rv));
|
||||
@ -492,7 +498,7 @@ fnvlist_lookup_uint64_array(nvlist_t *nvl, const char *name, uint_t *n)
|
||||
}
|
||||
|
||||
boolean_t
|
||||
fnvpair_value_boolean_value(nvpair_t *nvp)
|
||||
fnvpair_value_boolean_value(const nvpair_t *nvp)
|
||||
{
|
||||
boolean_t rv;
|
||||
VERIFY0(nvpair_value_boolean_value(nvp, &rv));
|
||||
@ -500,7 +506,7 @@ fnvpair_value_boolean_value(nvpair_t *nvp)
|
||||
}
|
||||
|
||||
uchar_t
|
||||
fnvpair_value_byte(nvpair_t *nvp)
|
||||
fnvpair_value_byte(const nvpair_t *nvp)
|
||||
{
|
||||
uchar_t rv;
|
||||
VERIFY0(nvpair_value_byte(nvp, &rv));
|
||||
@ -508,7 +514,7 @@ fnvpair_value_byte(nvpair_t *nvp)
|
||||
}
|
||||
|
||||
int8_t
|
||||
fnvpair_value_int8(nvpair_t *nvp)
|
||||
fnvpair_value_int8(const nvpair_t *nvp)
|
||||
{
|
||||
int8_t rv;
|
||||
VERIFY0(nvpair_value_int8(nvp, &rv));
|
||||
@ -516,7 +522,7 @@ fnvpair_value_int8(nvpair_t *nvp)
|
||||
}
|
||||
|
||||
int16_t
|
||||
fnvpair_value_int16(nvpair_t *nvp)
|
||||
fnvpair_value_int16(const nvpair_t *nvp)
|
||||
{
|
||||
int16_t rv;
|
||||
VERIFY0(nvpair_value_int16(nvp, &rv));
|
||||
@ -524,7 +530,7 @@ fnvpair_value_int16(nvpair_t *nvp)
|
||||
}
|
||||
|
||||
int32_t
|
||||
fnvpair_value_int32(nvpair_t *nvp)
|
||||
fnvpair_value_int32(const nvpair_t *nvp)
|
||||
{
|
||||
int32_t rv;
|
||||
VERIFY0(nvpair_value_int32(nvp, &rv));
|
||||
@ -532,7 +538,7 @@ fnvpair_value_int32(nvpair_t *nvp)
|
||||
}
|
||||
|
||||
int64_t
|
||||
fnvpair_value_int64(nvpair_t *nvp)
|
||||
fnvpair_value_int64(const nvpair_t *nvp)
|
||||
{
|
||||
int64_t rv;
|
||||
VERIFY0(nvpair_value_int64(nvp, &rv));
|
||||
@ -540,7 +546,7 @@ fnvpair_value_int64(nvpair_t *nvp)
|
||||
}
|
||||
|
||||
uint8_t
|
||||
fnvpair_value_uint8(nvpair_t *nvp)
|
||||
fnvpair_value_uint8(const nvpair_t *nvp)
|
||||
{
|
||||
uint8_t rv;
|
||||
VERIFY0(nvpair_value_uint8(nvp, &rv));
|
||||
@ -548,7 +554,7 @@ fnvpair_value_uint8(nvpair_t *nvp)
|
||||
}
|
||||
|
||||
uint16_t
|
||||
fnvpair_value_uint16(nvpair_t *nvp)
|
||||
fnvpair_value_uint16(const nvpair_t *nvp)
|
||||
{
|
||||
uint16_t rv;
|
||||
VERIFY0(nvpair_value_uint16(nvp, &rv));
|
||||
@ -556,7 +562,7 @@ fnvpair_value_uint16(nvpair_t *nvp)
|
||||
}
|
||||
|
||||
uint32_t
|
||||
fnvpair_value_uint32(nvpair_t *nvp)
|
||||
fnvpair_value_uint32(const nvpair_t *nvp)
|
||||
{
|
||||
uint32_t rv;
|
||||
VERIFY0(nvpair_value_uint32(nvp, &rv));
|
||||
@ -564,7 +570,7 @@ fnvpair_value_uint32(nvpair_t *nvp)
|
||||
}
|
||||
|
||||
uint64_t
|
||||
fnvpair_value_uint64(nvpair_t *nvp)
|
||||
fnvpair_value_uint64(const nvpair_t *nvp)
|
||||
{
|
||||
uint64_t rv;
|
||||
VERIFY0(nvpair_value_uint64(nvp, &rv));
|
||||
|
@ -308,7 +308,7 @@ nvt_hash(const char *p)
|
||||
}
|
||||
|
||||
static boolean_t
|
||||
nvt_nvpair_match(nvpair_t *nvp1, nvpair_t *nvp2, uint32_t nvflag)
|
||||
nvt_nvpair_match(const nvpair_t *nvp1, const nvpair_t *nvp2, uint32_t nvflag)
|
||||
{
|
||||
boolean_t match = B_FALSE;
|
||||
if (nvflag & NV_UNIQUE_NAME_TYPE) {
|
||||
@ -324,9 +324,9 @@ nvt_nvpair_match(nvpair_t *nvp1, nvpair_t *nvp2, uint32_t nvflag)
|
||||
}
|
||||
|
||||
static nvpair_t *
|
||||
nvt_lookup_name_type(nvlist_t *nvl, const char *name, data_type_t type)
|
||||
nvt_lookup_name_type(const nvlist_t *nvl, const char *name, data_type_t type)
|
||||
{
|
||||
nvpriv_t *priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv;
|
||||
const nvpriv_t *priv = (const nvpriv_t *)(uintptr_t)nvl->nvl_priv;
|
||||
ASSERT(priv != NULL);
|
||||
|
||||
i_nvp_t **tab = priv->nvp_hashtable;
|
||||
@ -356,7 +356,7 @@ nvt_lookup_name_type(nvlist_t *nvl, const char *name, data_type_t type)
|
||||
}
|
||||
|
||||
static nvpair_t *
|
||||
nvt_lookup_name(nvlist_t *nvl, const char *name)
|
||||
nvt_lookup_name(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
return (nvt_lookup_name_type(nvl, name, DATA_TYPE_DONTCARE));
|
||||
}
|
||||
@ -462,7 +462,7 @@ nvt_shrink(nvpriv_t *priv)
|
||||
}
|
||||
|
||||
static int
|
||||
nvt_remove_nvpair(nvlist_t *nvl, nvpair_t *nvp)
|
||||
nvt_remove_nvpair(nvlist_t *nvl, const nvpair_t *nvp)
|
||||
{
|
||||
nvpriv_t *priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv;
|
||||
|
||||
@ -816,16 +816,16 @@ i_validate_nvpair(nvpair_t *nvp)
|
||||
}
|
||||
|
||||
static int
|
||||
nvlist_copy_pairs(nvlist_t *snvl, nvlist_t *dnvl)
|
||||
nvlist_copy_pairs(const nvlist_t *snvl, nvlist_t *dnvl)
|
||||
{
|
||||
nvpriv_t *priv;
|
||||
i_nvp_t *curr;
|
||||
const nvpriv_t *priv;
|
||||
const i_nvp_t *curr;
|
||||
|
||||
if ((priv = (nvpriv_t *)(uintptr_t)snvl->nvl_priv) == NULL)
|
||||
if ((priv = (const nvpriv_t *)(uintptr_t)snvl->nvl_priv) == NULL)
|
||||
return (EINVAL);
|
||||
|
||||
for (curr = priv->nvp_list; curr != NULL; curr = curr->nvi_next) {
|
||||
nvpair_t *nvp = &curr->nvi_nvp;
|
||||
const nvpair_t *nvp = &curr->nvi_nvp;
|
||||
int err;
|
||||
|
||||
if ((err = nvlist_add_common(dnvl, NVP_NAME(nvp), NVP_TYPE(nvp),
|
||||
@ -896,10 +896,10 @@ nvlist_free(nvlist_t *nvl)
|
||||
}
|
||||
|
||||
static int
|
||||
nvlist_contains_nvp(nvlist_t *nvl, nvpair_t *nvp)
|
||||
nvlist_contains_nvp(const nvlist_t *nvl, const nvpair_t *nvp)
|
||||
{
|
||||
nvpriv_t *priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv;
|
||||
i_nvp_t *curr;
|
||||
const nvpriv_t *priv = (const nvpriv_t *)(uintptr_t)nvl->nvl_priv;
|
||||
const i_nvp_t *curr;
|
||||
|
||||
if (nvp == NULL)
|
||||
return (0);
|
||||
@ -915,13 +915,13 @@ nvlist_contains_nvp(nvlist_t *nvl, nvpair_t *nvp)
|
||||
* Make a copy of nvlist
|
||||
*/
|
||||
int
|
||||
nvlist_dup(nvlist_t *nvl, nvlist_t **nvlp, int kmflag)
|
||||
nvlist_dup(const nvlist_t *nvl, nvlist_t **nvlp, int kmflag)
|
||||
{
|
||||
return (nvlist_xdup(nvl, nvlp, nvlist_nv_alloc(kmflag)));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_xdup(nvlist_t *nvl, nvlist_t **nvlp, nv_alloc_t *nva)
|
||||
nvlist_xdup(const nvlist_t *nvl, nvlist_t **nvlp, nv_alloc_t *nva)
|
||||
{
|
||||
int err;
|
||||
nvlist_t *ret;
|
||||
@ -1356,68 +1356,77 @@ nvlist_add_string(nvlist_t *nvl, const char *name, const char *val)
|
||||
|
||||
int
|
||||
nvlist_add_boolean_array(nvlist_t *nvl, const char *name,
|
||||
boolean_t *a, uint_t n)
|
||||
const boolean_t *a, uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_BOOLEAN_ARRAY, n, a));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_byte_array(nvlist_t *nvl, const char *name, uchar_t *a, uint_t n)
|
||||
nvlist_add_byte_array(nvlist_t *nvl, const char *name, const uchar_t *a,
|
||||
uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_BYTE_ARRAY, n, a));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_int8_array(nvlist_t *nvl, const char *name, int8_t *a, uint_t n)
|
||||
nvlist_add_int8_array(nvlist_t *nvl, const char *name, const int8_t *a,
|
||||
uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_INT8_ARRAY, n, a));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_uint8_array(nvlist_t *nvl, const char *name, uint8_t *a, uint_t n)
|
||||
nvlist_add_uint8_array(nvlist_t *nvl, const char *name, const uint8_t *a,
|
||||
uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_UINT8_ARRAY, n, a));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_int16_array(nvlist_t *nvl, const char *name, int16_t *a, uint_t n)
|
||||
nvlist_add_int16_array(nvlist_t *nvl, const char *name, const int16_t *a,
|
||||
uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_INT16_ARRAY, n, a));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_uint16_array(nvlist_t *nvl, const char *name, uint16_t *a, uint_t n)
|
||||
nvlist_add_uint16_array(nvlist_t *nvl, const char *name, const uint16_t *a,
|
||||
uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_UINT16_ARRAY, n, a));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_int32_array(nvlist_t *nvl, const char *name, int32_t *a, uint_t n)
|
||||
nvlist_add_int32_array(nvlist_t *nvl, const char *name, const int32_t *a,
|
||||
uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_INT32_ARRAY, n, a));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_uint32_array(nvlist_t *nvl, const char *name, uint32_t *a, uint_t n)
|
||||
nvlist_add_uint32_array(nvlist_t *nvl, const char *name, const uint32_t *a,
|
||||
uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_UINT32_ARRAY, n, a));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_int64_array(nvlist_t *nvl, const char *name, int64_t *a, uint_t n)
|
||||
nvlist_add_int64_array(nvlist_t *nvl, const char *name, const int64_t *a,
|
||||
uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_INT64_ARRAY, n, a));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_uint64_array(nvlist_t *nvl, const char *name, uint64_t *a, uint_t n)
|
||||
nvlist_add_uint64_array(nvlist_t *nvl, const char *name, const uint64_t *a,
|
||||
uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_UINT64_ARRAY, n, a));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_string_array(nvlist_t *nvl, const char *name,
|
||||
char *const *a, uint_t n)
|
||||
const char *const *a, uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_STRING_ARRAY, n, a));
|
||||
}
|
||||
@ -1429,20 +1438,21 @@ nvlist_add_hrtime(nvlist_t *nvl, const char *name, hrtime_t val)
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_nvlist(nvlist_t *nvl, const char *name, nvlist_t *val)
|
||||
nvlist_add_nvlist(nvlist_t *nvl, const char *name, const nvlist_t *val)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_NVLIST, 1, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_add_nvlist_array(nvlist_t *nvl, const char *name, nvlist_t **a, uint_t n)
|
||||
nvlist_add_nvlist_array(nvlist_t *nvl, const char *name,
|
||||
const nvlist_t * const *a, uint_t n)
|
||||
{
|
||||
return (nvlist_add_common(nvl, name, DATA_TYPE_NVLIST_ARRAY, n, a));
|
||||
}
|
||||
|
||||
/* reading name-value pairs */
|
||||
nvpair_t *
|
||||
nvlist_next_nvpair(nvlist_t *nvl, nvpair_t *nvp)
|
||||
nvlist_next_nvpair(nvlist_t *nvl, const nvpair_t *nvp)
|
||||
{
|
||||
nvpriv_t *priv;
|
||||
i_nvp_t *curr;
|
||||
@ -1471,7 +1481,7 @@ nvlist_next_nvpair(nvlist_t *nvl, nvpair_t *nvp)
|
||||
}
|
||||
|
||||
nvpair_t *
|
||||
nvlist_prev_nvpair(nvlist_t *nvl, nvpair_t *nvp)
|
||||
nvlist_prev_nvpair(nvlist_t *nvl, const nvpair_t *nvp)
|
||||
{
|
||||
nvpriv_t *priv;
|
||||
i_nvp_t *curr;
|
||||
@ -1495,31 +1505,31 @@ nvlist_prev_nvpair(nvlist_t *nvl, nvpair_t *nvp)
|
||||
}
|
||||
|
||||
boolean_t
|
||||
nvlist_empty(nvlist_t *nvl)
|
||||
nvlist_empty(const nvlist_t *nvl)
|
||||
{
|
||||
nvpriv_t *priv;
|
||||
const nvpriv_t *priv;
|
||||
|
||||
if (nvl == NULL ||
|
||||
(priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv) == NULL)
|
||||
(priv = (const nvpriv_t *)(uintptr_t)nvl->nvl_priv) == NULL)
|
||||
return (B_TRUE);
|
||||
|
||||
return (priv->nvp_list == NULL);
|
||||
}
|
||||
|
||||
char *
|
||||
nvpair_name(nvpair_t *nvp)
|
||||
nvpair_name(const nvpair_t *nvp)
|
||||
{
|
||||
return (NVP_NAME(nvp));
|
||||
}
|
||||
|
||||
data_type_t
|
||||
nvpair_type(nvpair_t *nvp)
|
||||
nvpair_type(const nvpair_t *nvp)
|
||||
{
|
||||
return (NVP_TYPE(nvp));
|
||||
}
|
||||
|
||||
int
|
||||
nvpair_type_is_array(nvpair_t *nvp)
|
||||
nvpair_type_is_array(const nvpair_t *nvp)
|
||||
{
|
||||
data_type_t type = NVP_TYPE(nvp);
|
||||
|
||||
@ -1541,7 +1551,8 @@ nvpair_type_is_array(nvpair_t *nvp)
|
||||
}
|
||||
|
||||
static int
|
||||
nvpair_value_common(nvpair_t *nvp, data_type_t type, uint_t *nelem, void *data)
|
||||
nvpair_value_common(const nvpair_t *nvp, data_type_t type, uint_t *nelem,
|
||||
void *data)
|
||||
{
|
||||
int value_sz;
|
||||
|
||||
@ -1585,6 +1596,10 @@ nvpair_value_common(nvpair_t *nvp, data_type_t type, uint_t *nelem, void *data)
|
||||
case DATA_TYPE_STRING:
|
||||
if (data == NULL)
|
||||
return (EINVAL);
|
||||
/*
|
||||
* This discards the const from nvp, so all callers for these
|
||||
* types must not accept const nvpairs.
|
||||
*/
|
||||
*(void **)data = (void *)NVP_VALUE(nvp);
|
||||
if (nelem != NULL)
|
||||
*nelem = 1;
|
||||
@ -1604,6 +1619,10 @@ nvpair_value_common(nvpair_t *nvp, data_type_t type, uint_t *nelem, void *data)
|
||||
case DATA_TYPE_NVLIST_ARRAY:
|
||||
if (nelem == NULL || data == NULL)
|
||||
return (EINVAL);
|
||||
/*
|
||||
* This discards the const from nvp, so all callers for these
|
||||
* types must not accept const nvpairs.
|
||||
*/
|
||||
if ((*nelem = NVP_NELEM(nvp)) != 0)
|
||||
*(void **)data = (void *)NVP_VALUE(nvp);
|
||||
else
|
||||
@ -1618,7 +1637,7 @@ nvpair_value_common(nvpair_t *nvp, data_type_t type, uint_t *nelem, void *data)
|
||||
}
|
||||
|
||||
static int
|
||||
nvlist_lookup_common(nvlist_t *nvl, const char *name, data_type_t type,
|
||||
nvlist_lookup_common(const nvlist_t *nvl, const char *name, data_type_t type,
|
||||
uint_t *nelem, void *data)
|
||||
{
|
||||
if (name == NULL || nvl == NULL || nvl->nvl_priv == 0)
|
||||
@ -1635,75 +1654,76 @@ nvlist_lookup_common(nvlist_t *nvl, const char *name, data_type_t type,
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_lookup_boolean(nvlist_t *nvl, const char *name)
|
||||
nvlist_lookup_boolean(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name, DATA_TYPE_BOOLEAN, NULL, NULL));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_lookup_boolean_value(nvlist_t *nvl, const char *name, boolean_t *val)
|
||||
nvlist_lookup_boolean_value(const nvlist_t *nvl, const char *name,
|
||||
boolean_t *val)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name,
|
||||
DATA_TYPE_BOOLEAN_VALUE, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_lookup_byte(nvlist_t *nvl, const char *name, uchar_t *val)
|
||||
nvlist_lookup_byte(const nvlist_t *nvl, const char *name, uchar_t *val)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name, DATA_TYPE_BYTE, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_lookup_int8(nvlist_t *nvl, const char *name, int8_t *val)
|
||||
nvlist_lookup_int8(const nvlist_t *nvl, const char *name, int8_t *val)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT8, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_lookup_uint8(nvlist_t *nvl, const char *name, uint8_t *val)
|
||||
nvlist_lookup_uint8(const nvlist_t *nvl, const char *name, uint8_t *val)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT8, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_lookup_int16(nvlist_t *nvl, const char *name, int16_t *val)
|
||||
nvlist_lookup_int16(const nvlist_t *nvl, const char *name, int16_t *val)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT16, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_lookup_uint16(nvlist_t *nvl, const char *name, uint16_t *val)
|
||||
nvlist_lookup_uint16(const nvlist_t *nvl, const char *name, uint16_t *val)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT16, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_lookup_int32(nvlist_t *nvl, const char *name, int32_t *val)
|
||||
nvlist_lookup_int32(const nvlist_t *nvl, const char *name, int32_t *val)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT32, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_lookup_uint32(nvlist_t *nvl, const char *name, uint32_t *val)
|
||||
nvlist_lookup_uint32(const nvlist_t *nvl, const char *name, uint32_t *val)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT32, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_lookup_int64(nvlist_t *nvl, const char *name, int64_t *val)
|
||||
nvlist_lookup_int64(const nvlist_t *nvl, const char *name, int64_t *val)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT64, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvlist_lookup_uint64(nvlist_t *nvl, const char *name, uint64_t *val)
|
||||
nvlist_lookup_uint64(const nvlist_t *nvl, const char *name, uint64_t *val)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT64, NULL, val));
|
||||
}
|
||||
|
||||
#if !defined(_KERNEL)
|
||||
int
|
||||
nvlist_lookup_double(nvlist_t *nvl, const char *name, double *val)
|
||||
nvlist_lookup_double(const nvlist_t *nvl, const char *name, double *val)
|
||||
{
|
||||
return (nvlist_lookup_common(nvl, name, DATA_TYPE_DOUBLE, NULL, val));
|
||||
}
|
||||
@ -2079,7 +2099,7 @@ int nvlist_lookup_nvpair_embedded_index(nvlist_t *nvl,
|
||||
}
|
||||
|
||||
boolean_t
|
||||
nvlist_exists(nvlist_t *nvl, const char *name)
|
||||
nvlist_exists(const nvlist_t *nvl, const char *name)
|
||||
{
|
||||
nvpriv_t *priv;
|
||||
nvpair_t *nvp;
|
||||
@ -2100,68 +2120,68 @@ nvlist_exists(nvlist_t *nvl, const char *name)
|
||||
}
|
||||
|
||||
int
|
||||
nvpair_value_boolean_value(nvpair_t *nvp, boolean_t *val)
|
||||
nvpair_value_boolean_value(const nvpair_t *nvp, boolean_t *val)
|
||||
{
|
||||
return (nvpair_value_common(nvp, DATA_TYPE_BOOLEAN_VALUE, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvpair_value_byte(nvpair_t *nvp, uchar_t *val)
|
||||
nvpair_value_byte(const nvpair_t *nvp, uchar_t *val)
|
||||
{
|
||||
return (nvpair_value_common(nvp, DATA_TYPE_BYTE, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvpair_value_int8(nvpair_t *nvp, int8_t *val)
|
||||
nvpair_value_int8(const nvpair_t *nvp, int8_t *val)
|
||||
{
|
||||
return (nvpair_value_common(nvp, DATA_TYPE_INT8, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvpair_value_uint8(nvpair_t *nvp, uint8_t *val)
|
||||
nvpair_value_uint8(const nvpair_t *nvp, uint8_t *val)
|
||||
{
|
||||
return (nvpair_value_common(nvp, DATA_TYPE_UINT8, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvpair_value_int16(nvpair_t *nvp, int16_t *val)
|
||||
nvpair_value_int16(const nvpair_t *nvp, int16_t *val)
|
||||
{
|
||||
return (nvpair_value_common(nvp, DATA_TYPE_INT16, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvpair_value_uint16(nvpair_t *nvp, uint16_t *val)
|
||||
nvpair_value_uint16(const nvpair_t *nvp, uint16_t *val)
|
||||
{
|
||||
return (nvpair_value_common(nvp, DATA_TYPE_UINT16, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvpair_value_int32(nvpair_t *nvp, int32_t *val)
|
||||
nvpair_value_int32(const nvpair_t *nvp, int32_t *val)
|
||||
{
|
||||
return (nvpair_value_common(nvp, DATA_TYPE_INT32, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvpair_value_uint32(nvpair_t *nvp, uint32_t *val)
|
||||
nvpair_value_uint32(const nvpair_t *nvp, uint32_t *val)
|
||||
{
|
||||
return (nvpair_value_common(nvp, DATA_TYPE_UINT32, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvpair_value_int64(nvpair_t *nvp, int64_t *val)
|
||||
nvpair_value_int64(const nvpair_t *nvp, int64_t *val)
|
||||
{
|
||||
return (nvpair_value_common(nvp, DATA_TYPE_INT64, NULL, val));
|
||||
}
|
||||
|
||||
int
|
||||
nvpair_value_uint64(nvpair_t *nvp, uint64_t *val)
|
||||
nvpair_value_uint64(const nvpair_t *nvp, uint64_t *val)
|
||||
{
|
||||
return (nvpair_value_common(nvp, DATA_TYPE_UINT64, NULL, val));
|
||||
}
|
||||
|
||||
#if !defined(_KERNEL)
|
||||
int
|
||||
nvpair_value_double(nvpair_t *nvp, double *val)
|
||||
nvpair_value_double(const nvpair_t *nvp, double *val)
|
||||
{
|
||||
return (nvpair_value_common(nvp, DATA_TYPE_DOUBLE, NULL, val));
|
||||
}
|
||||
|
@ -55,6 +55,11 @@ __FBSDID("$FreeBSD$");
|
||||
static uint_t taskq_tsd;
|
||||
static uma_zone_t taskq_zone;
|
||||
|
||||
/*
|
||||
* Global system-wide dynamic task queue available for all consumers. This
|
||||
* taskq is not intended for long-running tasks; instead, a dedicated taskq
|
||||
* should be created.
|
||||
*/
|
||||
taskq_t *system_taskq = NULL;
|
||||
taskq_t *system_delay_taskq = NULL;
|
||||
taskq_t *dynamic_taskq = NULL;
|
||||
|
@ -152,8 +152,8 @@ spa_generate_rootconf(const char *name)
|
||||
fnvlist_add_string(nvroot, ZPOOL_CONFIG_TYPE, VDEV_TYPE_ROOT);
|
||||
fnvlist_add_uint64(nvroot, ZPOOL_CONFIG_ID, 0ULL);
|
||||
fnvlist_add_uint64(nvroot, ZPOOL_CONFIG_GUID, pgid);
|
||||
fnvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN, tops,
|
||||
nchildren);
|
||||
fnvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
|
||||
(const nvlist_t * const *)tops, nchildren);
|
||||
|
||||
/*
|
||||
* Replace the existing vdev_tree with the new root vdev in
|
||||
|
@ -815,7 +815,9 @@ static struct vop_vector zfsctl_ops_root = {
|
||||
.vop_vptocnp = zfsctl_root_vptocnp,
|
||||
.vop_pathconf = zfsctl_common_pathconf,
|
||||
.vop_getacl = zfsctl_common_getacl,
|
||||
#if __FreeBSD_version >= 1400043
|
||||
.vop_add_writecount = vop_stdadd_writecount_nomsync,
|
||||
#endif
|
||||
};
|
||||
VFS_VOP_VECTOR_REGISTER(zfsctl_ops_root);
|
||||
|
||||
@ -1135,7 +1137,9 @@ static struct vop_vector zfsctl_ops_snapdir = {
|
||||
.vop_print = zfsctl_common_print,
|
||||
.vop_pathconf = zfsctl_common_pathconf,
|
||||
.vop_getacl = zfsctl_common_getacl,
|
||||
#if __FreeBSD_version >= 1400043
|
||||
.vop_add_writecount = vop_stdadd_writecount_nomsync,
|
||||
#endif
|
||||
};
|
||||
VFS_VOP_VECTOR_REGISTER(zfsctl_ops_snapdir);
|
||||
|
||||
@ -1240,7 +1244,9 @@ static struct vop_vector zfsctl_ops_snapshot = {
|
||||
.vop_islocked = vop_stdislocked,
|
||||
.vop_advlockpurge = vop_stdadvlockpurge, /* called by vgone */
|
||||
.vop_print = zfsctl_common_print,
|
||||
#if __FreeBSD_version >= 1400043
|
||||
.vop_add_writecount = vop_stdadd_writecount_nomsync,
|
||||
#endif
|
||||
};
|
||||
VFS_VOP_VECTOR_REGISTER(zfsctl_ops_snapshot);
|
||||
|
||||
|
@ -2921,48 +2921,18 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr)
|
||||
}
|
||||
|
||||
/*
|
||||
* We acquire all but fdvp locks using non-blocking acquisitions. If we
|
||||
* fail to acquire any lock in the path we will drop all held locks,
|
||||
* acquire the new lock in a blocking fashion, and then release it and
|
||||
* restart the rename. This acquire/release step ensures that we do not
|
||||
* spin on a lock waiting for release. On error release all vnode locks
|
||||
* and decrement references the way tmpfs_rename() would do.
|
||||
* Look up the directory entries corresponding to the source and target
|
||||
* directory/name pairs.
|
||||
*/
|
||||
static int
|
||||
zfs_rename_relock(struct vnode *sdvp, struct vnode **svpp,
|
||||
struct vnode *tdvp, struct vnode **tvpp,
|
||||
const struct componentname *scnp, const struct componentname *tcnp)
|
||||
zfs_rename_relock_lookup(znode_t *sdzp, const struct componentname *scnp,
|
||||
znode_t **szpp, znode_t *tdzp, const struct componentname *tcnp,
|
||||
znode_t **tzpp)
|
||||
{
|
||||
zfsvfs_t *zfsvfs;
|
||||
struct vnode *nvp, *svp, *tvp;
|
||||
znode_t *sdzp, *tdzp, *szp, *tzp;
|
||||
const char *snm = scnp->cn_nameptr;
|
||||
const char *tnm = tcnp->cn_nameptr;
|
||||
zfsvfs_t *zfsvfs;
|
||||
znode_t *szp, *tzp;
|
||||
int error;
|
||||
|
||||
VOP_UNLOCK1(tdvp);
|
||||
if (*tvpp != NULL && *tvpp != tdvp)
|
||||
VOP_UNLOCK1(*tvpp);
|
||||
|
||||
relock:
|
||||
error = vn_lock(sdvp, LK_EXCLUSIVE);
|
||||
if (error)
|
||||
goto out;
|
||||
sdzp = VTOZ(sdvp);
|
||||
|
||||
error = vn_lock(tdvp, LK_EXCLUSIVE | LK_NOWAIT);
|
||||
if (error != 0) {
|
||||
VOP_UNLOCK1(sdvp);
|
||||
if (error != EBUSY)
|
||||
goto out;
|
||||
error = vn_lock(tdvp, LK_EXCLUSIVE);
|
||||
if (error)
|
||||
goto out;
|
||||
VOP_UNLOCK1(tdvp);
|
||||
goto relock;
|
||||
}
|
||||
tdzp = VTOZ(tdvp);
|
||||
|
||||
/*
|
||||
* Before using sdzp and tdzp we must ensure that they are live.
|
||||
* As a porting legacy from illumos we have two things to worry
|
||||
@ -2977,59 +2947,86 @@ zfs_rename_relock(struct vnode *sdvp, struct vnode **svpp,
|
||||
zfsvfs = sdzp->z_zfsvfs;
|
||||
ASSERT3P(zfsvfs, ==, tdzp->z_zfsvfs);
|
||||
ZFS_ENTER(zfsvfs);
|
||||
|
||||
/*
|
||||
* We can not use ZFS_VERIFY_ZP() here because it could directly return
|
||||
* bypassing the cleanup code in the case of an error.
|
||||
*/
|
||||
if (tdzp->z_sa_hdl == NULL || sdzp->z_sa_hdl == NULL) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
VOP_UNLOCK1(sdvp);
|
||||
VOP_UNLOCK1(tdvp);
|
||||
error = SET_ERROR(EIO);
|
||||
goto out;
|
||||
}
|
||||
ZFS_VERIFY_ZP(sdzp);
|
||||
ZFS_VERIFY_ZP(tdzp);
|
||||
|
||||
/*
|
||||
* Re-resolve svp to be certain it still exists and fetch the
|
||||
* correct vnode.
|
||||
*/
|
||||
error = zfs_dirent_lookup(sdzp, snm, &szp, ZEXISTS);
|
||||
error = zfs_dirent_lookup(sdzp, scnp->cn_nameptr, &szp, ZEXISTS);
|
||||
if (error != 0) {
|
||||
/* Source entry invalid or not there. */
|
||||
ZFS_EXIT(zfsvfs);
|
||||
VOP_UNLOCK1(sdvp);
|
||||
VOP_UNLOCK1(tdvp);
|
||||
if ((scnp->cn_flags & ISDOTDOT) != 0 ||
|
||||
(scnp->cn_namelen == 1 && scnp->cn_nameptr[0] == '.'))
|
||||
error = SET_ERROR(EINVAL);
|
||||
goto out;
|
||||
}
|
||||
svp = ZTOV(szp);
|
||||
*szpp = szp;
|
||||
|
||||
/*
|
||||
* Re-resolve tvp, if it disappeared we just carry on.
|
||||
*/
|
||||
error = zfs_dirent_lookup(tdzp, tnm, &tzp, 0);
|
||||
error = zfs_dirent_lookup(tdzp, tcnp->cn_nameptr, &tzp, 0);
|
||||
if (error != 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
VOP_UNLOCK1(sdvp);
|
||||
VOP_UNLOCK1(tdvp);
|
||||
vrele(svp);
|
||||
vrele(ZTOV(szp));
|
||||
if ((tcnp->cn_flags & ISDOTDOT) != 0)
|
||||
error = SET_ERROR(EINVAL);
|
||||
goto out;
|
||||
}
|
||||
if (tzp != NULL)
|
||||
tvp = ZTOV(tzp);
|
||||
else
|
||||
tvp = NULL;
|
||||
|
||||
/*
|
||||
* At present the vnode locks must be acquired before z_teardown_lock,
|
||||
* although it would be more logical to use the opposite order.
|
||||
*/
|
||||
*tzpp = tzp;
|
||||
out:
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* We acquire all but fdvp locks using non-blocking acquisitions. If we
|
||||
* fail to acquire any lock in the path we will drop all held locks,
|
||||
* acquire the new lock in a blocking fashion, and then release it and
|
||||
* restart the rename. This acquire/release step ensures that we do not
|
||||
* spin on a lock waiting for release. On error release all vnode locks
|
||||
* and decrement references the way tmpfs_rename() would do.
|
||||
*/
|
||||
static int
|
||||
zfs_rename_relock(struct vnode *sdvp, struct vnode **svpp,
|
||||
struct vnode *tdvp, struct vnode **tvpp,
|
||||
const struct componentname *scnp, const struct componentname *tcnp)
|
||||
{
|
||||
struct vnode *nvp, *svp, *tvp;
|
||||
znode_t *sdzp, *tdzp, *szp, *tzp;
|
||||
int error;
|
||||
|
||||
VOP_UNLOCK1(tdvp);
|
||||
if (*tvpp != NULL && *tvpp != tdvp)
|
||||
VOP_UNLOCK1(*tvpp);
|
||||
|
||||
relock:
|
||||
error = vn_lock(sdvp, LK_EXCLUSIVE);
|
||||
if (error)
|
||||
goto out;
|
||||
error = vn_lock(tdvp, LK_EXCLUSIVE | LK_NOWAIT);
|
||||
if (error != 0) {
|
||||
VOP_UNLOCK1(sdvp);
|
||||
if (error != EBUSY)
|
||||
goto out;
|
||||
error = vn_lock(tdvp, LK_EXCLUSIVE);
|
||||
if (error)
|
||||
goto out;
|
||||
VOP_UNLOCK1(tdvp);
|
||||
goto relock;
|
||||
}
|
||||
tdzp = VTOZ(tdvp);
|
||||
sdzp = VTOZ(sdvp);
|
||||
|
||||
error = zfs_rename_relock_lookup(sdzp, scnp, &szp, tdzp, tcnp, &tzp);
|
||||
if (error != 0) {
|
||||
VOP_UNLOCK1(sdvp);
|
||||
VOP_UNLOCK1(tdvp);
|
||||
goto out;
|
||||
}
|
||||
svp = ZTOV(szp);
|
||||
tvp = tzp != NULL ? ZTOV(tzp) : NULL;
|
||||
|
||||
/*
|
||||
* Now try acquire locks on svp and tvp.
|
||||
@ -3166,17 +3163,22 @@ cache_vop_rename(struct vnode *fdvp, struct vnode *fvp, struct vnode *tdvp,
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
zfs_do_rename_impl(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
vnode_t *tdvp, vnode_t **tvpp, struct componentname *tcnp,
|
||||
cred_t *cr);
|
||||
|
||||
/*
|
||||
* Move an entry from the provided source directory to the target
|
||||
* directory. Change the entry name as indicated.
|
||||
*
|
||||
* IN: sdvp - Source directory containing the "old entry".
|
||||
* snm - Old entry name.
|
||||
* scnp - Old entry name.
|
||||
* tdvp - Target directory to contain the "new entry".
|
||||
* tnm - New entry name.
|
||||
* tcnp - New entry name.
|
||||
* cr - credentials of caller.
|
||||
* ct - caller context
|
||||
* flags - case flags
|
||||
* INOUT: svpp - Source file
|
||||
* tvpp - Target file, may point to NULL initially
|
||||
*
|
||||
* RETURN: 0 on success, error code on failure.
|
||||
*
|
||||
@ -3185,18 +3187,15 @@ cache_vop_rename(struct vnode *fdvp, struct vnode *fvp, struct vnode *tdvp,
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
static int
|
||||
zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
zfs_do_rename(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
vnode_t *tdvp, vnode_t **tvpp, struct componentname *tcnp,
|
||||
cred_t *cr, int log)
|
||||
cred_t *cr)
|
||||
{
|
||||
zfsvfs_t *zfsvfs;
|
||||
znode_t *sdzp, *tdzp, *szp, *tzp;
|
||||
zilog_t *zilog = NULL;
|
||||
dmu_tx_t *tx;
|
||||
const char *snm = scnp->cn_nameptr;
|
||||
const char *tnm = tcnp->cn_nameptr;
|
||||
int error = 0;
|
||||
bool want_seqc_end __maybe_unused = false;
|
||||
int error;
|
||||
|
||||
ASSERT_VOP_ELOCKED(tdvp, __func__);
|
||||
if (*tvpp != NULL)
|
||||
ASSERT_VOP_ELOCKED(*tvpp, __func__);
|
||||
|
||||
/* Reject renames across filesystems. */
|
||||
if ((*svpp)->v_mount != tdvp->v_mount ||
|
||||
@ -3219,51 +3218,64 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
return (error);
|
||||
}
|
||||
|
||||
error = zfs_do_rename_impl(sdvp, svpp, scnp, tdvp, tvpp, tcnp, cr);
|
||||
VOP_UNLOCK1(sdvp);
|
||||
VOP_UNLOCK1(*svpp);
|
||||
out:
|
||||
if (*tvpp != NULL)
|
||||
VOP_UNLOCK1(*tvpp);
|
||||
if (tdvp != *tvpp)
|
||||
VOP_UNLOCK1(tdvp);
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
zfs_do_rename_impl(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
vnode_t *tdvp, vnode_t **tvpp, struct componentname *tcnp,
|
||||
cred_t *cr)
|
||||
{
|
||||
dmu_tx_t *tx;
|
||||
zfsvfs_t *zfsvfs;
|
||||
zilog_t *zilog;
|
||||
znode_t *tdzp, *sdzp, *tzp, *szp;
|
||||
const char *snm = scnp->cn_nameptr;
|
||||
const char *tnm = tcnp->cn_nameptr;
|
||||
int error;
|
||||
|
||||
tdzp = VTOZ(tdvp);
|
||||
sdzp = VTOZ(sdvp);
|
||||
zfsvfs = tdzp->z_zfsvfs;
|
||||
zilog = zfsvfs->z_log;
|
||||
|
||||
/*
|
||||
* After we re-enter ZFS_ENTER() we will have to revalidate all
|
||||
* znodes involved.
|
||||
*/
|
||||
ZFS_ENTER(zfsvfs);
|
||||
ZFS_VERIFY_ZP(tdzp);
|
||||
ZFS_VERIFY_ZP(sdzp);
|
||||
zilog = zfsvfs->z_log;
|
||||
|
||||
if (zfsvfs->z_utf8 && u8_validate(tnm,
|
||||
strlen(tnm), NULL, U8_VALIDATE_ENTIRE, &error) < 0) {
|
||||
error = SET_ERROR(EILSEQ);
|
||||
goto unlockout;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* If source and target are the same file, there is nothing to do. */
|
||||
if ((*svpp) == (*tvpp)) {
|
||||
error = 0;
|
||||
goto unlockout;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (((*svpp)->v_type == VDIR && (*svpp)->v_mountedhere != NULL) ||
|
||||
((*tvpp) != NULL && (*tvpp)->v_type == VDIR &&
|
||||
(*tvpp)->v_mountedhere != NULL)) {
|
||||
error = SET_ERROR(EXDEV);
|
||||
goto unlockout;
|
||||
}
|
||||
|
||||
/*
|
||||
* We can not use ZFS_VERIFY_ZP() here because it could directly return
|
||||
* bypassing the cleanup code in the case of an error.
|
||||
*/
|
||||
if (tdzp->z_sa_hdl == NULL || sdzp->z_sa_hdl == NULL) {
|
||||
error = SET_ERROR(EIO);
|
||||
goto unlockout;
|
||||
goto out;
|
||||
}
|
||||
|
||||
szp = VTOZ(*svpp);
|
||||
ZFS_VERIFY_ZP(szp);
|
||||
tzp = *tvpp == NULL ? NULL : VTOZ(*tvpp);
|
||||
if (szp->z_sa_hdl == NULL || (tzp != NULL && tzp->z_sa_hdl == NULL)) {
|
||||
error = SET_ERROR(EIO);
|
||||
goto unlockout;
|
||||
}
|
||||
if (tzp != NULL)
|
||||
ZFS_VERIFY_ZP(tzp);
|
||||
|
||||
/*
|
||||
* This is to prevent the creation of links into attribute space
|
||||
@ -3272,7 +3284,7 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
*/
|
||||
if ((tdzp->z_pflags & ZFS_XATTR) != (sdzp->z_pflags & ZFS_XATTR)) {
|
||||
error = SET_ERROR(EINVAL);
|
||||
goto unlockout;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3285,7 +3297,7 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
if (tdzp->z_pflags & ZFS_PROJINHERIT &&
|
||||
tdzp->z_projid != szp->z_projid) {
|
||||
error = SET_ERROR(EXDEV);
|
||||
goto unlockout;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3295,7 +3307,7 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
* done in a single check.
|
||||
*/
|
||||
if ((error = zfs_zaccess_rename(sdzp, szp, tdzp, tzp, cr)))
|
||||
goto unlockout;
|
||||
goto out;
|
||||
|
||||
if ((*svpp)->v_type == VDIR) {
|
||||
/*
|
||||
@ -3305,7 +3317,7 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
sdzp == szp ||
|
||||
(scnp->cn_flags | tcnp->cn_flags) & ISDOTDOT) {
|
||||
error = EINVAL;
|
||||
goto unlockout;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3313,7 +3325,7 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
* Can't do a move like this: /usr/a/b to /usr/a/b/c/d
|
||||
*/
|
||||
if ((error = zfs_rename_check(szp, sdzp, tdzp)))
|
||||
goto unlockout;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3326,7 +3338,7 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
if ((*svpp)->v_type == VDIR) {
|
||||
if ((*tvpp)->v_type != VDIR) {
|
||||
error = SET_ERROR(ENOTDIR);
|
||||
goto unlockout;
|
||||
goto out;
|
||||
} else {
|
||||
cache_purge(tdvp);
|
||||
if (sdvp != tdvp)
|
||||
@ -3335,7 +3347,7 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
} else {
|
||||
if ((*tvpp)->v_type == VDIR) {
|
||||
error = SET_ERROR(EISDIR);
|
||||
goto unlockout;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3346,9 +3358,7 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
vn_seqc_write_begin(*tvpp);
|
||||
if (tdvp != *tvpp)
|
||||
vn_seqc_write_begin(tdvp);
|
||||
#if __FreeBSD_version >= 1300102
|
||||
want_seqc_end = true;
|
||||
#endif
|
||||
|
||||
vnevent_rename_src(*svpp, sdvp, scnp->cn_nameptr, ct);
|
||||
if (tzp)
|
||||
vnevent_rename_dest(*tvpp, tdvp, tnm, ct);
|
||||
@ -3380,10 +3390,9 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
error = dmu_tx_assign(tx, TXG_WAIT);
|
||||
if (error) {
|
||||
dmu_tx_abort(tx);
|
||||
goto unlockout;
|
||||
goto out_seq;
|
||||
}
|
||||
|
||||
|
||||
if (tzp) /* Attempt to remove the existing target */
|
||||
error = zfs_link_destroy(tdzp, tnm, tzp, tx, 0, NULL);
|
||||
|
||||
@ -3430,30 +3439,19 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
|
||||
dmu_tx_commit(tx);
|
||||
|
||||
unlockout: /* all 4 vnodes are locked, ZFS_ENTER called */
|
||||
if (want_seqc_end) {
|
||||
vn_seqc_write_end(*svpp);
|
||||
vn_seqc_write_end(sdvp);
|
||||
if (*tvpp != NULL)
|
||||
vn_seqc_write_end(*tvpp);
|
||||
if (tdvp != *tvpp)
|
||||
vn_seqc_write_end(tdvp);
|
||||
want_seqc_end = false;
|
||||
}
|
||||
VOP_UNLOCK1(*svpp);
|
||||
VOP_UNLOCK1(sdvp);
|
||||
out_seq:
|
||||
vn_seqc_write_end(*svpp);
|
||||
vn_seqc_write_end(sdvp);
|
||||
if (*tvpp != NULL)
|
||||
vn_seqc_write_end(*tvpp);
|
||||
if (tdvp != *tvpp)
|
||||
vn_seqc_write_end(tdvp);
|
||||
|
||||
out:
|
||||
if (error == 0 && zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
|
||||
zil_commit(zilog, 0);
|
||||
ZFS_EXIT(zfsvfs);
|
||||
|
||||
out: /* original two vnodes are locked */
|
||||
MPASS(!want_seqc_end);
|
||||
|
||||
if (*tvpp != NULL)
|
||||
VOP_UNLOCK1(*tvpp);
|
||||
if (tdvp != *tvpp)
|
||||
VOP_UNLOCK1(tdvp);
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -3485,7 +3483,7 @@ zfs_rename(znode_t *sdzp, const char *sname, znode_t *tdzp, const char *tname,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
error = zfs_rename_(sdvp, &svp, &scn, tdvp, &tvp, &tcn, cr, 0);
|
||||
error = zfs_do_rename(sdvp, &svp, &scn, tdvp, &tvp, &tcn, cr);
|
||||
fail:
|
||||
if (svp != NULL)
|
||||
vrele(svp);
|
||||
@ -4965,8 +4963,8 @@ zfs_freebsd_rename(struct vop_rename_args *ap)
|
||||
ASSERT(ap->a_fcnp->cn_flags & (SAVENAME|SAVESTART));
|
||||
ASSERT(ap->a_tcnp->cn_flags & (SAVENAME|SAVESTART));
|
||||
|
||||
error = zfs_rename_(fdvp, &fvp, ap->a_fcnp, tdvp, &tvp,
|
||||
ap->a_tcnp, ap->a_fcnp->cn_cred, 1);
|
||||
error = zfs_do_rename(fdvp, &fvp, ap->a_fcnp, tdvp, &tvp,
|
||||
ap->a_tcnp, ap->a_fcnp->cn_cred);
|
||||
|
||||
vrele(fdvp);
|
||||
vrele(fvp);
|
||||
@ -5345,7 +5343,12 @@ zfs_getextattr_dir(struct vop_getextattr_args *ap, const char *attrname)
|
||||
return (error);
|
||||
|
||||
flags = FREAD;
|
||||
#if __FreeBSD_version < 1400043
|
||||
NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, attrname,
|
||||
xvp, td);
|
||||
#else
|
||||
NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, attrname, xvp);
|
||||
#endif
|
||||
error = vn_open_cred(&nd, &flags, 0, VN_OPEN_INVFS, ap->a_cred, NULL);
|
||||
vp = nd.ni_vp;
|
||||
NDFREE(&nd, NDF_ONLY_PNBUF);
|
||||
@ -5458,8 +5461,13 @@ zfs_deleteextattr_dir(struct vop_deleteextattr_args *ap, const char *attrname)
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
#if __FreeBSD_version < 1400043
|
||||
NDINIT_ATVP(&nd, DELETE, NOFOLLOW | LOCKPARENT | LOCKLEAF,
|
||||
UIO_SYSSPACE, attrname, xvp, ap->a_td);
|
||||
#else
|
||||
NDINIT_ATVP(&nd, DELETE, NOFOLLOW | LOCKPARENT | LOCKLEAF,
|
||||
UIO_SYSSPACE, attrname, xvp);
|
||||
#endif
|
||||
error = namei(&nd);
|
||||
vp = nd.ni_vp;
|
||||
if (error != 0) {
|
||||
@ -5587,7 +5595,11 @@ zfs_setextattr_dir(struct vop_setextattr_args *ap, const char *attrname)
|
||||
return (error);
|
||||
|
||||
flags = FFLAGS(O_WRONLY | O_CREAT);
|
||||
#if __FreeBSD_version < 1400043
|
||||
NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, attrname, xvp, td);
|
||||
#else
|
||||
NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, attrname, xvp);
|
||||
#endif
|
||||
error = vn_open_cred(&nd, &flags, 0600, VN_OPEN_INVFS, ap->a_cred,
|
||||
NULL);
|
||||
vp = nd.ni_vp;
|
||||
@ -5742,8 +5754,13 @@ zfs_listextattr_dir(struct vop_listextattr_args *ap, const char *attrprefix)
|
||||
return (error);
|
||||
}
|
||||
|
||||
#if __FreeBSD_version < 1400043
|
||||
NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW | LOCKLEAF | LOCKSHARED,
|
||||
UIO_SYSSPACE, ".", xvp, td);
|
||||
#else
|
||||
NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW | LOCKLEAF | LOCKSHARED,
|
||||
UIO_SYSSPACE, ".", xvp);
|
||||
#endif
|
||||
error = namei(&nd);
|
||||
vp = nd.ni_vp;
|
||||
NDFREE(&nd, NDF_ONLY_PNBUF);
|
||||
@ -6172,7 +6189,9 @@ struct vop_vector zfs_vnodeops = {
|
||||
.vop_unlock = vop_unlock,
|
||||
.vop_islocked = vop_islocked,
|
||||
#endif
|
||||
#if __FreeBSD_version >= 1400043
|
||||
.vop_add_writecount = vop_stdadd_writecount_nomsync,
|
||||
#endif
|
||||
};
|
||||
VFS_VOP_VECTOR_REGISTER(zfs_vnodeops);
|
||||
|
||||
@ -6197,7 +6216,9 @@ struct vop_vector zfs_fifoops = {
|
||||
.vop_getacl = zfs_freebsd_getacl,
|
||||
.vop_setacl = zfs_freebsd_setacl,
|
||||
.vop_aclcheck = zfs_freebsd_aclcheck,
|
||||
#if __FreeBSD_version >= 1400043
|
||||
.vop_add_writecount = vop_stdadd_writecount_nomsync,
|
||||
#endif
|
||||
};
|
||||
VFS_VOP_VECTOR_REGISTER(zfs_fifoops);
|
||||
|
||||
@ -6217,6 +6238,8 @@ struct vop_vector zfs_shareops = {
|
||||
.vop_reclaim = zfs_freebsd_reclaim,
|
||||
.vop_fid = zfs_freebsd_fid,
|
||||
.vop_pathconf = zfs_freebsd_pathconf,
|
||||
#if __FreeBSD_version >= 1400043
|
||||
.vop_add_writecount = vop_stdadd_writecount_nomsync,
|
||||
#endif
|
||||
};
|
||||
VFS_VOP_VECTOR_REGISTER(zfs_shareops);
|
||||
|
@ -51,7 +51,11 @@ module_param(spl_taskq_thread_sequential, int, 0644);
|
||||
MODULE_PARM_DESC(spl_taskq_thread_sequential,
|
||||
"Create new taskq threads after N sequential tasks");
|
||||
|
||||
/* Global system-wide dynamic task queue available for all consumers */
|
||||
/*
|
||||
* Global system-wide dynamic task queue available for all consumers. This
|
||||
* taskq is not intended for long-running tasks; instead, a dedicated taskq
|
||||
* should be created.
|
||||
*/
|
||||
taskq_t *system_taskq;
|
||||
EXPORT_SYMBOL(system_taskq);
|
||||
/* Global dynamic task queue for long delay */
|
||||
|
@ -37,6 +37,9 @@
|
||||
#include <linux/blkpg.h>
|
||||
#include <linux/msdos_fs.h>
|
||||
#include <linux/vfs_compat.h>
|
||||
#ifdef HAVE_LINUX_BLK_CGROUP_HEADER
|
||||
#include <linux/blk-cgroup.h>
|
||||
#endif
|
||||
|
||||
typedef struct vdev_disk {
|
||||
struct block_device *vd_bdev;
|
||||
@ -265,6 +268,11 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
|
||||
* a ENOENT failure at this point is highly likely to be transient
|
||||
* and it is reasonable to sleep and retry before giving up. In
|
||||
* practice delays have been observed to be on the order of 100ms.
|
||||
*
|
||||
* When ERESTARTSYS is returned it indicates the block device is
|
||||
* a zvol which could not be opened due to the deadlock detection
|
||||
* logic in zvol_open(). Extend the timeout and retry the open
|
||||
* subsequent attempts are expected to eventually succeed.
|
||||
*/
|
||||
hrtime_t start = gethrtime();
|
||||
bdev = ERR_PTR(-ENXIO);
|
||||
@ -273,6 +281,9 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
|
||||
zfs_vdev_holder);
|
||||
if (unlikely(PTR_ERR(bdev) == -ENOENT)) {
|
||||
schedule_timeout(MSEC_TO_TICK(10));
|
||||
} else if (unlikely(PTR_ERR(bdev) == -ERESTARTSYS)) {
|
||||
timeout = MSEC2NSEC(zfs_vdev_open_timeout_ms * 10);
|
||||
continue;
|
||||
} else if (IS_ERR(bdev)) {
|
||||
break;
|
||||
}
|
||||
@ -485,6 +496,7 @@ vdev_blkg_tryget(struct blkcg_gq *blkg)
|
||||
#elif defined(HAVE_BLKG_TRYGET)
|
||||
#define vdev_blkg_tryget(bg) blkg_tryget(bg)
|
||||
#endif
|
||||
#ifdef HAVE_BIO_SET_DEV_MACRO
|
||||
/*
|
||||
* The Linux 5.0 kernel updated the bio_set_dev() macro so it calls the
|
||||
* GPL-only bio_associate_blkg() symbol thus inadvertently converting
|
||||
@ -506,7 +518,30 @@ vdev_bio_associate_blkg(struct bio *bio)
|
||||
if (q->root_blkg && vdev_blkg_tryget(q->root_blkg))
|
||||
bio->bi_blkg = q->root_blkg;
|
||||
}
|
||||
|
||||
#define bio_associate_blkg vdev_bio_associate_blkg
|
||||
#else
|
||||
static inline void
|
||||
vdev_bio_set_dev(struct bio *bio, struct block_device *bdev)
|
||||
{
|
||||
#if defined(HAVE_BIO_BDEV_DISK)
|
||||
struct request_queue *q = bdev->bd_disk->queue;
|
||||
#else
|
||||
struct request_queue *q = bio->bi_disk->queue;
|
||||
#endif
|
||||
bio_clear_flag(bio, BIO_REMAPPED);
|
||||
if (bio->bi_bdev != bdev)
|
||||
bio_clear_flag(bio, BIO_THROTTLED);
|
||||
bio->bi_bdev = bdev;
|
||||
|
||||
ASSERT3P(q, !=, NULL);
|
||||
ASSERT3P(bio->bi_blkg, ==, NULL);
|
||||
|
||||
if (q->root_blkg && vdev_blkg_tryget(q->root_blkg))
|
||||
bio->bi_blkg = q->root_blkg;
|
||||
}
|
||||
#define bio_set_dev vdev_bio_set_dev
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
/*
|
||||
|
@ -90,6 +90,7 @@ struct zfs_mod_kobj {
|
||||
static zfs_mod_kobj_t kernel_features_kobj;
|
||||
static zfs_mod_kobj_t pool_features_kobj;
|
||||
static zfs_mod_kobj_t dataset_props_kobj;
|
||||
static zfs_mod_kobj_t vdev_props_kobj;
|
||||
static zfs_mod_kobj_t pool_props_kobj;
|
||||
|
||||
/*
|
||||
@ -333,6 +334,20 @@ dataset_property_show(struct kobject *kobj, struct attribute *attr, char *buf)
|
||||
return (len);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
vdev_property_show(struct kobject *kobj, struct attribute *attr, char *buf)
|
||||
{
|
||||
vdev_prop_t prop = vdev_name_to_prop(kobject_name(kobj));
|
||||
zprop_desc_t *prop_tbl = vdev_prop_get_table();
|
||||
ssize_t len;
|
||||
|
||||
ASSERT3U(prop, <, VDEV_NUM_PROPS);
|
||||
|
||||
len = zprop_sysfs_show(attr->name, &prop_tbl[prop], buf, PAGE_SIZE);
|
||||
|
||||
return (len);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
pool_property_show(struct kobject *kobj, struct attribute *attr, char *buf)
|
||||
{
|
||||
@ -577,6 +592,14 @@ zfs_sysfs_properties_init(zfs_mod_kobj_t *zfs_kobj, struct kobject *parent,
|
||||
context.p2k_show_func = pool_property_show;
|
||||
err = zfs_kobj_init(zfs_kobj, 0, ZPOOL_NUM_PROPS,
|
||||
pool_property_show);
|
||||
} else if (type == ZFS_TYPE_VDEV) {
|
||||
name = ZFS_SYSFS_VDEV_PROPERTIES;
|
||||
context.p2k_table = vdev_prop_get_table();
|
||||
context.p2k_attr_count = ZPOOL_PROP_ATTR_COUNT;
|
||||
context.p2k_parent = zfs_kobj;
|
||||
context.p2k_show_func = vdev_property_show;
|
||||
err = zfs_kobj_init(zfs_kobj, 0, VDEV_NUM_PROPS,
|
||||
vdev_property_show);
|
||||
} else {
|
||||
name = ZFS_SYSFS_DATASET_PROPERTIES;
|
||||
context.p2k_table = zfs_prop_get_table();
|
||||
@ -639,12 +662,22 @@ zfs_sysfs_init(void)
|
||||
return;
|
||||
}
|
||||
|
||||
err = zfs_sysfs_properties_init(&vdev_props_kobj, parent,
|
||||
ZFS_TYPE_VDEV);
|
||||
if (err) {
|
||||
zfs_kobj_fini(&kernel_features_kobj);
|
||||
zfs_kobj_fini(&pool_features_kobj);
|
||||
zfs_kobj_fini(&pool_props_kobj);
|
||||
return;
|
||||
}
|
||||
|
||||
err = zfs_sysfs_properties_init(&dataset_props_kobj, parent,
|
||||
ZFS_TYPE_FILESYSTEM);
|
||||
if (err) {
|
||||
zfs_kobj_fini(&kernel_features_kobj);
|
||||
zfs_kobj_fini(&pool_features_kobj);
|
||||
zfs_kobj_fini(&pool_props_kobj);
|
||||
zfs_kobj_fini(&vdev_props_kobj);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -657,6 +690,7 @@ zfs_sysfs_fini(void)
|
||||
*/
|
||||
zfs_kobj_fini(&kernel_features_kobj);
|
||||
zfs_kobj_fini(&pool_features_kobj);
|
||||
zfs_kobj_fini(&dataset_props_kobj);
|
||||
zfs_kobj_fini(&pool_props_kobj);
|
||||
zfs_kobj_fini(&vdev_props_kobj);
|
||||
zfs_kobj_fini(&dataset_props_kobj);
|
||||
}
|
||||
|
@ -3531,7 +3531,11 @@ zfs_putpage(struct inode *ip, struct page *pp, struct writeback_control *wbc)
|
||||
|
||||
if (wbc->sync_mode != WB_SYNC_NONE) {
|
||||
if (PageWriteback(pp))
|
||||
#ifdef HAVE_PAGEMAP_FOLIO_WAIT_BIT
|
||||
folio_wait_bit(page_folio(pp), PG_writeback);
|
||||
#else
|
||||
wait_on_page_bit(pp, PG_writeback);
|
||||
#endif
|
||||
}
|
||||
|
||||
ZFS_EXIT(zfsvfs);
|
||||
|
@ -250,11 +250,17 @@ zpl_uio_init(zfs_uio_t *uio, struct kiocb *kiocb, struct iov_iter *to,
|
||||
{
|
||||
#if defined(HAVE_VFS_IOV_ITER)
|
||||
zfs_uio_iov_iter_init(uio, to, pos, count, skip);
|
||||
#else
|
||||
#ifdef HAVE_IOV_ITER_TYPE
|
||||
zfs_uio_iovec_init(uio, to->iov, to->nr_segs, pos,
|
||||
iov_iter_type(to) & ITER_KVEC ? UIO_SYSSPACE : UIO_USERSPACE,
|
||||
count, skip);
|
||||
#else
|
||||
zfs_uio_iovec_init(uio, to->iov, to->nr_segs, pos,
|
||||
to->type & ITER_KVEC ? UIO_SYSSPACE : UIO_USERSPACE,
|
||||
count, skip);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
|
@ -46,6 +46,7 @@ unsigned int zvol_request_sync = 0;
|
||||
unsigned int zvol_prefetch_bytes = (128 * 1024);
|
||||
unsigned long zvol_max_discard_blocks = 16384;
|
||||
unsigned int zvol_threads = 32;
|
||||
unsigned int zvol_open_timeout_ms = 1000;
|
||||
|
||||
struct zvol_state_os {
|
||||
struct gendisk *zvo_disk; /* generic disk */
|
||||
@ -336,8 +337,13 @@ zvol_read_task(void *arg)
|
||||
}
|
||||
|
||||
#ifdef HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS
|
||||
#ifdef HAVE_BDEV_SUBMIT_BIO_RETURNS_VOID
|
||||
static void
|
||||
zvol_submit_bio(struct bio *bio)
|
||||
#else
|
||||
static blk_qc_t
|
||||
zvol_submit_bio(struct bio *bio)
|
||||
#endif
|
||||
#else
|
||||
static MAKE_REQUEST_FN_RET
|
||||
zvol_request(struct request_queue *q, struct bio *bio)
|
||||
@ -478,8 +484,9 @@ zvol_request(struct request_queue *q, struct bio *bio)
|
||||
|
||||
out:
|
||||
spl_fstrans_unmark(cookie);
|
||||
#if defined(HAVE_MAKE_REQUEST_FN_RET_QC) || \
|
||||
defined(HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS)
|
||||
#if (defined(HAVE_MAKE_REQUEST_FN_RET_QC) || \
|
||||
defined(HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS)) && \
|
||||
!defined(HAVE_BDEV_SUBMIT_BIO_RETURNS_VOID)
|
||||
return (BLK_QC_T_NONE);
|
||||
#endif
|
||||
}
|
||||
@ -490,7 +497,13 @@ zvol_open(struct block_device *bdev, fmode_t flag)
|
||||
zvol_state_t *zv;
|
||||
int error = 0;
|
||||
boolean_t drop_suspend = B_TRUE;
|
||||
boolean_t drop_namespace = B_FALSE;
|
||||
#ifndef HAVE_BLKDEV_GET_ERESTARTSYS
|
||||
hrtime_t timeout = MSEC2NSEC(zvol_open_timeout_ms);
|
||||
hrtime_t start = gethrtime();
|
||||
|
||||
retry:
|
||||
#endif
|
||||
rw_enter(&zvol_state_lock, RW_READER);
|
||||
/*
|
||||
* Obtain a copy of private_data under the zvol_state_lock to make
|
||||
@ -504,6 +517,49 @@ zvol_open(struct block_device *bdev, fmode_t flag)
|
||||
return (SET_ERROR(-ENXIO));
|
||||
}
|
||||
|
||||
if (zv->zv_open_count == 0 && !mutex_owned(&spa_namespace_lock)) {
|
||||
/*
|
||||
* In all other call paths the spa_namespace_lock is taken
|
||||
* before the bdev->bd_mutex lock. However, on open(2)
|
||||
* the __blkdev_get() function calls fops->open() with the
|
||||
* bdev->bd_mutex lock held. This can result in a deadlock
|
||||
* when zvols from one pool are used as vdevs in another.
|
||||
*
|
||||
* To prevent a lock inversion deadlock we preemptively
|
||||
* take the spa_namespace_lock. Normally the lock will not
|
||||
* be contended and this is safe because spa_open_common()
|
||||
* handles the case where the caller already holds the
|
||||
* spa_namespace_lock.
|
||||
*
|
||||
* When the lock cannot be aquired after multiple retries
|
||||
* this must be the vdev on zvol deadlock case and we have
|
||||
* no choice but to return an error. For 5.12 and older
|
||||
* kernels returning -ERESTARTSYS will result in the
|
||||
* bdev->bd_mutex being dropped, then reacquired, and
|
||||
* fops->open() being called again. This process can be
|
||||
* repeated safely until both locks are acquired. For 5.13
|
||||
* and newer the -ERESTARTSYS retry logic was removed from
|
||||
* the kernel so the only option is to return the error for
|
||||
* the caller to handle it.
|
||||
*/
|
||||
if (!mutex_tryenter(&spa_namespace_lock)) {
|
||||
rw_exit(&zvol_state_lock);
|
||||
|
||||
#ifdef HAVE_BLKDEV_GET_ERESTARTSYS
|
||||
schedule();
|
||||
return (SET_ERROR(-ERESTARTSYS));
|
||||
#else
|
||||
if ((gethrtime() - start) > timeout)
|
||||
return (SET_ERROR(-ERESTARTSYS));
|
||||
|
||||
schedule_timeout(MSEC_TO_TICK(10));
|
||||
goto retry;
|
||||
#endif
|
||||
} else {
|
||||
drop_namespace = B_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_enter(&zv->zv_state_lock);
|
||||
/*
|
||||
* make sure zvol is not suspended during first open
|
||||
@ -543,6 +599,8 @@ zvol_open(struct block_device *bdev, fmode_t flag)
|
||||
zv->zv_open_count++;
|
||||
|
||||
mutex_exit(&zv->zv_state_lock);
|
||||
if (drop_namespace)
|
||||
mutex_exit(&spa_namespace_lock);
|
||||
if (drop_suspend)
|
||||
rw_exit(&zv->zv_suspend_lock);
|
||||
|
||||
@ -556,12 +614,11 @@ zvol_open(struct block_device *bdev, fmode_t flag)
|
||||
|
||||
out_mutex:
|
||||
mutex_exit(&zv->zv_state_lock);
|
||||
if (drop_namespace)
|
||||
mutex_exit(&spa_namespace_lock);
|
||||
if (drop_suspend)
|
||||
rw_exit(&zv->zv_suspend_lock);
|
||||
if (error == -EINTR) {
|
||||
error = -ERESTARTSYS;
|
||||
schedule();
|
||||
}
|
||||
|
||||
return (SET_ERROR(error));
|
||||
}
|
||||
|
||||
|
@ -225,10 +225,11 @@ zfs_mod_supported_feature(const char *name)
|
||||
*
|
||||
* The equivalent _can_ be done on FreeBSD by way of the sysctl
|
||||
* tree, but this has not been done yet. Therefore, we return
|
||||
* that all features except edonr are supported.
|
||||
* that all features are supported.
|
||||
*/
|
||||
|
||||
#if defined(_KERNEL) || defined(LIB_ZPOOL_BUILD) || defined(__FreeBSD__)
|
||||
(void) name;
|
||||
return (B_TRUE);
|
||||
#else
|
||||
return (zfs_mod_supported(ZFS_SYSFS_POOL_FEATURES, name));
|
||||
|
@ -723,18 +723,6 @@ zfs_name_to_prop(const char *propname)
|
||||
return (zprop_name_to_prop(propname, ZFS_TYPE_DATASET));
|
||||
}
|
||||
|
||||
/*
|
||||
* For user property names, we allow all lowercase alphanumeric characters, plus
|
||||
* a few useful punctuation characters.
|
||||
*/
|
||||
static int
|
||||
valid_char(char c)
|
||||
{
|
||||
return ((c >= 'a' && c <= 'z') ||
|
||||
(c >= '0' && c <= '9') ||
|
||||
c == '-' || c == '_' || c == '.' || c == ':');
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns true if this is a valid user-defined property (one with a ':').
|
||||
*/
|
||||
@ -747,7 +735,7 @@ zfs_prop_user(const char *name)
|
||||
|
||||
for (i = 0; i < strlen(name); i++) {
|
||||
c = name[i];
|
||||
if (!valid_char(c))
|
||||
if (!zprop_valid_char(c))
|
||||
return (B_FALSE);
|
||||
if (c == ':')
|
||||
foundsep = B_TRUE;
|
||||
|
@ -23,6 +23,7 @@
|
||||
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2012, 2018 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2021, Colm Buckley <colm@tuatha.org>
|
||||
* Copyright (c) 2021, Klara Inc.
|
||||
*/
|
||||
|
||||
#include <sys/zio.h>
|
||||
@ -40,6 +41,7 @@
|
||||
#endif
|
||||
|
||||
static zprop_desc_t zpool_prop_table[ZPOOL_NUM_PROPS];
|
||||
static zprop_desc_t vdev_prop_table[VDEV_NUM_PROPS];
|
||||
|
||||
zprop_desc_t *
|
||||
zpool_prop_get_table(void)
|
||||
@ -260,12 +262,249 @@ zpool_prop_align_right(zpool_prop_t prop)
|
||||
}
|
||||
#endif
|
||||
|
||||
zprop_desc_t *
|
||||
vdev_prop_get_table(void)
|
||||
{
|
||||
return (vdev_prop_table);
|
||||
}
|
||||
|
||||
void
|
||||
vdev_prop_init(void)
|
||||
{
|
||||
static zprop_index_t boolean_table[] = {
|
||||
{ "off", 0},
|
||||
{ "on", 1},
|
||||
{ NULL }
|
||||
};
|
||||
static zprop_index_t boolean_na_table[] = {
|
||||
{ "off", 0},
|
||||
{ "on", 1},
|
||||
{ "-", 2}, /* ZPROP_BOOLEAN_NA */
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
/* string properties */
|
||||
zprop_register_string(VDEV_PROP_COMMENT, "comment", NULL,
|
||||
PROP_DEFAULT, ZFS_TYPE_VDEV, "<comment-string>", "COMMENT");
|
||||
zprop_register_string(VDEV_PROP_PATH, "path", NULL,
|
||||
PROP_DEFAULT, ZFS_TYPE_VDEV, "<device-path>", "PATH");
|
||||
zprop_register_string(VDEV_PROP_DEVID, "devid", NULL,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<devid>", "DEVID");
|
||||
zprop_register_string(VDEV_PROP_PHYS_PATH, "physpath", NULL,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<physpath>", "PHYSPATH");
|
||||
zprop_register_string(VDEV_PROP_ENC_PATH, "encpath", NULL,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<encpath>", "ENCPATH");
|
||||
zprop_register_string(VDEV_PROP_FRU, "fru", NULL,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<fru>", "FRU");
|
||||
zprop_register_string(VDEV_PROP_PARENT, "parent", NULL,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<parent>", "PARENT");
|
||||
zprop_register_string(VDEV_PROP_CHILDREN, "children", NULL,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<child[,...]>", "CHILDREN");
|
||||
|
||||
/* readonly number properties */
|
||||
zprop_register_number(VDEV_PROP_SIZE, "size", 0, PROP_READONLY,
|
||||
ZFS_TYPE_VDEV, "<size>", "SIZE");
|
||||
zprop_register_number(VDEV_PROP_FREE, "free", 0, PROP_READONLY,
|
||||
ZFS_TYPE_VDEV, "<size>", "FREE");
|
||||
zprop_register_number(VDEV_PROP_ALLOCATED, "allocated", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<size>", "ALLOC");
|
||||
zprop_register_number(VDEV_PROP_EXPANDSZ, "expandsize", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<size>", "EXPANDSZ");
|
||||
zprop_register_number(VDEV_PROP_FRAGMENTATION, "fragmentation", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<percent>", "FRAG");
|
||||
zprop_register_number(VDEV_PROP_CAPACITY, "capacity", 0, PROP_READONLY,
|
||||
ZFS_TYPE_VDEV, "<size>", "CAP");
|
||||
zprop_register_number(VDEV_PROP_GUID, "guid", 0, PROP_READONLY,
|
||||
ZFS_TYPE_VDEV, "<guid>", "GUID");
|
||||
zprop_register_number(VDEV_PROP_STATE, "state", 0, PROP_READONLY,
|
||||
ZFS_TYPE_VDEV, "<state>", "STATE");
|
||||
zprop_register_number(VDEV_PROP_BOOTSIZE, "bootsize", 0, PROP_READONLY,
|
||||
ZFS_TYPE_VDEV, "<size>", "BOOTSIZE");
|
||||
zprop_register_number(VDEV_PROP_ASIZE, "asize", 0, PROP_READONLY,
|
||||
ZFS_TYPE_VDEV, "<asize>", "ASIZE");
|
||||
zprop_register_number(VDEV_PROP_PSIZE, "psize", 0, PROP_READONLY,
|
||||
ZFS_TYPE_VDEV, "<psize>", "PSIZE");
|
||||
zprop_register_number(VDEV_PROP_ASHIFT, "ashift", 0, PROP_READONLY,
|
||||
ZFS_TYPE_VDEV, "<ashift>", "ASHIFT");
|
||||
zprop_register_number(VDEV_PROP_PARITY, "parity", 0, PROP_READONLY,
|
||||
ZFS_TYPE_VDEV, "<parity>", "PARITY");
|
||||
zprop_register_number(VDEV_PROP_NUMCHILDREN, "numchildren", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<number-of-children>", "NUMCHILD");
|
||||
zprop_register_number(VDEV_PROP_READ_ERRORS, "read_errors", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "RDERR");
|
||||
zprop_register_number(VDEV_PROP_WRITE_ERRORS, "write_errors", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "WRERR");
|
||||
zprop_register_number(VDEV_PROP_CHECKSUM_ERRORS, "checksum_errors", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "CKERR");
|
||||
zprop_register_number(VDEV_PROP_INITIALIZE_ERRORS,
|
||||
"initialize_errors", 0, PROP_READONLY, ZFS_TYPE_VDEV, "<errors>",
|
||||
"INITERR");
|
||||
zprop_register_number(VDEV_PROP_OPS_NULL, "null_ops", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "NULLOP");
|
||||
zprop_register_number(VDEV_PROP_OPS_READ, "read_ops", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "READOP");
|
||||
zprop_register_number(VDEV_PROP_OPS_WRITE, "write_ops", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "WRITEOP");
|
||||
zprop_register_number(VDEV_PROP_OPS_FREE, "free_ops", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "FREEOP");
|
||||
zprop_register_number(VDEV_PROP_OPS_CLAIM, "claim_ops", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "CLAIMOP");
|
||||
zprop_register_number(VDEV_PROP_OPS_TRIM, "trim_ops", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "TRIMOP");
|
||||
zprop_register_number(VDEV_PROP_BYTES_NULL, "null_bytes", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "NULLBYTE");
|
||||
zprop_register_number(VDEV_PROP_BYTES_READ, "read_bytes", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "READBYTE");
|
||||
zprop_register_number(VDEV_PROP_BYTES_WRITE, "write_bytes", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "WRITEBYTE");
|
||||
zprop_register_number(VDEV_PROP_BYTES_FREE, "free_bytes", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "FREEBYTE");
|
||||
zprop_register_number(VDEV_PROP_BYTES_CLAIM, "claim_bytes", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "CLAIMBYTE");
|
||||
zprop_register_number(VDEV_PROP_BYTES_TRIM, "trim_bytes", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "TRIMBYTE");
|
||||
|
||||
/* default numeric properties */
|
||||
|
||||
/* default index (boolean) properties */
|
||||
zprop_register_index(VDEV_PROP_REMOVING, "removing", 0,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "on | off", "REMOVING",
|
||||
boolean_table);
|
||||
zprop_register_index(VDEV_PROP_ALLOCATING, "allocating", 1,
|
||||
PROP_DEFAULT, ZFS_TYPE_VDEV, "on | off", "ALLOCATING",
|
||||
boolean_na_table);
|
||||
|
||||
/* default index properties */
|
||||
|
||||
/* hidden properties */
|
||||
zprop_register_hidden(VDEV_PROP_NAME, "name", PROP_TYPE_STRING,
|
||||
PROP_READONLY, ZFS_TYPE_VDEV, "NAME");
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a property name and its type, returns the corresponding property ID.
|
||||
*/
|
||||
vdev_prop_t
|
||||
vdev_name_to_prop(const char *propname)
|
||||
{
|
||||
return (zprop_name_to_prop(propname, ZFS_TYPE_VDEV));
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns true if this is a valid user-defined property (one with a ':').
|
||||
*/
|
||||
boolean_t
|
||||
vdev_prop_user(const char *name)
|
||||
{
|
||||
int i;
|
||||
char c;
|
||||
boolean_t foundsep = B_FALSE;
|
||||
|
||||
for (i = 0; i < strlen(name); i++) {
|
||||
c = name[i];
|
||||
if (!zprop_valid_char(c))
|
||||
return (B_FALSE);
|
||||
if (c == ':')
|
||||
foundsep = B_TRUE;
|
||||
}
|
||||
|
||||
return (foundsep);
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a pool property ID, returns the corresponding name.
|
||||
* Assuming the pool property ID is valid.
|
||||
*/
|
||||
const char *
|
||||
vdev_prop_to_name(vdev_prop_t prop)
|
||||
{
|
||||
return (vdev_prop_table[prop].pd_name);
|
||||
}
|
||||
|
||||
zprop_type_t
|
||||
vdev_prop_get_type(vdev_prop_t prop)
|
||||
{
|
||||
return (vdev_prop_table[prop].pd_proptype);
|
||||
}
|
||||
|
||||
boolean_t
|
||||
vdev_prop_readonly(vdev_prop_t prop)
|
||||
{
|
||||
return (vdev_prop_table[prop].pd_attr == PROP_READONLY);
|
||||
}
|
||||
|
||||
const char *
|
||||
vdev_prop_default_string(vdev_prop_t prop)
|
||||
{
|
||||
return (vdev_prop_table[prop].pd_strdefault);
|
||||
}
|
||||
|
||||
uint64_t
|
||||
vdev_prop_default_numeric(vdev_prop_t prop)
|
||||
{
|
||||
return (vdev_prop_table[prop].pd_numdefault);
|
||||
}
|
||||
|
||||
int
|
||||
vdev_prop_string_to_index(vdev_prop_t prop, const char *string,
|
||||
uint64_t *index)
|
||||
{
|
||||
return (zprop_string_to_index(prop, string, index, ZFS_TYPE_VDEV));
|
||||
}
|
||||
|
||||
int
|
||||
vdev_prop_index_to_string(vdev_prop_t prop, uint64_t index,
|
||||
const char **string)
|
||||
{
|
||||
return (zprop_index_to_string(prop, index, string, ZFS_TYPE_VDEV));
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns true if this is a valid vdev property.
|
||||
*/
|
||||
boolean_t
|
||||
zpool_prop_vdev(const char *name)
|
||||
{
|
||||
return (vdev_name_to_prop(name) != VDEV_PROP_INVAL);
|
||||
}
|
||||
|
||||
uint64_t
|
||||
vdev_prop_random_value(vdev_prop_t prop, uint64_t seed)
|
||||
{
|
||||
return (zprop_random_value(prop, seed, ZFS_TYPE_VDEV));
|
||||
}
|
||||
|
||||
#ifndef _KERNEL
|
||||
const char *
|
||||
vdev_prop_values(vdev_prop_t prop)
|
||||
{
|
||||
return (vdev_prop_table[prop].pd_values);
|
||||
}
|
||||
|
||||
const char *
|
||||
vdev_prop_column_name(vdev_prop_t prop)
|
||||
{
|
||||
return (vdev_prop_table[prop].pd_colname);
|
||||
}
|
||||
|
||||
boolean_t
|
||||
vdev_prop_align_right(vdev_prop_t prop)
|
||||
{
|
||||
return (vdev_prop_table[prop].pd_rightalign);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(_KERNEL)
|
||||
/* zpool property functions */
|
||||
EXPORT_SYMBOL(zpool_prop_init);
|
||||
EXPORT_SYMBOL(zpool_prop_get_type);
|
||||
EXPORT_SYMBOL(zpool_prop_get_table);
|
||||
|
||||
/* vdev property functions */
|
||||
EXPORT_SYMBOL(vdev_prop_init);
|
||||
EXPORT_SYMBOL(vdev_prop_get_type);
|
||||
EXPORT_SYMBOL(vdev_prop_get_table);
|
||||
|
||||
/* Pool property functions shared between libzfs and kernel. */
|
||||
EXPORT_SYMBOL(zpool_name_to_prop);
|
||||
EXPORT_SYMBOL(zpool_prop_to_name);
|
||||
@ -276,4 +515,15 @@ EXPORT_SYMBOL(zpool_prop_feature);
|
||||
EXPORT_SYMBOL(zpool_prop_unsupported);
|
||||
EXPORT_SYMBOL(zpool_prop_index_to_string);
|
||||
EXPORT_SYMBOL(zpool_prop_string_to_index);
|
||||
EXPORT_SYMBOL(zpool_prop_vdev);
|
||||
|
||||
/* vdev property functions shared between libzfs and kernel. */
|
||||
EXPORT_SYMBOL(vdev_name_to_prop);
|
||||
EXPORT_SYMBOL(vdev_prop_user);
|
||||
EXPORT_SYMBOL(vdev_prop_to_name);
|
||||
EXPORT_SYMBOL(vdev_prop_default_string);
|
||||
EXPORT_SYMBOL(vdev_prop_default_numeric);
|
||||
EXPORT_SYMBOL(vdev_prop_readonly);
|
||||
EXPORT_SYMBOL(vdev_prop_index_to_string);
|
||||
EXPORT_SYMBOL(vdev_prop_string_to_index);
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user