/* * vml_iocdata() - * Handle the M_IOCDATA messages associated with * a request to validate a module list. */ static void vml_iocdata( queue_t *qp, /* pointer to write queue */ mblk_t *mp) /* message pointer */ { long i; int nmods; struct copyresp *csp; struct str_mlist *lp; STRUCT_HANDLE(str_list, slp); struct saddev *sadp; csp = (struct copyresp *)mp->b_rptr; if (csp->cp_rval) { /* if there was an error */ freemsg(mp); return; } ASSERT(csp->cp_cmd == SAD_VML); sadp = (struct saddev *)qp->q_ptr; switch ((long)csp->cp_private) { case GETSTRUCT: STRUCT_SET_HANDLE(slp, csp->cp_flag, (struct str_list *)mp->b_cont->b_rptr); nmods = STRUCT_FGET(slp, sl_nmods); if (nmods <= 0) { miocnak(qp, mp, 0, EINVAL); break; } sadp->sa_addr = (caddr_t)(uintptr_t)nmods; mcopyin(mp, (void *)GETLIST, nmods * sizeof (struct str_mlist), STRUCT_FGETP(slp, sl_modlist)); qreply(qp, mp); break; case GETLIST: lp = (struct str_mlist *)mp->b_cont->b_rptr; for (i = 0; i < (long)sadp->sa_addr; i++, lp++) { lp->l_name[FMNAMESZ] = '\0'; if (fmodsw_find(lp->l_name, FMODSW_LOAD) == NULL) { miocack(qp, mp, 0, 1); return; } } miocack(qp, mp, 0, 0); break; default: cmn_err(CE_WARN, "vml_iocdata: invalid cp_private value: %p", (void *)csp->cp_private); freemsg(mp); break; } /* switch (cp_private) */ }
int nfs4_setopts(vnode_t *vp, model_t model, struct nfs_args *buf) { mntinfo4_t *mi; /* mount info, pointed at by vfs */ STRUCT_HANDLE(nfs_args, args); int flags; #ifdef lint model = model; #endif STRUCT_SET_HANDLE(args, model, buf); flags = STRUCT_FGET(args, flags); /* * Set option fields in mount info record */ mi = VTOMI4(vp); if (flags & NFSMNT_NOAC) { mutex_enter(&mi->mi_lock); mi->mi_flags |= MI4_NOAC; mutex_exit(&mi->mi_lock); PURGE_ATTRCACHE4(vp); } mutex_enter(&mi->mi_lock); if (flags & NFSMNT_NOCTO) mi->mi_flags |= MI4_NOCTO; if (flags & NFSMNT_LLOCK) mi->mi_flags |= MI4_LLOCK; if (flags & NFSMNT_GRPID) mi->mi_flags |= MI4_GRPID; mutex_exit(&mi->mi_lock); if (flags & NFSMNT_RETRANS) { if (STRUCT_FGET(args, retrans) < 0) return (EINVAL); mi->mi_retrans = STRUCT_FGET(args, retrans); } if (flags & NFSMNT_TIMEO) { if (STRUCT_FGET(args, timeo) <= 0) return (EINVAL); mi->mi_timeo = STRUCT_FGET(args, timeo); } if (flags & NFSMNT_RSIZE) { if (STRUCT_FGET(args, rsize) <= 0) return (EINVAL); mi->mi_tsize = MIN(mi->mi_tsize, STRUCT_FGET(args, rsize)); mi->mi_curread = MIN(mi->mi_curread, mi->mi_tsize); } if (flags & NFSMNT_WSIZE) { if (STRUCT_FGET(args, wsize) <= 0) return (EINVAL); mi->mi_stsize = MIN(mi->mi_stsize, STRUCT_FGET(args, wsize)); mi->mi_curwrite = MIN(mi->mi_curwrite, mi->mi_stsize); } if (flags & NFSMNT_ACREGMIN) { if (STRUCT_FGET(args, acregmin) < 0) mi->mi_acregmin = SEC2HR(ACMINMAX); else mi->mi_acregmin = SEC2HR(MIN(STRUCT_FGET(args, acregmin), ACMINMAX)); } if (flags & NFSMNT_ACREGMAX) { if (STRUCT_FGET(args, acregmax) < 0) mi->mi_acregmax = SEC2HR(ACMAXMAX); else mi->mi_acregmax = SEC2HR(MIN(STRUCT_FGET(args, acregmax), ACMAXMAX)); } if (flags & NFSMNT_ACDIRMIN) { if (STRUCT_FGET(args, acdirmin) < 0) mi->mi_acdirmin = SEC2HR(ACMINMAX); else mi->mi_acdirmin = SEC2HR(MIN(STRUCT_FGET(args, acdirmin), ACMINMAX)); } if (flags & NFSMNT_ACDIRMAX) { if (STRUCT_FGET(args, acdirmax) < 0) mi->mi_acdirmax = SEC2HR(ACMAXMAX); else mi->mi_acdirmax = SEC2HR(MIN(STRUCT_FGET(args, acdirmax), ACMAXMAX)); } return (0); }