diff options
| author | Dan McDonald <danmcd@mnx.io> | 2022-08-14 10:56:57 -0400 |
|---|---|---|
| committer | Dan McDonald <danmcd@mnx.io> | 2022-08-14 10:56:57 -0400 |
| commit | efad77c95d2ca5a22a626a8d732e9e206919c0fb (patch) | |
| tree | 96717dd35d86c11f9a2cb67e56b0f5118acd0b84 /usr/src/lib | |
| parent | 8edaf2d79d344fa9c1acb35f317dedd5005871a7 (diff) | |
| parent | ee6ee36a8ff1701c4e61e6f118446b145220478c (diff) | |
| download | illumos-joyent-efad77c95d2ca5a22a626a8d732e9e206919c0fb.tar.gz | |
[illumos-gate merge]
commit ee6ee36a8ff1701c4e61e6f118446b145220478c
14838 Rename erratum 147 handling
14839 Untangle erratum 147 from lockstat
14840 Modernize lockstat probes
14865 mutex_tryenter:adaptive-acquire probe never fires
commit 64439ec0071c576648f76b4466ad6ee7a580ed33
14579 expose virtio 9P transport device
commit ec8422d0a51b3bf0b6550dd15f125990a3f73f4c
7346 beadm list shows duplicates when zone has datasets from multiple pools
commit 46dc144bc2859392d4c62f3e72d661e7b3c22a8e
14900 ddi_fm_capable(9F) man page does not match source
Conflicts:
manifest
usr/src/man/man9f/ddi_fm_init.9f
usr/src/uts/intel/os/driver_aliases
usr/src/uts/intel/os/name_to_major
Diffstat (limited to 'usr/src/lib')
| -rw-r--r-- | usr/src/lib/libbe/common/be_activate.c | 27 | ||||
| -rw-r--r-- | usr/src/lib/libbe/common/be_create.c | 157 | ||||
| -rw-r--r-- | usr/src/lib/libbe/common/be_list.c | 17 | ||||
| -rw-r--r-- | usr/src/lib/libbe/common/be_mount.c | 25 | ||||
| -rw-r--r-- | usr/src/lib/libbe/common/be_rename.c | 24 | ||||
| -rw-r--r-- | usr/src/lib/libbe/common/be_snapshot.c | 29 | ||||
| -rw-r--r-- | usr/src/lib/libbe/common/be_utils.c | 144 | ||||
| -rw-r--r-- | usr/src/lib/libbe/common/be_zones.c | 27 | ||||
| -rw-r--r-- | usr/src/lib/libbe/common/libbe_priv.h | 8 |
9 files changed, 318 insertions, 140 deletions
diff --git a/usr/src/lib/libbe/common/be_activate.c b/usr/src/lib/libbe/common/be_activate.c index 4ec8f055e2..581ddc41c2 100644 --- a/usr/src/lib/libbe/common/be_activate.c +++ b/usr/src/lib/libbe/common/be_activate.c @@ -26,7 +26,7 @@ /* * Copyright 2015 Nexenta Systems, Inc. All rights reserved. * Copyright 2016 Toomas Soome <tsoome@me.com> - * Copyright 2020 OmniOS Community Edition (OmniOSce) Association. + * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. */ #include <assert.h> @@ -266,7 +266,12 @@ _be_activate(char *be_name, be_nextboot_state_t nextboot) return (ret); } - be_make_root_ds(cb.obe_zpool, cb.obe_name, root_ds, sizeof (root_ds)); + if ((ret = be_make_root_ds(cb.obe_zpool, cb.obe_name, root_ds, + sizeof (root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, cb.obe_zpool, cb.obe_name); + return (ret); + } cb.obe_root_ds = strdup(root_ds); if (getzoneid() == GLOBAL_ZONEID) { @@ -573,8 +578,13 @@ set_canmount(be_node_list_t *be_nodes, char *value) while (list != NULL) { be_dataset_list_t *datasets = list->be_node_datasets; - be_make_root_ds(list->be_rpool, list->be_node_name, ds_path, - sizeof (ds_path)); + if ((err = be_make_root_ds(list->be_rpool, list->be_node_name, + ds_path, sizeof (ds_path))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container " + "dataset for %s/%s\n"), __func__, + list->be_rpool, list->be_node_name); + return (err); + } if ((zhp = zfs_open(g_zfs, ds_path, ZFS_TYPE_DATASET)) == NULL) { @@ -605,9 +615,14 @@ set_canmount(be_node_list_t *be_nodes, char *value) ZFS_CLOSE(zhp); while (datasets != NULL) { - be_make_root_ds(list->be_rpool, + if ((err = be_make_root_ds(list->be_rpool, datasets->be_dataset_name, ds_path, - sizeof (ds_path)); + sizeof (ds_path))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE " + "container dataset for %s/%s\n"), __func__, + list->be_rpool, datasets->be_dataset_name); + return (err); + } if ((zhp = zfs_open(g_zfs, ds_path, ZFS_TYPE_DATASET)) == NULL) { diff --git a/usr/src/lib/libbe/common/be_create.c b/usr/src/lib/libbe/common/be_create.c index 4158ddb677..62f5bfe112 100644 --- a/usr/src/lib/libbe/common/be_create.c +++ b/usr/src/lib/libbe/common/be_create.c @@ -24,7 +24,7 @@ * Copyright 2013 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2014, 2015 by Delphix. All rights reserved. * Copyright (c) 2016 Martin Matuska. All rights reserved. - * Copyright 2021 OmniOS Community Edition (OmniOSce) Association. + * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. */ /* @@ -206,8 +206,12 @@ be_init(nvlist_t *be_attrs) } /* Generate string for BE's root dataset */ - be_make_root_ds(bt.nbe_zpool, bt.nbe_name, nbe_root_ds, - sizeof (nbe_root_ds)); + if ((ret = be_make_root_ds(bt.nbe_zpool, bt.nbe_name, nbe_root_ds, + sizeof (nbe_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, bt.nbe_zpool, bt.nbe_name); + return (ret); + } /* * Create property list for new BE root dataset. If some @@ -446,8 +450,12 @@ be_destroy(nvlist_t *be_attrs) } /* Generate string for obe_name's root dataset */ - be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds, - sizeof (obe_root_ds)); + if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds, + sizeof (obe_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name); + return (ret); + } bt.obe_root_ds = obe_root_ds; if (getzoneid() != GLOBAL_ZONEID) { @@ -780,10 +788,28 @@ be_copy(nvlist_t *be_attrs) } /* + * If an auto named BE is desired, it must be in the same + * pool as the original BE. + */ + if (bt.nbe_name == NULL && bt.nbe_zpool != NULL) { + be_print_err(gettext("be_copy: cannot specify pool " + "name when creating an auto named BE\n")); + ret = BE_ERR_INVAL; + goto done; + } + + /* + * If the zpool name to create new BE in is not provided, + * create the new BE in the original BE's pool. + */ + if (bt.nbe_zpool == NULL) + bt.nbe_zpool = bt.obe_zpool; + + /* * If new BE name provided, validate the BE name and then verify * that new BE name doesn't already exist in some pool. */ - if (bt.nbe_name) { + if (bt.nbe_name != NULL) { /* Validate original BE name */ if (!be_valid_be_name(bt.nbe_name)) { be_print_err(gettext("be_copy: " @@ -808,8 +834,13 @@ be_copy(nvlist_t *be_attrs) goto done; } } else { - be_make_root_ds(bt.nbe_zpool, bt.nbe_name, nbe_root_ds, - sizeof (nbe_root_ds)); + if ((ret = be_make_root_ds(bt.nbe_zpool, bt.nbe_name, + nbe_root_ds, sizeof (nbe_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE " + "container dataset for %s/%s\n"), __func__, + bt.nbe_zpool, bt.nbe_name); + goto done; + } if (zfs_dataset_exists(g_zfs, nbe_root_ds, ZFS_TYPE_FILESYSTEM)) { be_print_err(gettext("be_copy: BE (%s) already " @@ -820,17 +851,6 @@ be_copy(nvlist_t *be_attrs) } } else { /* - * If an auto named BE is desired, it must be in the same - * pool is the original BE. - */ - if (bt.nbe_zpool != NULL) { - be_print_err(gettext("be_copy: cannot specify pool " - "name when creating an auto named BE\n")); - ret = BE_ERR_INVAL; - goto done; - } - - /* * Generate auto named BE */ if ((bt.nbe_name = be_auto_be_name(bt.obe_name)) @@ -844,19 +864,19 @@ be_copy(nvlist_t *be_attrs) autoname = B_TRUE; } - /* - * If zpool name to create new BE in is not provided, - * create new BE in original BE's pool. - */ - if (bt.nbe_zpool == NULL) { - bt.nbe_zpool = bt.obe_zpool; - } - /* Get root dataset names for obe_name and nbe_name */ - be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds, - sizeof (obe_root_ds)); - be_make_root_ds(bt.nbe_zpool, bt.nbe_name, nbe_root_ds, - sizeof (nbe_root_ds)); + if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds, + sizeof (obe_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name); + goto done; + } + if ((ret = be_make_root_ds(bt.nbe_zpool, bt.nbe_name, nbe_root_ds, + sizeof (nbe_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, bt.nbe_zpool, bt.nbe_name); + goto done; + } bt.obe_root_ds = obe_root_ds; bt.nbe_root_ds = nbe_root_ds; @@ -966,8 +986,15 @@ be_copy(nvlist_t *be_attrs) * Regenerate string for new BE's * root dataset name */ - be_make_root_ds(bt.nbe_zpool, bt.nbe_name, - nbe_root_ds, sizeof (nbe_root_ds)); + if ((ret = be_make_root_ds(bt.nbe_zpool, + bt.nbe_name, nbe_root_ds, + sizeof (nbe_root_ds))) != BE_SUCCESS) { + be_print_err(gettext( + "%s: failed to get BE container " + "dataset for %s/%s\n"), __func__, + bt.nbe_zpool, bt.nbe_name); + goto done; + } bt.nbe_root_ds = nbe_root_ds; /* @@ -1122,10 +1149,18 @@ be_copy(nvlist_t *be_attrs) * Update new BE's vfstab. */ - be_make_root_container_ds(bt.obe_zpool, obe_root_container, - sizeof (obe_root_container)); - be_make_root_container_ds(bt.nbe_zpool, nbe_root_container, - sizeof (nbe_root_container)); + if ((ret = be_make_root_container_ds(bt.obe_zpool, obe_root_container, + sizeof (obe_root_container))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s\n"), __func__, bt.obe_zpool); + goto done; + } + if ((ret = be_make_root_container_ds(bt.nbe_zpool, nbe_root_container, + sizeof (nbe_root_container))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s\n"), __func__, bt.nbe_zpool); + goto done; + } if ((ret = be_update_vfstab(bt.nbe_name, obe_root_container, nbe_root_container, &fld, new_mp)) != BE_SUCCESS) { @@ -1258,11 +1293,15 @@ be_find_zpool_callback(zpool_handle_t *zlp, void *data) be_transaction_data_t *bt = data; const char *zpool = zpool_get_name(zlp); char be_root_ds[MAXPATHLEN]; + int ret = 0; /* * Generate string for the BE's root dataset */ - be_make_root_ds(zpool, bt->obe_name, be_root_ds, sizeof (be_root_ds)); + if (be_make_root_ds(zpool, bt->obe_name, be_root_ds, + sizeof (be_root_ds)) != BE_SUCCESS) { + goto out; + } /* * Check if dataset exists @@ -1270,12 +1309,12 @@ be_find_zpool_callback(zpool_handle_t *zlp, void *data) if (zfs_dataset_exists(g_zfs, be_root_ds, ZFS_TYPE_FILESYSTEM)) { /* BE's root dataset exists in zpool */ bt->obe_zpool = strdup(zpool); - zpool_close(zlp); - return (1); + ret = 1; } +out: zpool_close(zlp); - return (0); + return (ret); } /* @@ -1297,23 +1336,27 @@ be_exists_callback(zpool_handle_t *zlp, void *data) const char *zpool = zpool_get_name(zlp); char *be_name = data; char be_root_ds[MAXPATHLEN]; + int ret = 0; /* * Generate string for the BE's root dataset */ - be_make_root_ds(zpool, be_name, be_root_ds, sizeof (be_root_ds)); + if (be_make_root_ds(zpool, be_name, be_root_ds, + sizeof (be_root_ds)) != BE_SUCCESS) { + goto out; + } /* * Check if dataset exists */ if (zfs_dataset_exists(g_zfs, be_root_ds, ZFS_TYPE_FILESYSTEM)) { /* BE's root dataset exists in zpool */ - zpool_close(zlp); - return (1); + ret = 1; } +out: zpool_close(zlp); - return (0); + return (ret); } /* @@ -1779,8 +1822,12 @@ be_destroy_zone_roots(char *zonepath_ds, be_destroy_data_t *dd) int ret = BE_SUCCESS; /* Generate string for the root container dataset for this zone. */ - be_make_container_ds(zonepath_ds, zone_container_ds, - sizeof (zone_container_ds)); + if ((ret = be_make_container_ds(zonepath_ds, zone_container_ds, + sizeof (zone_container_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s\n"), __func__, zonepath_ds); + return (ret); + } /* Get handle to this zone's root container dataset. */ if ((zhp = zfs_open(g_zfs, zone_container_ds, ZFS_TYPE_FILESYSTEM)) @@ -2049,8 +2096,12 @@ be_copy_zones(char *obe_name, char *obe_root_ds, char *nbe_root_ds) goto done; } - be_make_container_ds(zonepath_ds, zone_container_ds, - sizeof (zone_container_ds)); + if ((ret = be_make_container_ds(zonepath_ds, zone_container_ds, + sizeof (zone_container_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container " + "dataset for %s\n"), __func__, zonepath_ds); + goto done; + } if ((z_zhp = zfs_open(g_zfs, zoneroot_ds, ZFS_TYPE_FILESYSTEM)) == NULL) { @@ -2901,8 +2952,12 @@ be_create_container_ds(char *zpool) char be_container_ds[MAXPATHLEN]; /* Generate string for BE container dataset for this pool */ - be_make_container_ds(zpool, be_container_ds, - sizeof (be_container_ds)); + if (be_make_container_ds(zpool, be_container_ds, + sizeof (be_container_ds)) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s\n"), __func__, zpool); + return (B_FALSE); + } if (!zfs_dataset_exists(g_zfs, be_container_ds, ZFS_TYPE_FILESYSTEM)) { diff --git a/usr/src/lib/libbe/common/be_list.c b/usr/src/lib/libbe/common/be_list.c index 3e0833ea83..85b62eff38 100644 --- a/usr/src/lib/libbe/common/be_list.c +++ b/usr/src/lib/libbe/common/be_list.c @@ -29,7 +29,7 @@ * Copyright 2015 Toomas Soome <tsoome@me.com> * Copyright 2015 Gary Mills * Copyright (c) 2016 Martin Matuska. All rights reserved. - * Copyright 2018 OmniOS Community Edition (OmniOSce) Association. + * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. */ #include <assert.h> @@ -445,8 +445,12 @@ be_get_list_callback(zpool_handle_t *zlp, void *data) /* * Generate string for the BE container dataset */ - be_make_container_ds(rpool, be_container_ds, - sizeof (be_container_ds)); + if (be_make_container_ds(rpool, be_container_ds, + sizeof (be_container_ds)) != BE_SUCCESS) { + /* Move on to the next pool */ + zpool_close(zlp); + return (0); + } /* * If a BE name was specified we use it's root dataset in place of @@ -454,12 +458,17 @@ be_get_list_callback(zpool_handle_t *zlp, void *data) * the information for the specified BE. */ if (cb->be_name != NULL) { + int rv; + if (!be_valid_be_name(cb->be_name)) return (BE_ERR_INVAL); /* * Generate string for the BE root dataset */ - be_make_root_ds(rpool, cb->be_name, be_ds, sizeof (be_ds)); + if ((rv = be_make_root_ds(rpool, cb->be_name, be_ds, + sizeof (be_ds))) != BE_SUCCESS) { + return (rv); + } open_ds = be_ds; } else { open_ds = be_container_ds; diff --git a/usr/src/lib/libbe/common/be_mount.c b/usr/src/lib/libbe/common/be_mount.c index 98c861fca4..672424d1f2 100644 --- a/usr/src/lib/libbe/common/be_mount.c +++ b/usr/src/lib/libbe/common/be_mount.c @@ -24,6 +24,7 @@ * Copyright 2013 Nexenta Systems, Inc. All rights reserved. * Copyright 2015 EveryCity Ltd. * Copyright (c) 2015 by Delphix. All rights reserved. + * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. */ /* @@ -277,8 +278,12 @@ _be_mount(char *be_name, char **altroot, int flags) } /* Generate string for obe_name's root dataset */ - be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds, - sizeof (obe_root_ds)); + if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds, + sizeof (obe_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name); + return (ret); + } bt.obe_root_ds = obe_root_ds; /* Get handle to BE's root dataset */ @@ -448,8 +453,12 @@ _be_unmount(char *be_name, int flags) } /* Generate string for obe_name's root dataset */ - be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds, - sizeof (obe_root_ds)); + if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds, + sizeof (obe_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name); + return (ret); + } bt.obe_root_ds = obe_root_ds; /* Get handle to BE's root dataset */ @@ -1565,15 +1574,13 @@ iter_shared_fs_callback(zfs_handle_t *zhp, void *data) pool = strtok(tmp_name, "/"); if (pool) { - /* Get the name of this pool's container dataset */ - be_make_container_ds(pool, container_ds, - sizeof (container_ds)); - /* * If what we're processing is this pool's BE container * dataset, skip it. */ - if (strcmp(name, container_ds) == 0) { + if (be_make_container_ds(pool, container_ds, + sizeof (container_ds)) == BE_SUCCESS && + strcmp(name, container_ds) == 0) { ZFS_CLOSE(zhp); return (0); } diff --git a/usr/src/lib/libbe/common/be_rename.c b/usr/src/lib/libbe/common/be_rename.c index f0cd781b22..87dadefaff 100644 --- a/usr/src/lib/libbe/common/be_rename.c +++ b/usr/src/lib/libbe/common/be_rename.c @@ -22,7 +22,7 @@ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012 by Delphix. All rights reserved. - * Copyright 2021 OmniOS Community Edition (OmniOSce) Association. + * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. */ #include <assert.h> @@ -150,9 +150,19 @@ be_rename(nvlist_t *be_attrs) /* New BE will reside in the same zpool as orig BE */ bt.nbe_zpool = bt.obe_zpool; - be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds, sizeof (root_ds)); + if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds, + sizeof (root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name); + goto done; + }; bt.obe_root_ds = strdup(root_ds); - be_make_root_ds(bt.nbe_zpool, bt.nbe_name, root_ds, sizeof (root_ds)); + if ((ret = be_make_root_ds(bt.nbe_zpool, bt.nbe_name, root_ds, + sizeof (root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, bt.nbe_zpool, bt.nbe_name); + goto done; + } bt.nbe_root_ds = strdup(root_ds); /* @@ -248,8 +258,12 @@ be_rename(nvlist_t *be_attrs) * Since the new and old BEs reside in the same pool (see above), * the same variable can be used for the container for both. */ - be_make_root_container_ds(bt.obe_zpool, be_root_container, - sizeof (be_root_container)); + if ((ret = be_make_root_container_ds(bt.obe_zpool, be_root_container, + sizeof (be_root_container))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s\n"), __func__, bt.obe_zpool); + goto done; + } if ((ret = be_update_vfstab(bt.nbe_name, be_root_container, be_root_container, &fld, mp)) != BE_SUCCESS) { diff --git a/usr/src/lib/libbe/common/be_snapshot.c b/usr/src/lib/libbe/common/be_snapshot.c index a4e2c79e5a..92fd2ae96d 100644 --- a/usr/src/lib/libbe/common/be_snapshot.c +++ b/usr/src/lib/libbe/common/be_snapshot.c @@ -25,6 +25,7 @@ /* * Copyright 2013 Nexenta Systems, Inc. All rights reserved. + * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. */ /* @@ -88,7 +89,7 @@ be_create_snapshot(nvlist_t *be_attrs) char *snap_name = NULL; char *policy = NULL; boolean_t autoname = B_FALSE; - int ret = BE_SUCCESS; + int ret = BE_SUCCESS; /* Initialize libzfs handle */ if (!be_zfs_init()) @@ -184,7 +185,7 @@ be_destroy_snapshot(nvlist_t *be_attrs) { char *be_name = NULL; char *snap_name = NULL; - int ret = BE_SUCCESS; + int ret = BE_SUCCESS; /* Initialize libzfs handle */ if (!be_zfs_init()) @@ -319,8 +320,12 @@ be_rollback(nvlist_t *be_attrs) } /* Generate string for BE's root dataset */ - be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds, - sizeof (obe_root_ds)); + if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds, + sizeof (obe_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name); + return (ret); + } bt.obe_root_ds = obe_root_ds; if (getzoneid() != GLOBAL_ZONEID) { @@ -434,8 +439,12 @@ _be_create_snapshot(char *be_name, char **snap_name, char *policy) return (zfs_err_to_be_err(g_zfs)); } - be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds, - sizeof (root_ds)); + if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds, + sizeof (root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name); + return (ret); + } bt.obe_root_ds = root_ds; if (getzoneid() != GLOBAL_ZONEID) { @@ -662,8 +671,12 @@ _be_destroy_snapshot(char *be_name, char *snap_name) return (zfs_err_to_be_err(g_zfs)); } - be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds, - sizeof (root_ds)); + if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds, + sizeof (root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name); + return (ret); + } bt.obe_root_ds = root_ds; zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_DATASET); diff --git a/usr/src/lib/libbe/common/be_utils.c b/usr/src/lib/libbe/common/be_utils.c index 17d43ee195..8b95f7bc91 100644 --- a/usr/src/lib/libbe/common/be_utils.c +++ b/usr/src/lib/libbe/common/be_utils.c @@ -24,7 +24,7 @@ * Copyright 2013 Nexenta Systems, Inc. All rights reserved. * Copyright 2016 Toomas Soome <tsoome@me.com> * Copyright (c) 2015 by Delphix. All rights reserved. - * Copyright 2019 OmniOS Community Edition (OmniOSce) Association. + * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. * Copyright (c) 2018, Joyent, Inc. */ @@ -439,17 +439,19 @@ be_get_defaults(struct be_defaults *defaults) * be_root_ds - pointer to buffer to return BE root dataset in. * be_root_ds_size - size of be_root_ds * Returns: - * None + * BE_SUCCESS - Success + * be_errno_t - Failure * Scope: * Semi-private (library wide use only) */ -void +int be_make_root_ds(const char *zpool, const char *be_name, char *be_root_ds, int be_root_ds_size) { struct be_defaults be_defaults; be_get_defaults(&be_defaults); - char *root_ds = NULL; + + assert(zpool != NULL); if (getzoneid() == GLOBAL_ZONEID) { if (be_defaults.be_deflt_rpool_container) { @@ -461,18 +463,30 @@ be_make_root_ds(const char *zpool, const char *be_name, char *be_root_ds, } } else { /* - * In non-global zone we can use path from mounted root dataset - * to generate BE's root dataset string. + * In a non-global zone we can use the path from the mounted + * root dataset to generate the BE's root dataset string. */ - if ((root_ds = be_get_ds_from_dir("/")) != NULL) { - (void) snprintf(be_root_ds, be_root_ds_size, "%s/%s", - dirname(root_ds), be_name); - } else { + char *root_ds = be_get_ds_from_dir("/"); + + if (root_ds == NULL) { be_print_err(gettext("be_make_root_ds: zone root " "dataset is not mounted\n")); - return; + return (BE_ERR_NOTMOUNTED); } + if (strncmp(root_ds, zpool, strlen(zpool)) != 0 || + root_ds[strlen(zpool)] != '/') { + /* + * This pool is not the one that contains the zone + * root. + */ + return (BE_ERR_ACCESS); + } + + (void) snprintf(be_root_ds, be_root_ds_size, "%s/%s", + dirname(root_ds), be_name); } + + return (BE_SUCCESS); } /* @@ -484,17 +498,17 @@ be_make_root_ds(const char *zpool, const char *be_name, char *be_root_ds, * dataset in. * container_ds_size - size of container_ds * Returns: - * None + * BE_SUCCESS - Success + * be_errno_t - Failure * Scope: * Semi-private (library wide use only) */ -void -be_make_container_ds(const char *zpool, char *container_ds, +int +be_make_container_ds(const char *zpool, char *container_ds, int container_ds_size) { struct be_defaults be_defaults; be_get_defaults(&be_defaults); - char *root_ds = NULL; if (getzoneid() == GLOBAL_ZONEID) { if (be_defaults.be_deflt_rpool_container) { @@ -505,15 +519,26 @@ be_make_container_ds(const char *zpool, char *container_ds, "%s/%s", zpool, BE_CONTAINER_DS_NAME); } } else { - if ((root_ds = be_get_ds_from_dir("/")) != NULL) { - (void) strlcpy(container_ds, dirname(root_ds), - container_ds_size); - } else { + char *root_ds = be_get_ds_from_dir("/"); + + if (root_ds == NULL) { be_print_err(gettext("be_make_container_ds: zone root " "dataset is not mounted\n")); - return; + return (BE_ERR_NOTMOUNTED); + } + if (strncmp(root_ds, zpool, strlen(zpool)) != 0 || + root_ds[strlen(zpool)] != '/') { + /* + * This pool is not the one that contains the zone + * root. + */ + return (BE_ERR_ACCESS); } + (void) strlcpy(container_ds, dirname(root_ds), + container_ds_size); } + + return (BE_SUCCESS); } /* @@ -525,17 +550,22 @@ be_make_container_ds(const char *zpool, char *container_ds, * container_ds - pointer to buffer in which to return result * container_ds_size - size of container_ds * Returns: - * None + * BE_SUCCESS - Success + * be_errno_t - Failure * Scope: * Semi-private (library wide use only) */ -void +int be_make_root_container_ds(const char *zpool, char *container_ds, int container_ds_size) { char *root; + int ret; - be_make_container_ds(zpool, container_ds, container_ds_size); + if ((ret = be_make_container_ds(zpool, container_ds, + container_ds_size)) != BE_SUCCESS) { + return (ret); + } /* If the container DS ends with /ROOT, remove it. */ @@ -543,6 +573,8 @@ be_make_root_container_ds(const char *zpool, char *container_ds, strcmp(root + 1, BE_CONTAINER_DS_NAME) == 0) { *root = '\0'; } + + return (BE_SUCCESS); } /* @@ -714,7 +746,12 @@ be_append_menu(char *be_name, char *be_root_pool, char *boot_pool, "%s%s", pool_mntpnt, BE_SPARC_MENU); } - be_make_root_ds(be_root_pool, be_name, be_root_ds, sizeof (be_root_ds)); + if ((ret = be_make_root_ds(be_root_pool, be_name, be_root_ds, + sizeof (be_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, be_root_pool, be_name); + goto cleanup; + } /* * Iterate through menu first to make sure the BE doesn't already @@ -969,7 +1006,12 @@ be_remove_menu(char *be_name, char *be_root_pool, char *boot_pool) boot_pool = be_root_pool; /* Get name of BE's root dataset */ - be_make_root_ds(be_root_pool, be_name, be_root_ds, sizeof (be_root_ds)); + if ((ret = be_make_root_ds(be_root_pool, be_name, be_root_ds, + sizeof (be_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, be_root_pool, be_name); + return (ret); + } /* Get handle to pool dataset */ if ((zhp = zfs_open(g_zfs, be_root_pool, ZFS_TYPE_DATASET)) == NULL) { @@ -1579,7 +1621,12 @@ be_change_grub_default(char *be_name, char *be_root_pool) } /* Generate string for BE's root dataset */ - be_make_root_ds(be_root_pool, be_name, be_root_ds, sizeof (be_root_ds)); + if ((ret = be_make_root_ds(be_root_pool, be_name, be_root_ds, + sizeof (be_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, be_root_pool, be_name); + return (ret); + } /* Get handle to pool dataset */ if ((zhp = zfs_open(g_zfs, be_root_pool, ZFS_TYPE_DATASET)) == NULL) { @@ -1848,10 +1895,18 @@ be_update_menu(char *be_orig_name, char *be_new_name, char *be_root_pool, "%s%s", pool_mntpnt, BE_SPARC_MENU); } - be_make_root_ds(be_root_pool, be_orig_name, be_root_ds, - sizeof (be_root_ds)); - be_make_root_ds(be_root_pool, be_new_name, be_new_root_ds, - sizeof (be_new_root_ds)); + if ((ret = be_make_root_ds(be_root_pool, be_orig_name, be_root_ds, + sizeof (be_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, be_root_pool, be_orig_name); + goto cleanup; + } + if ((ret = be_make_root_ds(be_root_pool, be_new_name, be_new_root_ds, + sizeof (be_new_root_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s/%s\n"), __func__, be_root_pool, be_new_name); + goto cleanup; + } if ((ret = be_open_menu(be_root_pool, menu_file, &menu_fp, "r", B_TRUE)) != BE_SUCCESS) { @@ -2714,24 +2769,14 @@ be_zpool_find_current_be_callback(zpool_handle_t *zlp, void *data) zfs_handle_t *zhp = NULL; const char *zpool = zpool_get_name(zlp); char be_container_ds[MAXPATHLEN]; - char *zpath = NULL; /* * Generate string for BE container dataset */ - if (getzoneid() != GLOBAL_ZONEID) { - if ((zpath = be_get_ds_from_dir("/")) != NULL) { - (void) strlcpy(be_container_ds, dirname(zpath), - sizeof (be_container_ds)); - } else { - be_print_err(gettext( - "be_zpool_find_current_be_callback: " - "zone root dataset is not mounted\n")); - return (0); - } - } else { - be_make_container_ds(zpool, be_container_ds, - sizeof (be_container_ds)); + if (be_make_container_ds(zpool, be_container_ds, + sizeof (be_container_ds)) != BE_SUCCESS) { + zpool_close(zlp); + return (0); } /* @@ -2865,7 +2910,10 @@ be_check_be_roots_callback(zpool_handle_t *zlp, void *data) char be_container_ds[MAXPATHLEN]; /* Generate string for this pool's BE root container dataset */ - be_make_container_ds(zpool, be_container_ds, sizeof (be_container_ds)); + if (be_make_container_ds(zpool, be_container_ds, + sizeof (be_container_ds)) != BE_SUCCESS) { + return (0); + } /* * If dataset lives under the BE root container dataset @@ -3420,6 +3468,7 @@ update_dataset(char *dataset, int dataset_len, char *be_name, { char *ds = NULL; char *sub_ds = NULL; + int ret; /* Tear off the BE container dataset */ if ((ds = be_make_name_from_ds(dataset, old_rc_loc)) == NULL) { @@ -3430,7 +3479,10 @@ update_dataset(char *dataset, int dataset_len, char *be_name, sub_ds = strchr(ds, '/'); /* Generate the BE root dataset name */ - be_make_root_ds(new_rc_loc, be_name, dataset, dataset_len); + if ((ret = be_make_root_ds(new_rc_loc, be_name, dataset, + dataset_len)) != BE_SUCCESS) { + return (ret); + } /* If a subordinate dataset name was found, append it */ if (sub_ds != NULL) diff --git a/usr/src/lib/libbe/common/be_zones.c b/usr/src/lib/libbe/common/be_zones.c index e257b62125..665db1b1d0 100644 --- a/usr/src/lib/libbe/common/be_zones.c +++ b/usr/src/lib/libbe/common/be_zones.c @@ -25,6 +25,7 @@ /* * Copyright 2013 Nexenta Systems, Inc. All rights reserved. + * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. */ /* @@ -135,9 +136,13 @@ be_find_active_zone_root(zfs_handle_t *be_zhp, char *zonepath_ds, } } - /* Generate string for the root container dataset for this zone. */ - be_make_container_ds(zonepath_ds, zone_container_ds, - sizeof (zone_container_ds)); + /* Generate string for the root container dataset for this zone. */ + if ((ret = be_make_container_ds(zonepath_ds, zone_container_ds, + sizeof (zone_container_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s\n"), __func__, zonepath_ds); + return (ret); + } /* Get handle to this zone's root container dataset */ if ((zhp = zfs_open(g_zfs, zone_container_ds, ZFS_TYPE_FILESYSTEM)) @@ -205,8 +210,12 @@ be_find_mounted_zone_root(char *zone_altroot, char *zonepath_ds, int zret = 0; /* Generate string for the root container dataset for this zone. */ - be_make_container_ds(zonepath_ds, zone_container_ds, - sizeof (zone_container_ds)); + if ((ret = be_make_container_ds(zonepath_ds, zone_container_ds, + sizeof (zone_container_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s\n"), __func__, zonepath_ds); + return (ret); + } /* Get handle to this zone's root container dataset. */ if ((zhp = zfs_open(g_zfs, zone_container_ds, ZFS_TYPE_FILESYSTEM)) @@ -293,8 +302,12 @@ be_zone_supported(char *zonepath_ds) * Make sure the zonepath has a zone root container dataset * underneath it. */ - be_make_container_ds(zonepath_ds, zone_container_ds, - sizeof (zone_container_ds)); + if ((ret = be_make_container_ds(zonepath_ds, zone_container_ds, + sizeof (zone_container_ds))) != BE_SUCCESS) { + be_print_err(gettext("%s: failed to get BE container dataset " + "for %s\n"), __func__, zonepath_ds); + return (B_FALSE); + } if (!zfs_dataset_exists(g_zfs, zone_container_ds, ZFS_TYPE_FILESYSTEM)) { diff --git a/usr/src/lib/libbe/common/libbe_priv.h b/usr/src/lib/libbe/common/libbe_priv.h index ace201577f..dd73e33bb1 100644 --- a/usr/src/lib/libbe/common/libbe_priv.h +++ b/usr/src/lib/libbe/common/libbe_priv.h @@ -24,7 +24,7 @@ * Copyright 2013 Nexenta Systems, Inc. All rights reserved. * Copyright 2016 Toomas Soome <tsoome@me.com> * Copyright (c) 2015 by Delphix. All rights reserved. - * Copyright 2019 OmniOS Community Edition (OmniOSce) Association. + * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. */ #ifndef _LIBBE_PRIV_H @@ -179,9 +179,9 @@ int _be_destroy_snapshot(char *, char *); /* be_utils.c */ boolean_t be_zfs_init(void); void be_zfs_fini(void); -void be_make_root_ds(const char *, const char *, char *, int); -void be_make_container_ds(const char *, char *, int); -void be_make_root_container_ds(const char *, char *, int); +int be_make_root_ds(const char *, const char *, char *, int); +int be_make_container_ds(const char *, char *, int); +int be_make_root_container_ds(const char *, char *, int); char *be_make_name_from_ds(const char *, char *); int be_append_menu(char *, char *, char *, char *, char *); int be_remove_menu(char *, char *, char *); |
