diff options
| author | Dan McDonald <danmcd@mnx.io> | 2022-11-09 10:35:53 -0500 |
|---|---|---|
| committer | Dan McDonald <danmcd@mnx.io> | 2022-11-09 10:35:53 -0500 |
| commit | 992f4d7cf022e01498ab4493736eebf80367e8e1 (patch) | |
| tree | 80c74f4bbab13568e80000236ef524e5c96c9f4c /usr/src/lib | |
| parent | 54ba424d2c1a5e03a731822c8173ea9b1761ef66 (diff) | |
| parent | db9597bf18e3b86bdb922182aa97f27a48f83858 (diff) | |
| download | illumos-joyent-992f4d7cf022e01498ab4493736eebf80367e8e1.tar.gz | |
[illumos-gate merge]
commit db9597bf18e3b86bdb922182aa97f27a48f83858
15152 ctfdump member output could be easider to decode
commit b4fb003914e70b41d96dec8011864f6af1faf3ef
14978 ZFS autoexpand property should work for root pools
commit 77c0a660417a046bfab6c8ef58d00c181c0264b3
15128 libnsl: variable is used uninitialized
commit 1bf21c92db6af5f8263977d8b99706f8ab9b3a27
15136 want unit test for bhyve dirty page tracking
Diffstat (limited to 'usr/src/lib')
| -rw-r--r-- | usr/src/lib/libnsl/ipsec/algs.c | 2 | ||||
| -rw-r--r-- | usr/src/lib/libnsl/rpc/clnt_generic.c | 88 | ||||
| -rw-r--r-- | usr/src/lib/libzfs/common/libzfs.h | 2 | ||||
| -rw-r--r-- | usr/src/lib/libzfs/common/libzfs_pool.c | 115 | ||||
| -rw-r--r-- | usr/src/lib/libzfs/common/mapfile-vers | 1 | ||||
| -rw-r--r-- | usr/src/lib/libzpool/Makefile.com | 2 |
6 files changed, 116 insertions, 94 deletions
diff --git a/usr/src/lib/libnsl/ipsec/algs.c b/usr/src/lib/libnsl/ipsec/algs.c index 6620f02cae..a20473a6da 100644 --- a/usr/src/lib/libnsl/ipsec/algs.c +++ b/usr/src/lib/libnsl/ipsec/algs.c @@ -591,7 +591,7 @@ void _build_internal_algs(ipsec_proto_t **alg_context, int *alg_nums) { FILE *f; - int rc, trash_num; + int rc, trash_num = 0; ipsec_proto_t *new_protos = NULL, *trash; time_t filetime; struct stat statbuf; diff --git a/usr/src/lib/libnsl/rpc/clnt_generic.c b/usr/src/lib/libnsl/rpc/clnt_generic.c index 34deeb1f2c..8801686a96 100644 --- a/usr/src/lib/libnsl/rpc/clnt_generic.c +++ b/usr/src/lib/libnsl/rpc/clnt_generic.c @@ -68,11 +68,11 @@ CLIENT *_clnt_tli_create_timed(int, const struct netconfig *, struct netbuf *, */ CLIENT * clnt_create_vers(const char *hostname, const rpcprog_t prog, - rpcvers_t *vers_out, const rpcvers_t vers_low, - const rpcvers_t vers_high, const char *nettype) + rpcvers_t *vers_out, const rpcvers_t vers_low, + const rpcvers_t vers_high, const char *nettype) { return (clnt_create_vers_timed(hostname, prog, vers_out, vers_low, - vers_high, nettype, NULL)); + vers_high, nettype, NULL)); } /* @@ -102,7 +102,7 @@ clnt_create_vers_timed(const char *hostname, const rpcprog_t prog, to = *tp; rpc_stat = clnt_call(clnt, NULLPROC, (xdrproc_t)xdr_void, - NULL, (xdrproc_t)xdr_void, NULL, to); + NULL, (xdrproc_t)xdr_void, NULL, to); if (rpc_stat == RPC_SUCCESS) { *vers_out = vers_high; return (clnt); @@ -126,8 +126,7 @@ clnt_create_vers_timed(const char *hostname, const rpcprog_t prog, } CLNT_CONTROL(clnt, CLSET_VERS, (char *)&v_high); rpc_stat = clnt_call(clnt, NULLPROC, (xdrproc_t)xdr_void, - NULL, (xdrproc_t)xdr_void, - NULL, to); + NULL, (xdrproc_t)xdr_void, NULL, to); if (rpc_stat == RPC_SUCCESS) { *vers_out = v_high; return (clnt); @@ -250,7 +249,7 @@ clnt_create_timed(const char *hostname, const rpcprog_t prog, */ if (rpc_createerr.cf_stat == RPC_SYSTEMERROR) { syslog(LOG_ERR, "clnt_create_timed: " - "RPC_SYSTEMERROR."); + "RPC_SYSTEMERROR."); break; } @@ -267,8 +266,8 @@ clnt_create_timed(const char *hostname, const rpcprog_t prog, * translation failed'' or ``unknown host name'' */ if ((rpc_createerr.cf_stat == RPC_N2AXLATEFAILURE || - rpc_createerr.cf_stat == RPC_UNKNOWNHOST) && - (save_cf_stat != RPC_SUCCESS)) { + rpc_createerr.cf_stat == RPC_UNKNOWNHOST) && + (save_cf_stat != RPC_SUCCESS)) { rpc_createerr.cf_stat = save_cf_stat; rpc_createerr.cf_error = save_cf_error; } @@ -289,9 +288,9 @@ clnt_create_timed(const char *hostname, const rpcprog_t prog, CLIENT * clnt_create_service_timed(const char *host, const char *service, - const rpcprog_t prog, const rpcvers_t vers, - const ushort_t port, const char *netclass, - const struct timeval *tmout) + const rpcprog_t prog, const rpcvers_t vers, + const ushort_t port, const char *netclass, + const struct timeval *tmout) { int fd; void *handle; @@ -399,7 +398,6 @@ clnt_create_service_timed(const char *host, const char *service, __rpc_set_mac_options(fd, nconf, prog); - /* LINTED pointer cast */ if ((tbind = (struct t_bind *)t_alloc(fd, T_BIND, T_ADDR)) == NULL) { (void) t_close(fd); @@ -423,18 +421,17 @@ clnt_create_service_timed(const char *host, const char *service, netdir_free((void *)raddrs, ND_ADDRLIST); if (port) { - if (strcmp(nconf->nc_protofmly, NC_INET) == 0) - /* LINTED pointer alignment */ + if (strcmp(nconf->nc_protofmly, NC_INET) == 0) { ((struct sockaddr_in *) - tbind->addr.buf)->sin_port = htons(port); - else if (strcmp(nconf->nc_protofmly, NC_INET6) == 0) - /* LINTED pointer alignment */ + tbind->addr.buf)->sin_port = htons(port); + } else if (strcmp(nconf->nc_protofmly, NC_INET6) == 0) { ((struct sockaddr_in6 *) - tbind->addr.buf)->sin6_port = htons(port); + tbind->addr.buf)->sin6_port = htons(port); + } } clnt = _clnt_tli_create_timed(fd, nconf, &tbind->addr, - prog, vers, 0, 0, &to); + prog, vers, 0, 0, &to); if (clnt == NULL) { if (tbind) @@ -453,7 +450,7 @@ clnt_create_service_timed(const char *host, const char *service, */ rpc_createerr.cf_stat = clnt_call(clnt, NULLPROC, - xdr_void, 0, xdr_void, 0, to); + xdr_void, 0, xdr_void, 0, to); rpc_createerr.cf_error.re_errno = rpc_callerr.re_status; rpc_createerr.cf_error.re_terrno = 0; @@ -464,8 +461,9 @@ clnt_create_service_timed(const char *host, const char *service, if (tbind) (void) t_free((char *)tbind, T_BIND); continue; - } else + } else { break; + } } __rpc_endconf(handle); @@ -520,15 +518,16 @@ clnt_tp_create_timed(const char *hostname, const rpcprog_t prog, /* * Get the address of the server */ - if ((svcaddr = __rpcb_findaddr_timed(prog, vers, - (struct netconfig *)nconf, (char *)hostname, - &cl, (struct timeval *)tp)) == NULL) { + svcaddr = __rpcb_findaddr_timed(prog, vers, + (struct netconfig *)nconf, (char *)hostname, + &cl, (struct timeval *)tp); + if (svcaddr == NULL) { /* appropriate error number is set by rpcbind libraries */ return (NULL); } if (cl == NULL) { cl = _clnt_tli_create_timed(RPC_ANYFD, nconf, svcaddr, - prog, vers, 0, 0, tp); + prog, vers, 0, 0, tp); } else { /* Reuse the CLIENT handle and change the appropriate fields */ if (CLNT_CONTROL(cl, CLSET_SVC_ADDR, (void *)svcaddr) == TRUE) { @@ -538,8 +537,8 @@ clnt_tp_create_timed(const char *hostname, const rpcprog_t prog, netdir_free((char *)svcaddr, ND_ADDR); rpc_createerr.cf_stat = RPC_SYSTEMERROR; syslog(LOG_ERR, - "clnt_tp_create_timed: " - "strdup failed."); + "clnt_tp_create_timed: " + "strdup failed."); return (NULL); } } @@ -551,8 +550,8 @@ clnt_tp_create_timed(const char *hostname, const rpcprog_t prog, free(cl->cl_netid); rpc_createerr.cf_stat = RPC_SYSTEMERROR; syslog(LOG_ERR, - "clnt_tp_create_timed: " - "strdup failed."); + "clnt_tp_create_timed: " + "strdup failed."); return (NULL); } } @@ -561,7 +560,7 @@ clnt_tp_create_timed(const char *hostname, const rpcprog_t prog, } else { CLNT_DESTROY(cl); cl = _clnt_tli_create_timed(RPC_ANYFD, nconf, svcaddr, - prog, vers, 0, 0, tp); + prog, vers, 0, 0, tp); } } netdir_free((char *)svcaddr, ND_ADDR); @@ -582,7 +581,7 @@ clnt_tli_create(const int fd, const struct netconfig *nconf, const uint_t sendsz, const uint_t recvsz) { return (_clnt_tli_create_timed(fd, nconf, svcaddr, prog, vers, sendsz, - recvsz, NULL)); + recvsz, NULL)); } /* @@ -596,12 +595,12 @@ clnt_tli_create(const int fd, const struct netconfig *nconf, */ CLIENT * _clnt_tli_create_timed(int fd, const struct netconfig *nconf, - struct netbuf *svcaddr, rpcprog_t prog, rpcvers_t vers, uint_t sendsz, - uint_t recvsz, const struct timeval *tp) + struct netbuf *svcaddr, rpcprog_t prog, rpcvers_t vers, uint_t sendsz, + uint_t recvsz, const struct timeval *tp) { CLIENT *cl; /* client handle */ struct t_info tinfo; /* transport info */ - bool_t madefd; /* whether fd opened here */ + bool_t madefd = FALSE; /* whether fd opened here */ t_scalar_t servtype; int retval; @@ -647,13 +646,12 @@ _clnt_tli_create_timed(int fd, const struct netconfig *nconf, (t_getinfo(fd, &tinfo) == -1)) goto err; servtype = tinfo.servtype; - madefd = FALSE; } switch (servtype) { case T_COTS: cl = _clnt_vc_create_timed(fd, svcaddr, prog, vers, sendsz, - recvsz, tp); + recvsz, tp); break; case T_COTS_ORD: if (nconf && ((strcmp(nconf->nc_protofmly, NC_INET) == 0) || @@ -663,7 +661,7 @@ _clnt_tli_create_timed(int fd, const struct netconfig *nconf, goto err; } cl = _clnt_vc_create_timed(fd, svcaddr, prog, vers, sendsz, - recvsz, tp); + recvsz, tp); break; case T_CLTS: cl = clnt_dg_create(fd, svcaddr, prog, vers, sendsz, recvsz); @@ -681,7 +679,7 @@ _clnt_tli_create_timed(int fd, const struct netconfig *nconf, rpc_createerr.cf_error.re_errno = errno; rpc_createerr.cf_error.re_terrno = 0; syslog(LOG_ERR, - "clnt_tli_create: strdup failed"); + "clnt_tli_create: strdup failed"); goto err1; } cl->cl_tp = strdup(nconf->nc_device); @@ -692,7 +690,7 @@ _clnt_tli_create_timed(int fd, const struct netconfig *nconf, rpc_createerr.cf_error.re_errno = errno; rpc_createerr.cf_error.re_terrno = 0; syslog(LOG_ERR, - "clnt_tli_create: strdup failed"); + "clnt_tli_create: strdup failed"); goto err1; } } else { @@ -706,8 +704,8 @@ _clnt_tli_create_timed(int fd, const struct netconfig *nconf, rpc_createerr.cf_error.re_errno = errno; rpc_createerr.cf_error.re_terrno = 0; syslog(LOG_ERR, - "clnt_tli_create: " - "strdup failed"); + "clnt_tli_create: " + "strdup failed"); goto err1; } } @@ -720,8 +718,8 @@ _clnt_tli_create_timed(int fd, const struct netconfig *nconf, rpc_createerr.cf_error.re_errno = errno; rpc_createerr.cf_error.re_terrno = 0; syslog(LOG_ERR, - "clnt_tli_create: " - "strdup failed"); + "clnt_tli_create: " + "strdup failed"); goto err1; } } @@ -770,7 +768,7 @@ __rpc_raise_fd(int fd) if (t_close(fd) == -1) { /* this is okay, we will syslog an error, then use the new fd */ (void) syslog(LOG_ERR, - "could not t_close() fd %d; mem & fd leak", fd); + "could not t_close() fd %d; mem & fd leak", fd); } return (nfd); diff --git a/usr/src/lib/libzfs/common/libzfs.h b/usr/src/lib/libzfs/common/libzfs.h index 5afdb2a0ba..9938b97dea 100644 --- a/usr/src/lib/libzfs/common/libzfs.h +++ b/usr/src/lib/libzfs/common/libzfs.h @@ -318,6 +318,8 @@ extern nvlist_t *zpool_find_vdev_by_physpath(zpool_handle_t *, const char *, boolean_t *, boolean_t *, boolean_t *); extern int zpool_label_disk(libzfs_handle_t *, zpool_handle_t *, const char *, zpool_boot_label_t, uint64_t, int *); +extern void zpool_vdev_refresh_path(libzfs_handle_t *, zpool_handle_t *, + nvlist_t *); /* * Functions to manage pool properties diff --git a/usr/src/lib/libzfs/common/libzfs_pool.c b/usr/src/lib/libzfs/common/libzfs_pool.c index bb04be87e1..d7060981fe 100644 --- a/usr/src/lib/libzfs/common/libzfs_pool.c +++ b/usr/src/lib/libzfs/common/libzfs_pool.c @@ -28,6 +28,7 @@ * Copyright (c) 2017 Datto Inc. * Copyright (c) 2017, Intel Corporation. * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. + * Copyright 2022 Oxide Computer Company */ #include <ctype.h> @@ -3964,17 +3965,70 @@ set_path(zpool_handle_t *zhp, nvlist_t *nv, const char *path) } /* + * This routine is responsible for identifying when disks have been + * reconfigured in a new location. The kernel will have opened the device by + * devid, but the path will still refer to the old location. To catch this, we + * first do a path -> devid translation (which is fast for the common case). + * If the devid matches, we're done. If not, we do a reverse devid -> path + * translation and issue the appropriate ioctl() to update the path of the + * vdev. + */ +void +zpool_vdev_refresh_path(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv) +{ + char *path = NULL; + char *newpath = NULL; + char *physpath = NULL; + char *devid = NULL; + + if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) != 0) { + return; + } + + if (nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &devid) == 0) { + /* + * This vdev has a devid. We can use it to check the current + * path. + */ + char *newdevid = path_to_devid(path); + + if (newdevid == NULL || strcmp(devid, newdevid) != 0) { + newpath = devid_to_path(devid); + } + + if (newdevid != NULL) { + devid_str_free(newdevid); + } + + } else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PHYS_PATH, + &physpath) == 0) { + /* + * This vdev does not have a devid, but it does have a physical + * path. Attempt to translate this to a /dev path. + */ + newpath = path_from_physpath(hdl, path, physpath); + } + + if (newpath == NULL) { + /* + * No path update is required. + */ + return; + } + + set_path(zhp, nv, newpath); + fnvlist_add_string(nv, ZPOOL_CONFIG_PATH, newpath); + + free(newpath); +} + +/* * Given a vdev, return the name to display in iostat. If the vdev has a path, * we use that, stripping off any leading "/dev/dsk/"; if not, we use the type. - * We also check if this is a whole disk, in which case we strip off the - * trailing 's0' slice name. + * We will confirm that the path and name of the vdev are current, and update + * them if not. We also check if this is a whole disk, in which case we strip + * off the trailing 's0' slice name. * - * This routine is also responsible for identifying when disks have been - * reconfigured in a new location. The kernel will have opened the device by - * devid, but the path will still refer to the old location. To catch this, we - * first do a path -> devid translation (which is fast for the common case). If - * the devid matches, we're done. If not, we do a reverse devid -> path - * translation and issue the appropriate ioctl() to update the path of the vdev. * If 'zhp' is NULL, then this is an exported pool, and we don't need to do any * of these checks. */ @@ -4017,9 +4071,6 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv, } else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) { vdev_stat_t *vs; uint_t vsc; - char *newpath = NULL; - char *physpath = NULL; - char *devid = NULL; /* * If the device is dead (faulted, offline, etc) then don't @@ -4034,42 +4085,12 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv, goto after_open; } - if (nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &devid) == 0) { - /* - * This vdev has a devid. We can use it to check the - * current path. - */ - char *newdevid = path_to_devid(path); - - if (newdevid == NULL || strcmp(devid, newdevid) != 0) { - newpath = devid_to_path(devid); - } - - if (newdevid != NULL) - devid_str_free(newdevid); - - } else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PHYS_PATH, - &physpath) == 0) { - /* - * This vdev does not have a devid, but it does have a - * physical path. Attempt to translate this to a /dev - * path. - */ - newpath = path_from_physpath(hdl, path, physpath); - } - - if (newpath != NULL) { - /* - * Update the path appropriately. - */ - set_path(zhp, nv, newpath); - if (nvlist_add_string(nv, ZPOOL_CONFIG_PATH, - newpath) == 0) { - verify(nvlist_lookup_string(nv, - ZPOOL_CONFIG_PATH, &path) == 0); - } - free(newpath); - } + /* + * Refresh the /dev path for this vdev if required, then ensure + * we're using the latest path value: + */ + zpool_vdev_refresh_path(hdl, zhp, nv); + path = fnvlist_lookup_string(nv, ZPOOL_CONFIG_PATH); if (name_flags & VDEV_NAME_FOLLOW_LINKS) { char *rp = realpath(path, NULL); diff --git a/usr/src/lib/libzfs/common/mapfile-vers b/usr/src/lib/libzfs/common/mapfile-vers index 456249d9ad..b437322adf 100644 --- a/usr/src/lib/libzfs/common/mapfile-vers +++ b/usr/src/lib/libzfs/common/mapfile-vers @@ -282,6 +282,7 @@ SYMBOL_VERSION SUNWprivate_1.1 { zpool_vdev_name; zpool_vdev_offline; zpool_vdev_online; + zpool_vdev_refresh_path; zpool_vdev_remove; zpool_vdev_remove_cancel; zpool_vdev_split; diff --git a/usr/src/lib/libzpool/Makefile.com b/usr/src/lib/libzpool/Makefile.com index 31bd6aa5e2..ca5aeed189 100644 --- a/usr/src/lib/libzpool/Makefile.com +++ b/usr/src/lib/libzpool/Makefile.com @@ -68,7 +68,7 @@ CSTD= $(CSTD_GNU99) CFLAGS += $(CCGDEBUG) $(CCVERBOSE) $(CNOGLOBAL) CFLAGS64 += $(CCGDEBUG) $(CCVERBOSE) $(CNOGLOBAL) -LDLIBS += -lcmdutils -lumem -lavl -lnvpair -lz -lc -lsysevent -lmd \ +LDLIBS += -lcmdutils -lumem -lavl -lnvpair -lz -lc -lmd \ -lfakekernel -lzutil NATIVE_LIBS += libz.so CPPFLAGS.first = -I$(SRC)/lib/libfakekernel/common |
