usr/src/uts/common/fs/dev/sdev_vnops.c
author szhou
Tue, 05 Sep 2006 20:30:13 -0700
changeset 2679 39fc2aead8db
parent 2621 4ea88858d952
child 2729 aeda30620271
permissions -rw-r--r--
6464694 assert failure during "ls $ZONEROOT/dev/pts"
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
     1
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
     2
 * CDDL HEADER START
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
     3
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
     7
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    11
 * and limitations under the License.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    12
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    18
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    19
 * CDDL HEADER END
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    20
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    21
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    23
 * Use is subject to license terms.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    24
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    25
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    27
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    28
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    29
 * vnode ops for the /dev filesystem
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    30
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    31
 * - VDIR, VCHR, CBLK, and VLNK are considered must supported files
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    32
 * - VREG and VDOOR are used for some internal implementations in
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    33
 *    the global zone, e.g. devname and devfsadm communication
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    34
 * - other file types are unusual in this namespace and
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    35
 *    not supported for now
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    36
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    37
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    38
#include <sys/types.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    39
#include <sys/param.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    40
#include <sys/t_lock.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    41
#include <sys/systm.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    42
#include <sys/sysmacros.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    43
#include <sys/user.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    44
#include <sys/time.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    45
#include <sys/vfs.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    46
#include <sys/vnode.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    47
#include <sys/file.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    48
#include <sys/fcntl.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    49
#include <sys/flock.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    50
#include <sys/kmem.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    51
#include <sys/uio.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    52
#include <sys/errno.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    53
#include <sys/stat.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    54
#include <sys/cred.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    55
#include <sys/cred_impl.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    56
#include <sys/dirent.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    57
#include <sys/pathname.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    58
#include <sys/cmn_err.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    59
#include <sys/debug.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    60
#include <sys/policy.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    61
#include <vm/hat.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    62
#include <vm/seg_vn.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    63
#include <vm/seg_map.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    64
#include <vm/seg.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    65
#include <vm/as.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    66
#include <vm/page.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    67
#include <sys/proc.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    68
#include <sys/mode.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    69
#include <sys/sunndi.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    70
#include <sys/ptms.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    71
#include <fs/fs_subr.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    72
#include <sys/fs/dv_node.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    73
#include <sys/fs/sdev_impl.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    74
#include <sys/fs/sdev_node.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    75
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    76
/*ARGSUSED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    77
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    78
sdev_open(struct vnode **vpp, int flag, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    79
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    80
	struct sdev_node *dv = VTOSDEV(*vpp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    81
	struct sdev_node *ddv = dv->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    82
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    83
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    84
	if ((*vpp)->v_type == VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    85
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    86
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    87
	if (!SDEV_IS_GLOBAL(dv))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    88
		return (ENOTSUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    89
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    90
	ASSERT((*vpp)->v_type == VREG);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    91
	if ((*vpp)->v_type != VREG)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    92
		return (ENOTSUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    93
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    94
	ASSERT(ddv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    95
	rw_enter(&ddv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    96
	if (dv->sdev_attrvp == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    97
		rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    98
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    99
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   100
	error = VOP_OPEN(&(dv->sdev_attrvp), flag, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   101
	rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   102
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   103
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   104
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   105
/*ARGSUSED1*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   106
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   107
sdev_close(struct vnode *vp, int flag, int count,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   108
    offset_t offset, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   109
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   110
	struct sdev_node *dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   111
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   112
	if (vp->v_type == VDIR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   113
		cleanlocks(vp, ttoproc(curthread)->p_pid, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   114
		cleanshares(vp, ttoproc(curthread)->p_pid);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   115
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   116
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   117
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   118
	if (!SDEV_IS_GLOBAL(dv))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   119
		return (ENOTSUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   120
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   121
	ASSERT(vp->v_type == VREG);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   122
	if (vp->v_type != VREG)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   123
		return (ENOTSUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   124
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   125
	ASSERT(dv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   126
	return (VOP_CLOSE(dv->sdev_attrvp, flag, count, offset, cred));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   127
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   128
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   129
/*ARGSUSED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   130
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   131
sdev_read(struct vnode *vp, struct uio *uio, int ioflag, struct cred *cred,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   132
	struct caller_context *ct)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   133
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   134
	struct sdev_node *dv = (struct sdev_node *)VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   135
	int	error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   136
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   137
	if (!SDEV_IS_GLOBAL(dv))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   138
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   139
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   140
	if (vp->v_type == VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   141
		return (EISDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   142
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   143
	/* only supporting regular files in /dev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   144
	ASSERT(vp->v_type == VREG);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   145
	if (vp->v_type != VREG)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   146
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   147
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   148
	ASSERT(RW_READ_HELD(&VTOSDEV(vp)->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   149
	ASSERT(dv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   150
	(void) VOP_RWLOCK(dv->sdev_attrvp, 0, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   151
	error = VOP_READ(dv->sdev_attrvp, uio, ioflag, cred, ct);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   152
	VOP_RWUNLOCK(dv->sdev_attrvp, 0, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   153
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   154
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   155
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   156
/*ARGSUSED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   157
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   158
sdev_write(struct vnode *vp, struct uio *uio, int ioflag, struct cred *cred,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   159
	struct caller_context *ct)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   160
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   161
	struct sdev_node *dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   162
	int	error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   163
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   164
	if (!SDEV_IS_GLOBAL(dv))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   165
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   166
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   167
	if (vp->v_type == VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   168
		return (EISDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   169
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   170
	/* only supporting regular files in /dev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   171
	ASSERT(vp->v_type == VREG);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   172
	if (vp->v_type != VREG)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   173
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   174
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   175
	ASSERT(dv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   176
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   177
	(void) VOP_RWLOCK(dv->sdev_attrvp, 1, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   178
	error = VOP_WRITE(dv->sdev_attrvp, uio, ioflag, cred, ct);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   179
	VOP_RWUNLOCK(dv->sdev_attrvp, 1, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   180
	if (error == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   181
		sdev_update_timestamps(dv->sdev_attrvp, kcred,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   182
		    AT_MTIME);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   183
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   184
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   185
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   186
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   187
/*ARGSUSED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   188
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   189
sdev_ioctl(struct vnode *vp, int cmd, intptr_t arg, int flag,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   190
    struct cred *cred, int *rvalp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   191
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   192
	struct sdev_node *dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   193
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   194
	if (!SDEV_IS_GLOBAL(dv) || (vp->v_type == VDIR))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   195
		return (ENOTTY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   196
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   197
	ASSERT(vp->v_type == VREG);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   198
	if (vp->v_type != VREG)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   199
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   200
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   201
	ASSERT(dv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   202
	return (VOP_IOCTL(dv->sdev_attrvp, cmd, arg, flag, cred, rvalp));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   203
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   204
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   205
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   206
sdev_getattr(struct vnode *vp, struct vattr *vap, int flags, struct cred *cr)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   207
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   208
	int			error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   209
	struct sdev_node	*dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   210
	struct sdev_node	*parent = dv->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   211
	struct devname_nsmap *map = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   212
	struct devname_ops	*dirops = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   213
	int (*fn)(devname_handle_t *, struct vattr *, struct cred *);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   214
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   215
	ASSERT(parent);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   216
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   217
	rw_enter(&parent->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   218
	ASSERT(dv->sdev_attr || dv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   219
	if (SDEV_IS_GLOBAL(dv) && (dv->sdev_state != SDEV_ZOMBIE)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   220
		map = sdev_get_map(parent, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   221
		dirops = map ? map->dir_ops : NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   222
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   223
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   224
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   225
	 * search order:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   226
	 * 	- for persistent nodes (SDEV_PERSIST): backstore
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   227
	 *	- for non-persistent nodes: module ops if global, then memory
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   228
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   229
	if (dv->sdev_attrvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   230
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   231
		error = VOP_GETATTR(dv->sdev_attrvp, vap, flags, cr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   232
		sdev_vattr_merge(dv, vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   233
	} else if (dirops && (fn = dirops->devnops_getattr)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   234
		sdev_vattr_merge(dv, vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   235
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   236
		error = (*fn)(&(dv->sdev_handle), vap, cr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   237
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   238
		ASSERT(dv->sdev_attr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   239
		*vap = *dv->sdev_attr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   240
		sdev_vattr_merge(dv, vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   241
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   242
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   243
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   244
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   245
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   246
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   247
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   248
sdev_setattr(struct vnode *vp, struct vattr *vap, int flags, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   249
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   250
	return (devname_setattr_func(vp, vap, flags, cred, NULL, 0));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   251
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   252
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   253
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   254
sdev_getsecattr(struct vnode *vp, struct vsecattr *vsap, int flags,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   255
    struct cred *cr)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   256
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   257
	int	error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   258
	struct sdev_node *dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   259
	struct vnode *avp = dv->sdev_attrvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   260
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   261
	if (avp == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   262
		/* return fs_fab_acl() if flavor matches, else do nothing */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   263
		if ((SDEV_ACL_FLAVOR(vp) == _ACL_ACLENT_ENABLED &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   264
		    (vsap->vsa_mask & (VSA_ACLCNT | VSA_DFACLCNT))) ||
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   265
		    (SDEV_ACL_FLAVOR(vp) == _ACL_ACE_ENABLED &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   266
		    (vsap->vsa_mask & (VSA_ACECNT | VSA_ACE))))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   267
			return (fs_fab_acl(vp, vsap, flags, cr));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   268
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   269
		return (ENOSYS);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   270
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   271
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   272
	(void) VOP_RWLOCK(avp, 1, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   273
	error = VOP_GETSECATTR(avp, vsap, flags, cr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   274
	VOP_RWUNLOCK(avp, 1, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   275
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   276
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   277
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   278
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   279
sdev_setsecattr(struct vnode *vp, struct vsecattr *vsap, int flags,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   280
    struct cred *cr)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   281
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   282
	int	error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   283
	struct sdev_node *dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   284
	struct vnode *avp = dv->sdev_attrvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   285
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   286
	if (dv->sdev_state == SDEV_ZOMBIE)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   287
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   288
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   289
	if (avp == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   290
		if (SDEV_IS_GLOBAL(dv) && !SDEV_IS_PERSIST(dv))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   291
			return (fs_nosys());
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   292
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   293
		ASSERT(dv->sdev_attr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   294
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   295
		 * if coming in directly, the acl system call will
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   296
		 * have held the read-write lock via VOP_RWLOCK()
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   297
		 * If coming in via specfs, specfs will have
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   298
		 * held the rw lock on the realvp i.e. us.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   299
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   300
		ASSERT(RW_WRITE_HELD(&dv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   301
		sdev_vattr_merge(dv, dv->sdev_attr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   302
		error =  sdev_shadow_node(dv, cr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   303
		if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   304
			return (fs_nosys());
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   305
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   306
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   307
		ASSERT(dv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   308
		/* clean out the memory copy if any */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   309
		if (dv->sdev_attr) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   310
			kmem_free(dv->sdev_attr, sizeof (struct vattr));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   311
			dv->sdev_attr = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   312
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   313
		avp = dv->sdev_attrvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   314
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   315
	ASSERT(avp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   316
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   317
	(void) VOP_RWLOCK(avp, V_WRITELOCK_TRUE, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   318
	error = VOP_SETSECATTR(avp, vsap, flags, cr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   319
	VOP_RWUNLOCK(avp, V_WRITELOCK_TRUE, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   320
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   321
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   322
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   323
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   324
sdev_unlocked_access(void *vdv, int mode, struct cred *cr)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   325
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   326
	struct sdev_node	*dv = vdv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   327
	int			shift = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   328
	uid_t			owner = dv->sdev_attr->va_uid;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   329
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   330
	if (crgetuid(cr) != owner) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   331
		shift += 3;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   332
		if (groupmember(dv->sdev_attr->va_gid, cr) == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   333
			shift += 3;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   334
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   335
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   336
	mode &= ~(dv->sdev_attr->va_mode << shift);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   337
	if (mode == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   338
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   339
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   340
	return (secpolicy_vnode_access(cr, SDEVTOV(dv), owner, mode));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   341
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   342
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   343
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   344
sdev_access(struct vnode *vp, int mode, int flags, struct cred *cr)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   345
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   346
	struct sdev_node	*dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   347
	int ret = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   348
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   349
	ASSERT(dv->sdev_attr || dv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   350
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   351
	if (dv->sdev_attrvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   352
		ret = VOP_ACCESS(dv->sdev_attrvp, mode, flags, cr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   353
	} else if (dv->sdev_attr) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   354
		rw_enter(&dv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   355
		ret = sdev_unlocked_access(dv, mode, cr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   356
		if (ret)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   357
			ret = EACCES;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   358
		rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   359
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   360
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   361
	return (ret);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   362
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   363
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   364
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   365
 * Lookup
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   366
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   367
/*ARGSUSED3*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   368
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   369
sdev_lookup(struct vnode *dvp, char *nm, struct vnode **vpp,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   370
    struct pathname *pnp, int flags, struct vnode *rdir, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   371
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   372
	struct sdev_node	*parent;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   373
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   374
	parent = VTOSDEV(dvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   375
	ASSERT(parent);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   376
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   377
	if (!SDEV_IS_GLOBAL(parent))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   378
		return (prof_lookup(dvp, nm, vpp, cred));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   379
	return (devname_lookup_func(parent, nm, vpp, cred, NULL, 0));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   380
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   381
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   382
/*ARGSUSED2*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   383
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   384
sdev_create(struct vnode *dvp, char *nm, struct vattr *vap, vcexcl_t excl,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   385
    int mode, struct vnode **vpp, struct cred *cred, int flag)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   386
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   387
	struct vnode		*vp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   388
	struct vnode		*avp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   389
	struct sdev_node	*parent;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   390
	struct sdev_node	*self = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   391
	int			error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   392
	vtype_t			type = vap->va_type;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   393
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   394
	ASSERT(vap->va_type != VNON &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   395
	    vap->va_type != VBAD);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   396
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   397
	if ((type == VFIFO) || (type == VSOCK) ||
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   398
	    (type == VPROC) || (type == VPORT))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   399
		return (ENOTSUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   400
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   401
	parent = VTOSDEV(dvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   402
	ASSERT(parent);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   403
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   404
	rw_enter(&parent->sdev_dotdot->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   405
	if (parent->sdev_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   406
		rw_exit(&parent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   407
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   408
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   409
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   410
	/* non-global do not allow pure node creation */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   411
	if (!SDEV_IS_GLOBAL(parent)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   412
		rw_exit(&parent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   413
		return (prof_lookup(dvp, nm, vpp, cred));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   414
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   415
	rw_exit(&parent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   416
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   417
again:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   418
	/* check existing name */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   419
	error = VOP_LOOKUP(dvp, nm, &vp, NULL, 0, NULL, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   420
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   421
	/* name found */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   422
	if (error == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   423
		ASSERT(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   424
		if (excl == EXCL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   425
			error = EEXIST;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   426
		} else if ((vp->v_type == VDIR) && (mode & VWRITE)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   427
			/* allowing create/read-only an existing directory */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   428
			error = EISDIR;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   429
		} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   430
			error = VOP_ACCESS(vp, mode, flag, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   431
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   432
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   433
		if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   434
			VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   435
			return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   436
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   437
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   438
		/* truncation first */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   439
		if ((vp->v_type == VREG) && (vap->va_mask & AT_SIZE) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   440
		    (vap->va_size == 0)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   441
			ASSERT(parent->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   442
			ASSERT(VTOSDEV(vp)->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   443
			error = VOP_CREATE(parent->sdev_attrvp,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   444
			    nm, vap, excl, mode, &avp, cred, flag);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   445
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   446
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   447
				VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   448
				return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   449
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   450
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   451
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   452
		sdev_update_timestamps(vp, kcred,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   453
		    AT_CTIME|AT_MTIME|AT_ATIME);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   454
		*vpp = vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   455
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   456
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   457
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   458
	/* bail out early */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   459
	if (error != ENOENT)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   460
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   461
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   462
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   463
	 * For memory-based (ROFS) directory:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   464
	 * 	- either disallow node creation;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   465
	 *	- or implement VOP_CREATE of its own
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   466
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   467
	rw_enter(&parent->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   468
	if (!SDEV_IS_PERSIST(parent)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   469
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   470
		return (ENOTSUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   471
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   472
	ASSERT(parent->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   473
	error = sdev_mknode(parent, nm, &self, vap, NULL, NULL,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   474
	    cred, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   475
	if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   476
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   477
		if (self)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   478
			SDEV_RELE(self);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   479
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   480
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   481
	rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   482
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   483
	ASSERT(self);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   484
	/* take care the timestamps for the node and its parent */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   485
	sdev_update_timestamps(SDEVTOV(self), kcred,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   486
	    AT_CTIME|AT_MTIME|AT_ATIME);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   487
	sdev_update_timestamps(dvp, kcred, AT_MTIME|AT_ATIME);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   488
	if (SDEV_IS_GLOBAL(parent))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   489
		atomic_inc_ulong(&parent->sdev_gdir_gen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   490
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   491
	/* wake up other threads blocked on looking up this node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   492
	mutex_enter(&self->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   493
	SDEV_UNBLOCK_OTHERS(self, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   494
	mutex_exit(&self->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   495
	error = sdev_to_vp(self, vpp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   496
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   497
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   498
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   499
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   500
sdev_remove(struct vnode *dvp, char *nm, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   501
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   502
	int	error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   503
	struct sdev_node *parent = (struct sdev_node *)VTOSDEV(dvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   504
	struct vnode *vp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   505
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   506
	struct devname_nsmap *map = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   507
	struct devname_ops *dirops = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   508
	int (*fn)(devname_handle_t *);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   509
	int len;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   510
	int bkstore = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   511
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   512
	/* bail out early */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   513
	len = strlen(nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   514
	if (nm[0] == '.') {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   515
		if (len == 1) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   516
			return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   517
		} else if (len == 2 && nm[1] == '.') {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   518
			return (EEXIST);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   519
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   520
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   521
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   522
	ASSERT(parent);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   523
	rw_enter(&parent->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   524
	if (!SDEV_IS_GLOBAL(parent)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   525
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   526
		return (ENOTSUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   527
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   528
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   529
	/* check existence first */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   530
	dv = sdev_cache_lookup(parent, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   531
	if (dv == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   532
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   533
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   534
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   535
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   536
	vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   537
	if ((dv->sdev_state == SDEV_INIT) ||
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   538
	    (dv->sdev_state == SDEV_ZOMBIE)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   539
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   540
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   541
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   542
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   543
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   544
	/* the module may record/reject removing a device node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   545
	map = sdev_get_map(parent, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   546
	dirops = map ? map->dir_ops : NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   547
	if (dirops && ((fn = dirops->devnops_remove) != NULL)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   548
		error = (*fn)(&(dv->sdev_handle));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   549
		if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   550
			rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   551
			VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   552
			return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   553
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   554
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   555
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   556
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   557
	 * sdev_dirdelete does the real job of:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   558
	 *  - make sure no open ref count
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   559
	 *  - destroying the sdev_node
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   560
	 *  - releasing the hold on attrvp
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   561
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   562
	bkstore = SDEV_IS_PERSIST(dv) ? 1 : 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   563
	if (!rw_tryupgrade(&parent->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   564
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   565
		rw_enter(&parent->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   566
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   567
	error = sdev_cache_update(parent, &dv, nm, SDEV_CACHE_DELETE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   568
	rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   569
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   570
	sdcmn_err2(("sdev_remove: cache_update error %d\n", error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   571
	if (error && (error != EBUSY)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   572
		/* report errors other than EBUSY */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   573
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   574
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   575
		sdcmn_err2(("sdev_remove: cleaning node %s from cache "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   576
		    " with error %d\n", nm, error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   577
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   578
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   579
		 * best efforts clean up the backing store
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   580
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   581
		if (bkstore) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   582
			ASSERT(parent->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   583
			error = VOP_REMOVE(parent->sdev_attrvp, nm, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   584
			/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   585
			 * do not report BUSY error
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   586
			 * because the backing store ref count is released
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   587
			 * when the last ref count on the sdev_node is
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   588
			 * released.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   589
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   590
			if (error == EBUSY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   591
				sdcmn_err2(("sdev_remove: device %s is still on"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   592
				    "disk %s\n", nm, parent->sdev_path));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   593
				error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   594
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   595
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   596
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   597
		if (error == EBUSY)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   598
			error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   599
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   600
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   601
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   602
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   603
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   604
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   605
 * Some restrictions for this file system:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   606
 *  - both oldnm and newnm are in the scope of /dev file system,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   607
 *    to simply the namespace management model.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   608
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   609
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   610
sdev_rename(struct vnode *odvp, char *onm, struct vnode *ndvp, char *nnm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   611
    struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   612
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   613
	struct sdev_node	*fromparent = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   614
	struct vattr		vattr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   615
	struct sdev_node	*toparent;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   616
	struct sdev_node	*fromdv = NULL;	/* source node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   617
	struct vnode 		*ovp;	/* source vnode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   618
	struct sdev_node	*todv = NULL;	/* destination node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   619
	struct vnode 		*nvp;		/* destination vnode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   620
	int			samedir = 0;	/* set if odvp == ndvp */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   621
	struct vnode		*realvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   622
	int			len;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   623
	char			nnm_path[MAXPATHLEN];
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   624
	struct devname_nsmap 	*omap = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   625
	struct devname_ops	*odirops = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   626
	int (*fn)(devname_handle_t *, char *);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   627
	int (*rmfn)(devname_handle_t *);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   628
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   629
	dev_t fsid;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   630
	int bkstore = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   631
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   632
	/* prevent modifying "." and ".." */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   633
	if ((onm[0] == '.' &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   634
	    (onm[1] == '\0' || (onm[1] == '.' && onm[2] == '\0')))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   635
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   636
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   637
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   638
	fromparent = VTOSDEV(odvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   639
	toparent = VTOSDEV(ndvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   640
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   641
	/* ZOMBIE parent doesn't allow new node creation */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   642
	rw_enter(&fromparent->sdev_dotdot->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   643
	if (fromparent->sdev_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   644
		rw_exit(&fromparent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   645
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   646
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   647
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   648
	/* renaming only supported for global device nodes */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   649
	if (!SDEV_IS_GLOBAL(fromparent)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   650
		rw_exit(&fromparent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   651
		return (ENOTSUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   652
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   653
	rw_exit(&fromparent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   654
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   655
	rw_enter(&toparent->sdev_dotdot->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   656
	if (toparent->sdev_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   657
		rw_exit(&toparent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   658
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   659
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   660
	rw_exit(&toparent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   661
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   662
	/* check existence of the source node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   663
	error = VOP_LOOKUP(odvp, onm, &ovp, NULL, 0, NULL, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   664
	if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   665
		sdcmn_err2(("sdev_rename: the source node %s exists\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   666
		    onm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   667
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   668
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   669
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   670
	if (VOP_REALVP(ovp, &realvp) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   671
		VN_HOLD(realvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   672
		VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   673
		ovp = realvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   674
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   675
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   676
	/* check existence of destination */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   677
	error = VOP_LOOKUP(ndvp, nnm, &nvp, NULL, 0, NULL, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   678
	if (error && (error != ENOENT)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   679
		VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   680
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   681
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   682
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   683
	if (nvp && (VOP_REALVP(nvp, &realvp) == 0)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   684
		VN_HOLD(realvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   685
		VN_RELE(nvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   686
		nvp = realvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   687
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   688
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   689
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   690
	 * For now, if both exist, they must be the same type.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   691
	 * Changing the type of a node probably needs some special
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   692
	 * handling.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   693
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   694
	if (ovp && nvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   695
		if (ovp->v_type != nvp->v_type) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   696
			VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   697
			VN_RELE(nvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   698
			return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   699
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   700
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   701
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   702
	/* make sure the source and the destination are in /dev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   703
	if (odvp != ndvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   704
		vattr.va_mask = AT_FSID;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   705
		if (error = VOP_GETATTR(odvp, &vattr, 0, cred)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   706
			VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   707
			return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   708
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   709
		fsid = vattr.va_fsid;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   710
		vattr.va_mask = AT_FSID;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   711
		if (error = VOP_GETATTR(ndvp, &vattr, 0, cred)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   712
			VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   713
			return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   714
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   715
		if (fsid != vattr.va_fsid) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   716
			VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   717
			return (EXDEV);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   718
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   719
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   720
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   721
	/* make sure the old entry can be deleted */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   722
	error = VOP_ACCESS(odvp, VWRITE, 0, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   723
	if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   724
		VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   725
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   726
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   727
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   728
	/* make sure the destination allows creation */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   729
	samedir = (fromparent == toparent);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   730
	if (!samedir) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   731
		error = VOP_ACCESS(ndvp, VEXEC|VWRITE, 0, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   732
		if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   733
			VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   734
			return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   735
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   736
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   737
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   738
	fromdv = VTOSDEV(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   739
	ASSERT(fromdv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   740
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   741
	/* check with the plug-in modules for the source directory */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   742
	rw_enter(&fromparent->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   743
	omap = sdev_get_map(fromparent, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   744
	rw_exit(&fromparent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   745
	odirops = omap ? omap->dir_ops : NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   746
	if (odirops && ((fn = odirops->devnops_rename) != NULL)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   747
		if (samedir) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   748
			error = (*fn)(&(fromdv->sdev_handle), nnm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   749
		} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   750
			len = strlen(nnm) + strlen(toparent->sdev_name) + 2;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   751
			(void) snprintf(nnm_path, len, "%s/%s",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   752
			    toparent->sdev_name, nnm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   753
			error = (*fn)(&(fromdv->sdev_handle), nnm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   754
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   755
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   756
		if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   757
			VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   758
			return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   759
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   760
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   761
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   762
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   763
	 * Remove the destination if exist
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   764
	 * On failure, we should attempt to restore the current state
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   765
	 * before returning error.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   766
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   767
	if (nvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   768
		switch (nvp->v_type) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   769
		case VDIR:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   770
			error = VOP_RMDIR(ndvp, nnm, ndvp, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   771
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   772
		default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   773
			error = VOP_REMOVE(ndvp, nnm, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   774
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   775
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   776
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   777
		if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   778
			sdcmn_err2(("sdev_rename: removing existing destination"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   779
			    " %s failed, error %d\n", nnm, error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   780
			VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   781
			VN_RELE(nvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   782
			return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   783
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   784
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   785
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   786
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   787
	 * link source to new target in the memory
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   788
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   789
	error = VOP_LOOKUP(ndvp, nnm, &nvp, NULL, 0, NULL, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   790
	if (error && (error != ENOENT)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   791
		VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   792
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   793
	} else if (error == ENOENT) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   794
		/* make a new node from the old node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   795
		error = sdev_rnmnode(fromparent, fromdv, toparent, &todv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   796
		    nnm, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   797
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   798
		ASSERT(nvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   799
		if (VOP_REALVP(nvp, &realvp) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   800
			VN_HOLD(realvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   801
			VN_RELE(nvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   802
			nvp = realvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   803
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   804
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   805
		/* destination file exists */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   806
		todv = VTOSDEV(nvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   807
		ASSERT(todv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   808
		error = sdev_rnmnode(fromparent, fromdv, toparent, &todv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   809
		    nnm, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   810
		if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   811
			sdcmn_err2(("sdev_rename: renaming %s to %s failed "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   812
			    " with existing destination error %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   813
			    onm, nnm, error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   814
			VN_RELE(nvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   815
			VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   816
			return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   817
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   818
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   819
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   820
	/* unlink from source */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   821
	if (error == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   822
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   823
		 * check with the plug-in module whether source can be
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   824
		 * re-used or not
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   825
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   826
		if (odirops && ((rmfn = odirops->devnops_remove) != NULL)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   827
			error = (*rmfn)(&(fromdv->sdev_handle));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   828
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   829
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   830
		if (error == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   831
			bkstore = SDEV_IS_PERSIST(fromdv) ? 1 : 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   832
			rw_enter(&fromparent->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   833
			error = sdev_cache_update(fromparent, &fromdv, onm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   834
			    SDEV_CACHE_DELETE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   835
			rw_exit(&fromparent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   836
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   837
			/* best effforts clean up the backing store */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   838
			if (bkstore) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   839
				ASSERT(fromparent->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   840
				error = VOP_REMOVE(fromparent->sdev_attrvp,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   841
				    onm, kcred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   842
				if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   843
					sdcmn_err2(("sdev_rename: device %s is "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   844
					    "still on disk %s\n", onm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   845
					    fromparent->sdev_path));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   846
					error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   847
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   848
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   849
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   850
			if (error == EBUSY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   851
				error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   852
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   853
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   854
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   855
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   856
	/* book keeping the ovp v_count */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   857
	if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   858
		sdcmn_err2(("sdev_rename: renaming %s to %s failed "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   859
		    " with error %d\n", onm, nnm, error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   860
		VN_RELE(ovp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   861
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   862
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   863
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   864
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   865
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   866
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   867
 * dev-fs version of "ln -s path dev-name"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   868
 *	tnm - path, e.g. /devices/... or /dev/...
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   869
 *	lnm - dev_name
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   870
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   871
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   872
sdev_symlink(struct vnode *dvp, char *lnm, struct vattr *tva,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   873
    char *tnm, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   874
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   875
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   876
	struct vnode *vp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   877
	struct sdev_node *parent = (struct sdev_node *)VTOSDEV(dvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   878
	struct sdev_node *self = (struct sdev_node *)NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   879
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   880
	ASSERT(parent);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   881
	rw_enter(&parent->sdev_dotdot->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   882
	if (parent->sdev_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   883
		rw_exit(&parent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   884
		sdcmn_err2(("sdev_symlink: parent %s is ZOMBIED \n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   885
		    parent->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   886
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   887
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   888
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   889
	if (!SDEV_IS_GLOBAL(parent)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   890
		rw_exit(&parent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   891
		return (ENOTSUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   892
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   893
	rw_exit(&parent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   894
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   895
	/* find existing name */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   896
	error = VOP_LOOKUP(dvp, lnm, &vp, NULL, 0, NULL, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   897
	if (error == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   898
		ASSERT(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   899
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   900
		sdcmn_err2(("sdev_symlink: node %s already exists\n", lnm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   901
		return (EEXIST);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   902
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   903
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   904
	if (error != ENOENT) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   905
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   906
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   907
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   908
	/* put it into memory cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   909
	rw_enter(&parent->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   910
	error = sdev_mknode(parent, lnm, &self, tva, NULL, (void *)tnm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   911
	    cred, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   912
	if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   913
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   914
		sdcmn_err2(("sdev_symlink: node %s creation failed\n", lnm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   915
		if (self)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   916
			SDEV_RELE(self);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   917
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   918
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   919
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   920
	ASSERT(self && (self->sdev_state == SDEV_READY));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   921
	rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   922
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   923
	/* take care the timestamps for the node and its parent */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   924
	sdev_update_timestamps(SDEVTOV(self), kcred,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   925
	    AT_CTIME|AT_MTIME|AT_ATIME);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   926
	sdev_update_timestamps(dvp, kcred, AT_MTIME|AT_ATIME);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   927
	if (SDEV_IS_GLOBAL(parent))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   928
		atomic_inc_ulong(&parent->sdev_gdir_gen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   929
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   930
	/* wake up other threads blocked on looking up this node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   931
	mutex_enter(&self->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   932
	SDEV_UNBLOCK_OTHERS(self, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   933
	mutex_exit(&self->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   934
	SDEV_RELE(self);	/* don't return with vnode held */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   935
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   936
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   937
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   938
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   939
sdev_mkdir(struct vnode *dvp, char *nm, struct vattr *va, struct vnode **vpp,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   940
    struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   941
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   942
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   943
	struct sdev_node *parent = (struct sdev_node *)VTOSDEV(dvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   944
	struct sdev_node *self = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   945
	struct vnode	*vp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   946
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   947
	ASSERT(parent && parent->sdev_dotdot);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   948
	rw_enter(&parent->sdev_dotdot->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   949
	if (parent->sdev_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   950
		rw_exit(&parent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   951
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   952
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   953
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   954
	/* non-global do not allow pure directory creation */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   955
	if (!SDEV_IS_GLOBAL(parent)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   956
		rw_exit(&parent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   957
		return (prof_lookup(dvp, nm, vpp, cred));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   958
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   959
	rw_exit(&parent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   960
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   961
	/* find existing name */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   962
	error = VOP_LOOKUP(dvp, nm, &vp, NULL, 0, NULL, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   963
	if (error == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   964
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   965
		return (EEXIST);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   966
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   967
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   968
	if (error != ENOENT)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   969
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   970
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   971
	/* put it into memory */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   972
	rw_enter(&parent->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   973
	error = sdev_mknode(parent, nm, &self,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   974
	    va, NULL, NULL, cred, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   975
	if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   976
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   977
		if (self)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   978
			SDEV_RELE(self);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   979
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   980
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   981
	ASSERT(self && (self->sdev_state == SDEV_READY));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   982
	rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   983
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   984
	/* take care the timestamps for the node and its parent */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   985
	sdev_update_timestamps(SDEVTOV(self), kcred,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   986
	    AT_CTIME|AT_MTIME|AT_ATIME);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   987
	sdev_update_timestamps(dvp, kcred, AT_MTIME|AT_ATIME);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   988
	if (SDEV_IS_GLOBAL(parent))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   989
		atomic_inc_ulong(&parent->sdev_gdir_gen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   990
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   991
	/* wake up other threads blocked on looking up this node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   992
	mutex_enter(&self->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   993
	SDEV_UNBLOCK_OTHERS(self, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   994
	mutex_exit(&self->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   995
	*vpp = SDEVTOV(self);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   996
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   997
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   998
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   999
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1000
 * allowing removing an empty directory under /dev
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1001
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1002
/*ARGSUSED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1003
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1004
sdev_rmdir(struct vnode *dvp, char *nm, struct vnode *cdir, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1005
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1006
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1007
	struct sdev_node *parent = (struct sdev_node *)VTOSDEV(dvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1008
	struct sdev_node *self = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1009
	struct vnode *vp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1010
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1011
	/* bail out early */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1012
	if (strcmp(nm, ".") == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1013
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1014
	if (strcmp(nm, "..") == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1015
		return (EEXIST); /* should be ENOTEMPTY */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1016
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1017
	/* no destruction of non-global node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1018
	ASSERT(parent && parent->sdev_dotdot);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1019
	rw_enter(&parent->sdev_dotdot->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1020
	if (!SDEV_IS_GLOBAL(parent)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1021
		rw_exit(&parent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1022
		return (ENOTSUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1023
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1024
	rw_exit(&parent->sdev_dotdot->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1025
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1026
	/* check existing name */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1027
	rw_enter(&parent->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1028
	self = sdev_cache_lookup(parent, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1029
	if (self == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1030
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1031
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1032
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1033
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1034
	vp = SDEVTOV(self);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1035
	if ((self->sdev_state == SDEV_INIT) ||
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1036
	    (self->sdev_state == SDEV_ZOMBIE)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1037
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1038
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1039
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1040
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1041
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1042
	/* some sanity checks */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1043
	if (vp == dvp || vp == cdir) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1044
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1045
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1046
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1047
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1048
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1049
	if (vp->v_type != VDIR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1050
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1051
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1052
		return (ENOTDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1053
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1054
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1055
	if (vn_vfswlock(vp)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1056
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1057
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1058
		return (EBUSY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1059
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1060
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1061
	if (vn_mountedvfs(vp) != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1062
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1063
		vn_vfsunlock(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1064
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1065
		return (EBUSY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1066
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1067
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1068
	self = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1069
	/* bail out on a non-empty directory */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1070
	rw_enter(&self->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1071
	if (self->sdev_nlink > 2) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1072
		rw_exit(&self->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1073
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1074
		vn_vfsunlock(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1075
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1076
		return (ENOTEMPTY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1077
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1078
	rw_exit(&self->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1079
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1080
	/* unlink it from the directory cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1081
	error = sdev_cache_update(parent, &self, nm, SDEV_CACHE_DELETE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1082
	rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1083
	vn_vfsunlock(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1084
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1085
	if (error && (error != EBUSY)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1086
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1087
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1088
		sdcmn_err2(("sdev_rmdir: cleaning node %s from directory "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1089
		    " cache with error %d\n", nm, error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1090
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1091
		/* best effort to clean up the backing store */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1092
		if (SDEV_IS_PERSIST(parent)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1093
			ASSERT(parent->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1094
			error = VOP_RMDIR(parent->sdev_attrvp, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1095
			    parent->sdev_attrvp, kcred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1096
			sdcmn_err2(("sdev_rmdir: cleaning device %s is on"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1097
			    " disk error %d\n", parent->sdev_path, error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1098
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1099
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1100
		if (error == EBUSY)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1101
			error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1102
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1103
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1104
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1105
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1106
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1107
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1108
 * read the contents of a symbolic link
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1109
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1110
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1111
sdev_readlink(struct vnode *vp, struct uio *uiop, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1112
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1113
	struct sdev_node *dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1114
	int	error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1115
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1116
	ASSERT(vp->v_type == VLNK);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1117
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1118
	dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1119
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1120
	if (dv->sdev_attrvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1121
		/* non-NULL attrvp implys a persisted node at READY state */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1122
		return (VOP_READLINK(dv->sdev_attrvp, uiop, cred));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1123
	} else if (dv->sdev_symlink != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1124
		/* memory nodes, e.g. local nodes */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1125
		rw_enter(&dv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1126
		sdcmn_err2(("sdev_readlink link is %s\n", dv->sdev_symlink));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1127
		error = uiomove(dv->sdev_symlink, strlen(dv->sdev_symlink),
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1128
		    UIO_READ, uiop);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1129
		rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1130
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1131
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1132
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1133
	return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1134
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1135
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1136
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1137
sdev_readdir(struct vnode *dvp, struct uio *uiop, struct cred *cred, int *eofp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1138
{
2679
39fc2aead8db 6464694 assert failure during "ls $ZONEROOT/dev/pts"
szhou
parents: 2621
diff changeset
  1139
	struct sdev_node *parent = VTOSDEV(dvp);
39fc2aead8db 6464694 assert failure during "ls $ZONEROOT/dev/pts"
szhou
parents: 2621
diff changeset
  1140
39fc2aead8db 6464694 assert failure during "ls $ZONEROOT/dev/pts"
szhou
parents: 2621
diff changeset
  1141
	ASSERT(parent);
39fc2aead8db 6464694 assert failure during "ls $ZONEROOT/dev/pts"
szhou
parents: 2621
diff changeset
  1142
	if (!SDEV_IS_GLOBAL(parent))
39fc2aead8db 6464694 assert failure during "ls $ZONEROOT/dev/pts"
szhou
parents: 2621
diff changeset
  1143
		prof_filldir(parent);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1144
	return (devname_readdir_func(dvp, uiop, cred, eofp, SDEV_BROWSE));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1145
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1146
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1147
/*ARGSUSED1*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1148
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1149
sdev_inactive(struct vnode *vp, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1150
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1151
	int clean;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1152
	struct sdev_node *dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1153
	struct sdev_node *ddv = dv->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1154
	struct sdev_node *idv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1155
	struct sdev_node *prev = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1156
	int state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1157
	struct devname_nsmap *map = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1158
	struct devname_ops	*dirops = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1159
	void (*fn)(devname_handle_t *, struct cred *) = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1160
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1161
	rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1162
	state = dv->sdev_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1163
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1164
	mutex_enter(&vp->v_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1165
	ASSERT(vp->v_count >= 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1166
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1167
	clean = (vp->v_count == 1) && (state == SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1168
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1169
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1170
	 * last ref count on the ZOMBIE node is released.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1171
	 * clean up the sdev_node, and
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1172
	 * release the hold on the backing store node so that
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1173
	 * the ZOMBIE backing stores also cleaned out.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1174
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1175
	if (clean) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1176
		ASSERT(ddv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1177
		if (SDEV_IS_GLOBAL(dv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1178
			map = ddv->sdev_mapinfo;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1179
			dirops = map ? map->dir_ops : NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1180
			if (dirops && (fn = dirops->devnops_inactive))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1181
				(*fn)(&(dv->sdev_handle), cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1182
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1183
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1184
		ddv->sdev_nlink--;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1185
		if (vp->v_type == VDIR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1186
			dv->sdev_nlink--;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1187
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1188
		for (idv = ddv->sdev_dot; idv && idv != dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1189
		    prev = idv, idv = idv->sdev_next);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1190
		ASSERT(idv == dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1191
		if (prev == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1192
			ddv->sdev_dot = dv->sdev_next;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1193
		else
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1194
			prev->sdev_next = dv->sdev_next;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1195
		dv->sdev_next = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1196
		dv->sdev_nlink--;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1197
		--vp->v_count;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1198
		mutex_exit(&vp->v_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1199
		sdev_nodedestroy(dv, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1200
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1201
		--vp->v_count;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1202
		mutex_exit(&vp->v_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1203
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1204
	rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1205
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1206
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1207
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1208
sdev_fid(struct vnode *vp, struct fid *fidp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1209
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1210
	struct sdev_node	*dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1211
	struct sdev_fid	*sdev_fid;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1212
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1213
	if (fidp->fid_len < (sizeof (struct sdev_fid) - sizeof (ushort_t))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1214
		fidp->fid_len = sizeof (struct sdev_fid) - sizeof (ushort_t);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1215
		return (ENOSPC);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1216
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1217
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1218
	sdev_fid = (struct sdev_fid *)fidp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1219
	bzero(sdev_fid, sizeof (struct sdev_fid));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1220
	sdev_fid->sdevfid_len =
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1221
	    (int)sizeof (struct sdev_fid) - sizeof (ushort_t);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1222
	sdev_fid->sdevfid_ino = dv->sdev_ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1223
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1224
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1225
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1226
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1227
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1228
 * This pair of routines bracket all VOP_READ, VOP_WRITE
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1229
 * and VOP_READDIR requests.  The contents lock stops things
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1230
 * moving around while we're looking at them.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1231
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1232
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1233
sdev_rwlock(struct vnode *vp, int write_flag)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1234
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1235
	rw_enter(&VTOSDEV(vp)->sdev_contents, write_flag ? RW_WRITER :
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1236
		RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1237
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1238
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1239
/*ARGSUSED1*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1240
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1241
sdev_rwunlock(struct vnode *vp, int write_flag)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1242
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1243
	rw_exit(&VTOSDEV(vp)->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1244
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1245
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1246
/*ARGSUSED1*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1247
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1248
sdev_seek(struct vnode *vp, offset_t ooff, offset_t *noffp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1249
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1250
	struct vnode *attrvp = VTOSDEV(vp)->sdev_attrvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1251
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1252
	ASSERT(vp->v_type != VCHR &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1253
	    vp->v_type != VBLK && vp->v_type != VLNK);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1254
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1255
	if (vp->v_type == VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1256
		return (fs_seek(vp, ooff, noffp));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1257
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1258
	ASSERT(attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1259
	return (VOP_SEEK(attrvp, ooff, noffp));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1260
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1261
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1262
/*ARGSUSED1*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1263
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1264
sdev_frlock(struct vnode *vp, int cmd, struct flock64 *bfp, int flag,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1265
    offset_t offset, struct flk_callback *flk_cbp, struct cred *cr)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1266
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1267
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1268
	struct sdev_node *dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1269
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1270
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1271
	ASSERT(dv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1272
	error = VOP_FRLOCK(dv->sdev_attrvp, cmd, bfp, flag, offset,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1273
	    flk_cbp, cr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1274
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1275
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1276
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1277
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1278
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1279
sdev_setfl(struct vnode *vp, int oflags, int nflags, cred_t *cr)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1280
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1281
	struct sdev_node *dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1282
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1283
	ASSERT(dv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1284
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1285
	return (VOP_SETFL(dv->sdev_attrvp, oflags, nflags, cr));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1286
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1287
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1288
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1289
sdev_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1290
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1291
	switch (cmd) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1292
	case _PC_ACL_ENABLED:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1293
		*valp = SDEV_ACL_FLAVOR(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1294
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1295
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1296
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1297
	return (fs_pathconf(vp, cmd, valp, cr));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1298
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1299
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1300
vnodeops_t *sdev_vnodeops;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1301
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1302
const fs_operation_def_t sdev_vnodeops_tbl[] = {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1303
	VOPNAME_OPEN, sdev_open,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1304
	VOPNAME_CLOSE, sdev_close,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1305
	VOPNAME_READ, sdev_read,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1306
	VOPNAME_WRITE, sdev_write,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1307
	VOPNAME_IOCTL, sdev_ioctl,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1308
	VOPNAME_GETATTR, sdev_getattr,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1309
	VOPNAME_SETATTR, sdev_setattr,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1310
	VOPNAME_ACCESS, sdev_access,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1311
	VOPNAME_LOOKUP, sdev_lookup,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1312
	VOPNAME_CREATE, sdev_create,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1313
	VOPNAME_RENAME, sdev_rename,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1314
	VOPNAME_REMOVE, sdev_remove,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1315
	VOPNAME_MKDIR, sdev_mkdir,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1316
	VOPNAME_RMDIR, sdev_rmdir,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1317
	VOPNAME_READDIR, sdev_readdir,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1318
	VOPNAME_SYMLINK, sdev_symlink,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1319
	VOPNAME_READLINK, sdev_readlink, /* readlink */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1320
	VOPNAME_FSYNC, (fs_generic_func_p) fs_sync,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1321
	VOPNAME_INACTIVE, (fs_generic_func_p)sdev_inactive,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1322
	VOPNAME_FID, sdev_fid,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1323
	VOPNAME_RWLOCK, (fs_generic_func_p)sdev_rwlock,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1324
	VOPNAME_RWUNLOCK, (fs_generic_func_p)sdev_rwunlock,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1325
	VOPNAME_SEEK, sdev_seek,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1326
	VOPNAME_FRLOCK, sdev_frlock,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1327
	VOPNAME_PATHCONF, sdev_pathconf,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1328
	VOPNAME_SETFL, sdev_setfl,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1329
	VOPNAME_SETSECATTR, sdev_setsecattr,	/* setsecattr */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1330
	VOPNAME_GETSECATTR, sdev_getsecattr,	/* getsecattr */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1331
	NULL, NULL
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1332
};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1333
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1334
int sdev_vnodeops_tbl_size = sizeof (sdev_vnodeops_tbl);