diff options
author | Gordon Ross <gwr@nexenta.com> | 2018-01-10 13:44:21 -0500 |
---|---|---|
committer | Gordon Ross <gwr@nexenta.com> | 2018-10-11 13:15:54 -0400 |
commit | fdfb62c8fbf6e03ca943243b626360bede206f18 (patch) | |
tree | 61db8be6a08689b8f8a57fad406277495b3c7df1 | |
parent | 437d9da7e4e3aac261d43f722ef702469f5550ce (diff) | |
download | illumos-joyent-fdfb62c8fbf6e03ca943243b626360bede206f18.tar.gz |
9877 Want t_koptmgmt in kTLI
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Approved by: Dan McDonald <danmcd@joyent.com>
-rw-r--r-- | usr/src/uts/common/Makefile.files | 10 | ||||
-rw-r--r-- | usr/src/uts/common/ktli/t_koptmgmt.c | 154 | ||||
-rw-r--r-- | usr/src/uts/intel/ia32/ml/modstubs.s | 1 | ||||
-rw-r--r-- | usr/src/uts/sparc/ml/modstubs.s | 1 |
4 files changed, 161 insertions, 5 deletions
diff --git a/usr/src/uts/common/Makefile.files b/usr/src/uts/common/Makefile.files index 64322a8715..370d03121b 100644 --- a/usr/src/uts/common/Makefile.files +++ b/usr/src/uts/common/Makefile.files @@ -817,7 +817,7 @@ SCSI_VHCI_F_TPGS_OBJS += tpgs.o SCSI_VHCI_F_ASYM_SUN_OBJS += asym_sun.o -SCSI_VHCI_F_SYM_HDS_OBJS += sym_hds.o +SCSI_VHCI_F_SYM_HDS_OBJS += sym_hds.o SCSI_VHCI_F_TAPE_OBJS += tape.o @@ -1091,7 +1091,7 @@ NFS_OBJS += nfs_client.o nfs_common.o nfs_dump.o \ nfs_xdr.o nfs_sys.o nfs_strerror.o \ nfs3_vfsops.o nfs3_vnops.o nfs3_xdr.o \ nfs_acl_vnops.o nfs_acl_xdr.o nfs4_vfsops.o \ - nfs4_vnops.o nfs4_xdr.o nfs4_idmap.o \ + nfs4_vnops.o nfs4_xdr.o nfs4_idmap.o \ nfs4_shadow.o nfs4_subr.o \ nfs4_attr.o nfs4_rnode.o nfs4_client.o \ nfs4_acache.o nfs4_common.o nfs4_client_state.o \ @@ -1259,7 +1259,7 @@ UDFS_OBJS += udf_alloc.o udf_bmap.o udf_dir.o \ udf_inode.o udf_subr.o udf_vfsops.o \ udf_vnops.o -UFS_OBJS += ufs_alloc.o ufs_bmap.o ufs_dir.o ufs_xattr.o \ +UFS_OBJS += ufs_alloc.o ufs_bmap.o ufs_dir.o ufs_xattr.o \ ufs_inode.o ufs_subr.o ufs_tables.o ufs_vfsops.o \ ufs_vnops.o quota.o quotacalls.o quota_ufs.o \ ufs_filio.o ufs_lockfs.o ufs_thread.o ufs_trans.o \ @@ -1494,8 +1494,8 @@ KLMOPS_OBJS += klmops.o TLIMOD_OBJS += tlimod.o t_kalloc.o t_kbind.o t_kclose.o \ t_kconnect.o t_kfree.o t_kgtstate.o t_kopen.o \ - t_krcvudat.o t_ksndudat.o t_kspoll.o t_kunbind.o \ - t_kutil.o + t_koptmgmt.o t_krcvudat.o t_ksndudat.o t_kspoll.o \ + t_kunbind.o t_kutil.o RLMOD_OBJS += rlmod.o diff --git a/usr/src/uts/common/ktli/t_koptmgmt.c b/usr/src/uts/common/ktli/t_koptmgmt.c new file mode 100644 index 0000000000..e217c4dfcb --- /dev/null +++ b/usr/src/uts/common/ktli/t_koptmgmt.c @@ -0,0 +1,154 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (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) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + +/* + * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * Copyright 2018 Nexenta Systems, Inc. All rights reserved. + */ + +/* + * kTLI variant of t_optmgmt(3NSL) + * Returns 0 on success or an errno value. + * Similar to libnsl t_optmgmt.c + * + * Note: This expects the caller's struct t_optmgmt to contain the + * XTI version of struct T_opthdr (used with T_OPTMGMT_REQ == 27) + * not the old "struct opthdr" (used with T_SVR4_OPTMGMT_REQ == 9) + */ + +#include <sys/param.h> +#include <sys/types.h> +#include <sys/proc.h> +#include <sys/file.h> +#include <sys/user.h> +#include <sys/vnode.h> +#include <sys/errno.h> +#include <sys/stream.h> +#include <sys/ioctl.h> +#include <sys/stropts.h> +#include <sys/strsubr.h> +#define _SUN_TPI_VERSION 2 +#include <sys/tihdr.h> +#include <sys/timod.h> +#include <sys/tiuser.h> +#include <sys/t_kuser.h> +#include <sys/kmem.h> + +int +t_koptmgmt(TIUSER *tiptr, struct t_optmgmt *req, struct t_optmgmt *ret) +{ + struct strioctl strioc; + struct T_optmgmt_req *opt_req; + struct T_optmgmt_ack *opt_ack; + file_t *fp; + vnode_t *vp; + char *ctlbuf = NULL; + char *opt_data; + t_scalar_t optlen; + int ctlsize; + int retval; + int error; + + fp = tiptr->fp; + vp = fp->f_vnode; + + optlen = req->opt.len; + if (optlen > 0) { + if (req->opt.buf == NULL) + return (EINVAL); + if (optlen < (t_scalar_t)sizeof (struct T_opthdr)) { + /* option buffer should atleast have an t_opthdr */ + return (EINVAL); + } + /* sanity limit */ + if (optlen > 4096) { + return (EINVAL); + } + } + + ctlsize = sizeof (*opt_req) + optlen; + ctlbuf = kmem_alloc(ctlsize, KM_SLEEP); + + /* LINTED E_BAD_PTR_CAST_ALIGN */ + opt_req = (struct T_optmgmt_req *)ctlbuf; + opt_req->PRIM_type = T_OPTMGMT_REQ; + opt_req->MGMT_flags = req->flags; + opt_req->OPT_length = optlen; + opt_req->OPT_offset = sizeof (*opt_req); + if (optlen > 0) { + opt_data = ctlbuf + sizeof (*opt_req); + bcopy(req->opt.buf, opt_data, optlen); + } + + strioc.ic_cmd = TI_OPTMGMT; + strioc.ic_timout = 0; + strioc.ic_dp = ctlbuf; + strioc.ic_len = ctlsize; + + error = strdoioctl(vp->v_stream, &strioc, FNATIVE, K_TO_K, + fp->f_cred, &retval); + if (error) + goto errout; + + if (retval) { + if ((retval & 0xff) == TSYSERR) + error = (retval >> 8) & 0xff; + else + error = t_tlitosyserr(retval & 0xff); + goto errout; + } + + if (strioc.ic_len < sizeof (struct T_optmgmt_ack)) { + error = EPROTO; + goto errout; + } + + /* LINTED pointer cast */ + opt_ack = (struct T_optmgmt_ack *)ctlbuf; + if (opt_ack->PRIM_type != T_OPTMGMT_ACK) { + error = EPROTO; + goto errout; + } + + if (ret->opt.maxlen > 0) { + if (opt_ack->OPT_length > ret->opt.maxlen) { + error = EMSGSIZE; + goto errout; + } + ret->opt.len = opt_ack->OPT_offset; + opt_data = ctlbuf + opt_ack->OPT_offset; + bcopy(opt_data, ret->opt.buf, ret->opt.len); + } + ret->flags = opt_ack->MGMT_flags; + +errout: + if (ctlbuf != NULL) + kmem_free(ctlbuf, ctlsize); + return (error); +} diff --git a/usr/src/uts/intel/ia32/ml/modstubs.s b/usr/src/uts/intel/ia32/ml/modstubs.s index d38b4e87c9..466aa4f4b5 100644 --- a/usr/src/uts/intel/ia32/ml/modstubs.s +++ b/usr/src/uts/intel/ia32/ml/modstubs.s @@ -638,6 +638,7 @@ fcnname/**/_info: \ NO_UNLOAD_STUB(tlimod, t_kclose, nomod_zero); NO_UNLOAD_STUB(tlimod, t_kspoll, nomod_zero); NO_UNLOAD_STUB(tlimod, t_kfree, nomod_zero); + NO_UNLOAD_STUB(tlimod, t_koptmgmt, nomod_zero); END_MODULE(tlimod); #endif diff --git a/usr/src/uts/sparc/ml/modstubs.s b/usr/src/uts/sparc/ml/modstubs.s index 1641c734da..e3db778fed 100644 --- a/usr/src/uts/sparc/ml/modstubs.s +++ b/usr/src/uts/sparc/ml/modstubs.s @@ -527,6 +527,7 @@ stubs_base: NO_UNLOAD_STUB(tlimod, t_kclose, nomod_zero); NO_UNLOAD_STUB(tlimod, t_kspoll, nomod_zero); NO_UNLOAD_STUB(tlimod, t_kfree, nomod_zero); + NO_UNLOAD_STUB(tlimod, t_koptmgmt, nomod_zero); END_MODULE(tlimod); #endif |