aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * CDDL HEADER START
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * The contents of this file are subject to the terms of the
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * Common Development and Distribution License (the "License").
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * You may not use this file except in compliance with the License.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * or http://www.opensolaris.org/os/licensing.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * See the License for the specific language governing permissions
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * and limitations under the License.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * When distributing Covered Code, include this CDDL HEADER in each
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * If applicable, add the following below this CDDL HEADER, with the
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * fields enclosed by brackets "[]" replaced with your own identifying
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * information: Portions Copyright [yyyy] [name of copyright owner]
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * CDDL HEADER END
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * vnode ops for the /dev/vt directory
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/types.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/param.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/sysmacros.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/sunndi.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <fs/fs_subr.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/fs/dv_node.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/fs/sdev_impl.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/policy.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/stat.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/vfs_opreg.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/tty.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/vt_impl.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/note.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/* warlock in this file only cares about variables shared by vt and devfs */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China_NOTE(SCHEME_PROTECTS_DATA("Do not care", sdev_node vattr vnode))
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#define DEVVT_UID_DEFAULT SDEV_UID_DEFAULT
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#define DEVVT_GID_DEFAULT (0)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#define DEVVT_DEVMODE_DEFAULT (0600)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#define DEVVT_ACTIVE_NAME "active"
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China#define DEVVT_CONSUSER_NAME "console_user"
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#define isdigit(ch) ((ch) >= '0' && (ch) <= '9')
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/* attributes for VT nodes */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic vattr_t devvt_vattr = {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China AT_TYPE|AT_MODE|AT_UID|AT_GID, /* va_mask */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China VCHR, /* va_type */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China S_IFCHR | DEVVT_DEVMODE_DEFAULT, /* va_mode */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China DEVVT_UID_DEFAULT, /* va_uid */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China DEVVT_GID_DEFAULT, /* va_gid */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China 0 /* 0 hereafter */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China};
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastruct vnodeops *devvt_vnodeops;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastruct vnodeops *
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinadevvt_getvnodeops(void)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (devvt_vnodeops);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic int
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinadevvt_str2minor(const char *nm, minor_t *mp)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China long uminor = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China char *endptr = NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (nm == NULL || !isdigit(*nm))
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (EINVAL);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *mp = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (ddi_strtol(nm, &endptr, 10, &uminor) != 0 ||
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *endptr != '\0' || uminor < 0) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (EINVAL);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *mp = (minor_t)uminor;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (0);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam/*
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam * Validate that a node is up-to-date and correct.
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam * A validator may not update the node state or
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam * contents as a read lock permits entry by
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam * multiple threads.
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinaint
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinadevvt_validate(struct sdev_node *dv)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China minor_t min;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China char *nm = dv->sdev_name;
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam int rval;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(dv->sdev_state == SDEV_READY);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam ASSERT(RW_LOCK_HELD(&(dv->sdev_dotdot)->sdev_contents));
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China /* validate only READY nodes */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (dv->sdev_state != SDEV_READY) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China sdcmn_err(("dev fs: skipping: node not ready %s(%p)",
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China nm, (void *)dv));
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (SDEV_VTOR_SKIP);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (vt_wc_attached() == (major_t)-1)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (SDEV_VTOR_INVALID);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (strcmp(nm, DEVVT_ACTIVE_NAME) == 0) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China char *link = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void) vt_getactive(link, MAXPATHLEN);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam rval = (strcmp(link, dv->sdev_symlink) == 0) ?
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam SDEV_VTOR_VALID : SDEV_VTOR_STALE;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China kmem_free(link, MAXPATHLEN);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam return (rval);
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China }
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China if (strcmp(nm, DEVVT_CONSUSER_NAME) == 0) {
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China char *link = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China (void) vt_getconsuser(link, MAXPATHLEN);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam rval = (strcmp(link, dv->sdev_symlink) == 0) ?
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam SDEV_VTOR_VALID : SDEV_VTOR_STALE;
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China kmem_free(link, MAXPATHLEN);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam return (rval);
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China }
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China if (devvt_str2minor(nm, &min) != 0) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (SDEV_VTOR_INVALID);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (vt_minor_valid(min) == B_FALSE)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (SDEV_VTOR_INVALID);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (SDEV_VTOR_VALID);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * This callback is invoked from devname_lookup_func() to create
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * a entry when the node is not found in the cache.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*ARGSUSED*/
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic int
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinadevvt_create_rvp(struct sdev_node *ddv, char *nm,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China void **arg, cred_t *cred, void *whatever, char *whichever)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China minor_t min;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China major_t maj;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct vattr *vap = (struct vattr *)arg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if ((maj = vt_wc_attached()) == (major_t)-1)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (SDEV_VTOR_INVALID);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (strcmp(nm, DEVVT_ACTIVE_NAME) == 0) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void) vt_getactive((char *)*arg, MAXPATHLEN);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (0);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China if (strcmp(nm, DEVVT_CONSUSER_NAME) == 0) {
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China (void) vt_getconsuser((char *)*arg, MAXPATHLEN);
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China return (0);
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (devvt_str2minor(nm, &min) != 0)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (-1);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (vt_minor_valid(min) == B_FALSE)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (-1);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *vap = devvt_vattr;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China vap->va_rdev = makedevice(maj, min);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (0);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*ARGSUSED3*/
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic int
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinadevvt_lookup(struct vnode *dvp, char *nm, struct vnode **vpp,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct pathname *pnp, int flags, struct vnode *rdir, struct cred *cred,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China caller_context_t *ct, int *direntflags, pathname_t *realpnp)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct sdev_node *sdvp = VTOSDEV(dvp);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct sdev_node *dv;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct vnode *rvp = NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int type, error;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China if ((strcmp(nm, DEVVT_ACTIVE_NAME) == 0) ||
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China (strcmp(nm, DEVVT_CONSUSER_NAME) == 0)) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China type = SDEV_VLINK;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China } else {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China type = SDEV_VATTR;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/* Give warlock a more clear call graph */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#ifndef __lock_lint
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China error = devname_lookup_func(sdvp, nm, vpp, cred,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China devvt_create_rvp, type);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#else
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China devvt_create_rvp(0, 0, 0, 0, 0, 0);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#endif
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (error == 0) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China switch ((*vpp)->v_type) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China case VCHR:
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China dv = VTOSDEV(VTOS(*vpp)->s_realvp);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(VOP_REALVP(SDEVTOV(dv), &rvp, NULL) == ENOSYS);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China break;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China case VDIR:
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China case VLNK:
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China dv = VTOSDEV(*vpp);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China break;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China default:
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China cmn_err(CE_PANIC, "devvt_lookup: Unsupported node "
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China "type: %p: %d", (void *)(*vpp), (*vpp)->v_type);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China break;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(SDEV_HELD(dv));
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (error);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinadevvt_create_snode(struct sdev_node *ddv, char *nm, struct cred *cred, int type)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int error;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct sdev_node *sdv = NULL;
bb5fffbea58a3c7c5826a58c13c21e6c87558e52Jerry Gilliam struct vattr vattr;
bb5fffbea58a3c7c5826a58c13c21e6c87558e52Jerry Gilliam struct vattr *vap = &vattr;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China major_t maj;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China minor_t min;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if ((maj = vt_wc_attached()) == (major_t)-1)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (strcmp(nm, DEVVT_ACTIVE_NAME) != 0 &&
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China strcmp(nm, DEVVT_CONSUSER_NAME) != 0 &&
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China devvt_str2minor(nm, &min) != 0)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China error = sdev_mknode(ddv, nm, &sdv, NULL, NULL, NULL, cred, SDEV_INIT);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (error || !sdv) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&sdv->sdev_lookup_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China SDEV_BLOCK_OTHERS(sdv, SDEV_LOOKUP);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&sdv->sdev_lookup_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (type & SDEV_VATTR) {
bb5fffbea58a3c7c5826a58c13c21e6c87558e52Jerry Gilliam *vap = devvt_vattr;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China vap->va_rdev = makedevice(maj, min);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China error = sdev_mknode(ddv, nm, &sdv, vap, NULL,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China NULL, cred, SDEV_READY);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China } else if (type & SDEV_VLINK) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China char *link = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void) vt_getactive(link, MAXPATHLEN);
bb5fffbea58a3c7c5826a58c13c21e6c87558e52Jerry Gilliam *vap = sdev_vattr_lnk;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China vap->va_size = strlen(link);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China error = sdev_mknode(ddv, nm, &sdv, vap, NULL,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void *)link, cred, SDEV_READY);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China kmem_free(link, MAXPATHLEN);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
9e5aa9d8a21f8efa8ba9c9e4a0aa6edc66d07eb2Robert Mustacchi if (error != 0) {
9e5aa9d8a21f8efa8ba9c9e4a0aa6edc66d07eb2Robert Mustacchi SDEV_RELE(sdv);
9e5aa9d8a21f8efa8ba9c9e4a0aa6edc66d07eb2Robert Mustacchi return;
9e5aa9d8a21f8efa8ba9c9e4a0aa6edc66d07eb2Robert Mustacchi }
9e5aa9d8a21f8efa8ba9c9e4a0aa6edc66d07eb2Robert Mustacchi
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&sdv->sdev_lookup_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China SDEV_UNBLOCK_OTHERS(sdv, SDEV_LOOKUP);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&sdv->sdev_lookup_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliamstatic void
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliamdevvt_rebuild_stale_link(struct sdev_node *ddv, struct sdev_node *dv)
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam{
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam char *link;
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam ASSERT((strcmp(dv->sdev_name, DEVVT_ACTIVE_NAME) == 0) ||
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam (strcmp(dv->sdev_name, DEVVT_CONSUSER_NAME) == 0));
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam link = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam if (strcmp(dv->sdev_name, DEVVT_ACTIVE_NAME) == 0) {
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam (void) vt_getactive(link, MAXPATHLEN);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam } else if (strcmp(dv->sdev_name, DEVVT_CONSUSER_NAME) == 0) {
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam (void) vt_getconsuser(link, MAXPATHLEN);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam }
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam if (strcmp(link, dv->sdev_symlink) != 0) {
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam strfree(dv->sdev_symlink);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam dv->sdev_symlink = strdup(link);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam dv->sdev_attr->va_size = strlen(link);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam }
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam kmem_free(link, MAXPATHLEN);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam}
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam/*
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam * First step in refreshing directory contents.
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam * Remove each invalid entry and rebuild the link
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam * reference for each stale entry.
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinadevvt_prunedir(struct sdev_node *ddv)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct vnode *vp;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct sdev_node *dv, *next = NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int (*vtor)(struct sdev_node *) = NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(ddv->sdev_flags & SDEV_VTOR);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China vtor = (int (*)(struct sdev_node *))sdev_get_vtor(ddv);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(vtor);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China for (dv = SDEV_FIRST_ENTRY(ddv); dv; dv = next) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China next = SDEV_NEXT_ENTRY(ddv, dv);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China switch (vtor(dv)) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China case SDEV_VTOR_VALID:
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam break;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China case SDEV_VTOR_SKIP:
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam break;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China case SDEV_VTOR_INVALID:
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam vp = SDEVTOV(dv);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam if (vp->v_count != 0)
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam break;
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam /* remove the cached node */
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam SDEV_HOLD(dv);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam (void) sdev_cache_update(ddv, &dv,
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam dv->sdev_name, SDEV_CACHE_DELETE);
9e5aa9d8a21f8efa8ba9c9e4a0aa6edc66d07eb2Robert Mustacchi SDEV_RELE(dv);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam break;
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk case SDEV_VTOR_STALE:
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam devvt_rebuild_stale_link(ddv, dv);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China break;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinadevvt_cleandir(struct vnode *dvp, struct cred *cred)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct sdev_node *sdvp = VTOSDEV(dvp);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct sdev_node *dv, *next = NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int min, cnt;
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China char found = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&vc_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China cnt = VC_INSTANCES_COUNT;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&vc_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/* We have to fool warlock this way, otherwise it will complain */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#ifndef __lock_lint
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (rw_tryupgrade(&sdvp->sdev_contents) == NULL) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China rw_exit(&sdvp->sdev_contents);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China rw_enter(&sdvp->sdev_contents, RW_WRITER);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#else
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China rw_enter(&sdvp->sdev_contents, RW_WRITER);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#endif
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam /* 1. prune invalid nodes and rebuild stale symlinks */
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam devvt_prunedir(sdvp);
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam /* 2. create missing nodes */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China for (min = 0; min < cnt; min++) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China char nm[16];
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (vt_minor_valid(min) == B_FALSE)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China continue;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void) snprintf(nm, sizeof (nm), "%d", min);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China found = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China for (dv = SDEV_FIRST_ENTRY(sdvp); dv; dv = next) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China next = SDEV_NEXT_ENTRY(sdvp, dv);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam /* validate only ready nodes */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (dv->sdev_state != SDEV_READY)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China continue;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (strcmp(nm, dv->sdev_name) == 0) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China found = 1;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China break;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (!found) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China devvt_create_snode(sdvp, nm, cred, SDEV_VATTR);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam /* 3. create active link node and console user link node */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China found = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China for (dv = SDEV_FIRST_ENTRY(sdvp); dv; dv = next) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China next = SDEV_NEXT_ENTRY(sdvp, dv);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
2b080a343365d348d0bc9c6b0904cbe4e0526818Jerry Gilliam /* validate only ready nodes */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (dv->sdev_state != SDEV_READY)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China continue;
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China if ((strcmp(dv->sdev_name, DEVVT_ACTIVE_NAME) == NULL))
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China found |= 0x01;
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China if ((strcmp(dv->sdev_name, DEVVT_CONSUSER_NAME) == NULL))
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China found |= 0x02;
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China if ((found & 0x01) && (found & 0x02))
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China break;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China if (!(found & 0x01))
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China devvt_create_snode(sdvp, DEVVT_ACTIVE_NAME, cred, SDEV_VLINK);
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China if (!(found & 0x02))
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China devvt_create_snode(sdvp, DEVVT_CONSUSER_NAME, cred, SDEV_VLINK);
ceeba6f9f0adf370c2a0f5c81a0d6ef1ba146cb4rui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#ifndef __lock_lint
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China rw_downgrade(&sdvp->sdev_contents);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#else
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China rw_exit(&sdvp->sdev_contents);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#endif
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*ARGSUSED4*/
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic int
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinadevvt_readdir(struct vnode *dvp, struct uio *uiop, struct cred *cred,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int *eofp, caller_context_t *ct, int flags)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (uiop->uio_offset == 0) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China devvt_cleandir(dvp, cred);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (devname_readdir_func(dvp, uiop, cred, eofp, 0));
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * We allow create to find existing nodes
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * - if the node doesn't exist - EROFS
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * - creating an existing dir read-only succeeds, otherwise EISDIR
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * - exclusive creates fail - EEXIST
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*ARGSUSED2*/
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic int
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinadevvt_create(struct vnode *dvp, char *nm, struct vattr *vap, vcexcl_t excl,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int mode, struct vnode **vpp, struct cred *cred, int flag,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China caller_context_t *ct, vsecattr_t *vsecp)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int error;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct vnode *vp;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *vpp = NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if ((error = devvt_lookup(dvp, nm, &vp, NULL, 0, NULL, cred, ct, NULL,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China NULL)) != 0) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (error == ENOENT)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China error = EROFS;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (error);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (excl == EXCL)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China error = EEXIST;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China else if (vp->v_type == VDIR && (mode & VWRITE))
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China error = EISDIR;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China else
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China error = VOP_ACCESS(vp, mode, 0, cred, ct);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (error) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China VN_RELE(vp);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China } else
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *vpp = vp;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (error);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinaconst fs_operation_def_t devvt_vnodeops_tbl[] = {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China VOPNAME_READDIR, { .vop_readdir = devvt_readdir },
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China VOPNAME_LOOKUP, { .vop_lookup = devvt_lookup },
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China VOPNAME_CREATE, { .vop_create = devvt_create },
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China VOPNAME_REMOVE, { .error = fs_nosys },
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China VOPNAME_MKDIR, { .error = fs_nosys },
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China VOPNAME_RMDIR, { .error = fs_nosys },
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China VOPNAME_SYMLINK, { .error = fs_nosys },
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China VOPNAME_SETSECATTR, { .error = fs_nosys },
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China NULL, NULL
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China};