usr/src/uts/common/fs/dev/sdev_subr.c
author cth
Fri, 22 Feb 2008 09:02:16 -0800
changeset 6065 b05c5c670963
parent 5895 f251acdd9bdc
child 6260 0ca1934af628
permissions -rw-r--r--
6453345 devfs_getattr violates devfs locking rules 6527396 devfsadm -C taking hours after reconfiguration reboot 6661843 i_ddi_di_cache_invalidate() should only use taskq_dispatch on valid->invalid 6662461 reserved_links_exist() should be optimized
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
/*
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
    22
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
2621
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
 * utility routines for the /dev fs
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    32
#include <sys/types.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    33
#include <sys/param.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    34
#include <sys/t_lock.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    35
#include <sys/systm.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    36
#include <sys/sysmacros.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    37
#include <sys/user.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    38
#include <sys/time.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    39
#include <sys/vfs.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    40
#include <sys/vnode.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    41
#include <sys/file.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    42
#include <sys/fcntl.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    43
#include <sys/flock.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    44
#include <sys/kmem.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    45
#include <sys/uio.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    46
#include <sys/errno.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    47
#include <sys/stat.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    48
#include <sys/cred.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    49
#include <sys/dirent.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    50
#include <sys/pathname.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    51
#include <sys/cmn_err.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    52
#include <sys/debug.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    53
#include <sys/mode.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    54
#include <sys/policy.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    55
#include <fs/fs_subr.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    56
#include <sys/mount.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    57
#include <sys/fs/snode.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    58
#include <sys/fs/dv_node.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    59
#include <sys/fs/sdev_impl.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    60
#include <sys/fs/sdev_node.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    61
#include <sys/sunndi.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    62
#include <sys/sunmdi.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    63
#include <sys/conf.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    64
#include <sys/proc.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    65
#include <sys/user.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    66
#include <sys/modctl.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    67
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    68
#ifdef DEBUG
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    69
int sdev_debug = 0x00000001;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    70
int sdev_debug_cache_flags = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    71
#endif
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    72
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    73
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    74
 * globals
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
/* prototype memory vattrs */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    77
vattr_t sdev_vattr_dir = {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    78
	AT_TYPE|AT_MODE|AT_UID|AT_GID,		/* va_mask */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    79
	VDIR,					/* va_type */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    80
	SDEV_DIRMODE_DEFAULT,			/* va_mode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    81
	SDEV_UID_DEFAULT,			/* va_uid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    82
	SDEV_GID_DEFAULT,			/* va_gid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    83
	0,					/* va_fsid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    84
	0,					/* va_nodeid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    85
	0,					/* va_nlink */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    86
	0,					/* va_size */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    87
	0,					/* va_atime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    88
	0,					/* va_mtime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    89
	0,					/* va_ctime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    90
	0,					/* va_rdev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    91
	0,					/* va_blksize */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    92
	0,					/* va_nblocks */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    93
	0					/* va_vcode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    94
};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    95
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    96
vattr_t sdev_vattr_lnk = {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    97
	AT_TYPE|AT_MODE,			/* va_mask */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    98
	VLNK,					/* va_type */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    99
	SDEV_LNKMODE_DEFAULT,			/* va_mode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   100
	SDEV_UID_DEFAULT,			/* va_uid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   101
	SDEV_GID_DEFAULT,			/* va_gid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   102
	0,					/* va_fsid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   103
	0,					/* va_nodeid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   104
	0,					/* va_nlink */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   105
	0,					/* va_size */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   106
	0,					/* va_atime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   107
	0,					/* va_mtime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   108
	0,					/* va_ctime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   109
	0,					/* va_rdev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   110
	0,					/* va_blksize */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   111
	0,					/* va_nblocks */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   112
	0					/* va_vcode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   113
};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   114
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   115
vattr_t sdev_vattr_blk = {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   116
	AT_TYPE|AT_MODE|AT_UID|AT_GID,		/* va_mask */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   117
	VBLK,					/* va_type */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   118
	S_IFBLK | SDEV_DEVMODE_DEFAULT,		/* va_mode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   119
	SDEV_UID_DEFAULT,			/* va_uid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   120
	SDEV_GID_DEFAULT,			/* va_gid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   121
	0,					/* va_fsid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   122
	0,					/* va_nodeid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   123
	0,					/* va_nlink */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   124
	0,					/* va_size */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   125
	0,					/* va_atime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   126
	0,					/* va_mtime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   127
	0,					/* va_ctime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   128
	0,					/* va_rdev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   129
	0,					/* va_blksize */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   130
	0,					/* va_nblocks */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   131
	0					/* va_vcode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   132
};
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
vattr_t sdev_vattr_chr = {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   135
	AT_TYPE|AT_MODE|AT_UID|AT_GID,		/* va_mask */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   136
	VCHR,					/* va_type */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   137
	S_IFCHR | SDEV_DEVMODE_DEFAULT,		/* va_mode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   138
	SDEV_UID_DEFAULT,			/* va_uid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   139
	SDEV_GID_DEFAULT,			/* va_gid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   140
	0,					/* va_fsid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   141
	0,					/* va_nodeid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   142
	0,					/* va_nlink */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   143
	0,					/* va_size */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   144
	0,					/* va_atime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   145
	0,					/* va_mtime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   146
	0,					/* va_ctime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   147
	0,					/* va_rdev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   148
	0,					/* va_blksize */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   149
	0,					/* va_nblocks */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   150
	0					/* va_vcode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   151
};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   152
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   153
kmem_cache_t	*sdev_node_cache;	/* sdev_node cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   154
int		devtype;		/* fstype */
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
struct devname_ops *devname_ns_ops;	/* default name service directory ops */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   157
kmutex_t devname_nsmaps_lock;	/* protect devname_nsmaps */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   158
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   159
/* static */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   160
static struct devname_nsmap *devname_nsmaps = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   161
				/* contents from /etc/dev/devname_master */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   162
static int devname_nsmaps_invalidated = 0; /* "devfsadm -m" has run */
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
static struct vnodeops *sdev_get_vop(struct sdev_node *);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   165
static void sdev_set_no_nocache(struct sdev_node *);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   166
static int sdev_get_moduleops(struct sdev_node *);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   167
static fs_operation_def_t *sdev_merge_vtab(const fs_operation_def_t []);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   168
static void sdev_free_vtab(fs_operation_def_t *);
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
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   171
sdev_prof_free(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   172
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   173
	ASSERT(!SDEV_IS_GLOBAL(dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   174
	if (dv->sdev_prof.dev_name)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   175
		nvlist_free(dv->sdev_prof.dev_name);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   176
	if (dv->sdev_prof.dev_map)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   177
		nvlist_free(dv->sdev_prof.dev_map);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   178
	if (dv->sdev_prof.dev_symlink)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   179
		nvlist_free(dv->sdev_prof.dev_symlink);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   180
	if (dv->sdev_prof.dev_glob_incdir)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   181
		nvlist_free(dv->sdev_prof.dev_glob_incdir);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   182
	if (dv->sdev_prof.dev_glob_excdir)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   183
		nvlist_free(dv->sdev_prof.dev_glob_excdir);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   184
	bzero(&dv->sdev_prof, sizeof (dv->sdev_prof));
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
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   188
 * sdev_node cache constructor
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   189
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   190
/*ARGSUSED1*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   191
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   192
i_sdev_node_ctor(void *buf, void *cfarg, int flag)
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
	struct sdev_node *dv = (struct sdev_node *)buf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   195
	struct vnode *vp;
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(flag == KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   198
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   199
	bzero(buf, sizeof (struct sdev_node));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   200
	rw_init(&dv->sdev_contents, NULL, RW_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   201
	dv->sdev_vnode = vn_alloc(KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   202
	vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   203
	vp->v_data = (caddr_t)dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   204
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   205
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   206
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   207
/* sdev_node destructor for kmem cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   208
/*ARGSUSED1*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   209
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   210
i_sdev_node_dtor(void *buf, void *arg)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   211
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   212
	struct sdev_node *dv = (struct sdev_node *)buf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   213
	struct vnode *vp = SDEVTOV(dv);
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
	rw_destroy(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   216
	vn_free(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   217
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   218
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   219
/* initialize sdev_node cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   220
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   221
sdev_node_cache_init()
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
	int flags = 0;
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
#ifdef	DEBUG
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   226
	flags = sdev_debug_cache_flags;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   227
	if (flags)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   228
		sdcmn_err(("cache debug flags 0x%x\n", flags));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   229
#endif	/* DEBUG */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   230
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   231
	ASSERT(sdev_node_cache == NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   232
	sdev_node_cache = kmem_cache_create("sdev_node_cache",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   233
	    sizeof (struct sdev_node), 0, i_sdev_node_ctor, i_sdev_node_dtor,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   234
	    NULL, NULL, NULL, flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   235
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   236
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   237
/* destroy sdev_node cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   238
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   239
sdev_node_cache_fini()
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   240
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   241
	ASSERT(sdev_node_cache != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   242
	kmem_cache_destroy(sdev_node_cache);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   243
	sdev_node_cache = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   244
}
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
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   247
sdev_set_nodestate(struct sdev_node *dv, sdev_node_state_t state)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   248
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   249
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   250
	ASSERT(RW_WRITE_HELD(&dv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   251
	dv->sdev_state = state;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   254
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   255
sdev_attrinit(struct sdev_node *dv, vattr_t *vap)
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
	timestruc_t now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   258
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   259
	ASSERT(vap);
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
	dv->sdev_attr = kmem_zalloc(sizeof (struct vattr), KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   262
	*dv->sdev_attr = *vap;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   263
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   264
	dv->sdev_attr->va_mode = MAKEIMODE(vap->va_type, vap->va_mode);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   265
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   266
	gethrestime(&now);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   267
	dv->sdev_attr->va_atime = now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   268
	dv->sdev_attr->va_mtime = now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   269
	dv->sdev_attr->va_ctime = now;
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
/* alloc and initialize a sdev_node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   273
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   274
sdev_nodeinit(struct sdev_node *ddv, char *nm, struct sdev_node **newdv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   275
    vattr_t *vap)
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
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   278
	struct vnode *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   279
	size_t nmlen, len;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   280
	devname_handle_t  *dhl;
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
	nmlen = strlen(nm) + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   283
	if (nmlen > MAXNAMELEN) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   284
		sdcmn_err9(("sdev_nodeinit: node name %s"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   285
		    " too long\n", nm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   286
		*newdv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   287
		return (ENAMETOOLONG);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   290
	dv = kmem_cache_alloc(sdev_node_cache, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   291
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   292
	dv->sdev_name = kmem_alloc(nmlen, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   293
	bcopy(nm, dv->sdev_name, nmlen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   294
	dv->sdev_namelen = nmlen - 1;	/* '\0' not included */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   295
	len = strlen(ddv->sdev_path) + strlen(nm) + 2;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   296
	dv->sdev_path = kmem_alloc(len, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   297
	(void) snprintf(dv->sdev_path, len, "%s/%s", ddv->sdev_path, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   298
	/* overwritten for VLNK nodes */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   299
	dv->sdev_symlink = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   300
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   301
	vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   302
	vn_reinit(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   303
	vp->v_vfsp = SDEVTOV(ddv)->v_vfsp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   304
	if (vap)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   305
		vp->v_type = vap->va_type;
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
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   308
	 * initialized to the parent's vnodeops.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   309
	 * maybe overwriten for a VDIR
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   310
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   311
	vn_setops(vp, vn_getops(SDEVTOV(ddv)));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   312
	vn_exists(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   313
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   314
	dv->sdev_dotdot = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   315
	dv->sdev_dot = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   316
	dv->sdev_next = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   317
	dv->sdev_attrvp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   318
	if (vap) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   319
		sdev_attrinit(dv, vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   320
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   321
		dv->sdev_attr = NULL;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   324
	dv->sdev_ino = sdev_mkino(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   325
	dv->sdev_nlink = 0;		/* updated on insert */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   326
	dv->sdev_flags = ddv->sdev_flags; /* inherit from the parent first */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   327
	dv->sdev_flags |= SDEV_BUILD;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   328
	mutex_init(&dv->sdev_lookup_lock, NULL, MUTEX_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   329
	cv_init(&dv->sdev_lookup_cv, NULL, CV_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   330
	if (SDEV_IS_GLOBAL(ddv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   331
		dv->sdev_flags |= SDEV_GLOBAL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   332
		dv->sdev_mapinfo = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   333
		dhl = &(dv->sdev_handle);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   334
		dhl->dh_data = dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   335
		dhl->dh_spec = DEVNAME_NS_NONE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   336
		dhl->dh_args = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   337
		sdev_set_no_nocache(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   338
		dv->sdev_gdir_gen = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   339
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   340
		dv->sdev_flags &= ~SDEV_GLOBAL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   341
		dv->sdev_origin = NULL; /* set later */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   342
		bzero(&dv->sdev_prof, sizeof (dv->sdev_prof));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   343
		dv->sdev_ldir_gen = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   344
		dv->sdev_devtree_gen = 0;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   347
	rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   348
	sdev_set_nodestate(dv, SDEV_INIT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   349
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   350
	*newdv = dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   351
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   352
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   353
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   354
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   355
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   356
 * transition a sdev_node into SDEV_READY state
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   357
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   358
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   359
sdev_nodeready(struct sdev_node *dv, struct vattr *vap, struct vnode *avp,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   360
    void *args, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   361
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   362
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   363
	struct vnode *vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   364
	vtype_t type;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   365
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   366
	ASSERT(dv && (dv->sdev_state != SDEV_READY) && vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   367
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   368
	type = vap->va_type;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   369
	vp->v_type = type;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   370
	vp->v_rdev = vap->va_rdev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   371
	rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   372
	if (type == VDIR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   373
		dv->sdev_nlink = 2;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   374
		dv->sdev_flags &= ~SDEV_PERSIST;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   375
		dv->sdev_flags &= ~SDEV_DYNAMIC;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   376
		vn_setops(vp, sdev_get_vop(dv)); /* from internal vtab */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   377
		error = sdev_get_moduleops(dv); /* from plug-in module */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   378
		ASSERT(dv->sdev_dotdot);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   379
		ASSERT(SDEVTOV(dv->sdev_dotdot)->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   380
		vp->v_rdev = SDEVTOV(dv->sdev_dotdot)->v_rdev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   381
	} else if (type == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   382
		ASSERT(args);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   383
		dv->sdev_nlink = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   384
		dv->sdev_symlink = i_ddi_strdup((char *)args, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   385
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   386
		dv->sdev_nlink = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   387
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   388
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   389
	if (!(SDEV_IS_GLOBAL(dv))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   390
		dv->sdev_origin = (struct sdev_node *)args;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   391
		dv->sdev_flags &= ~SDEV_PERSIST;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   392
	}
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
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   395
	 * shadow node is created here OR
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   396
	 * if failed (indicated by dv->sdev_attrvp == NULL),
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   397
	 * created later in sdev_setattr
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   398
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   399
	if (avp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   400
		dv->sdev_attrvp = avp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   401
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   402
		if (dv->sdev_attr == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   403
			sdev_attrinit(dv, vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   404
		else
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   405
			*dv->sdev_attr = *vap;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   406
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   407
		if ((SDEV_IS_PERSIST(dv) && (dv->sdev_attrvp == NULL)) ||
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   408
		    ((SDEVTOV(dv)->v_type == VDIR) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   409
		    (dv->sdev_attrvp == NULL)))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   410
			error = sdev_shadow_node(dv, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   411
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   412
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   413
	/* transition to READY state */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   414
	sdev_set_nodestate(dv, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   415
	sdev_nc_node_exists(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   416
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   417
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   418
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   419
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
 * setting ZOMBIE state
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   422
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   423
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   424
sdev_nodezombied(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   425
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   426
	rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   427
	sdev_set_nodestate(dv, SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   428
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   429
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   430
}
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
 * Build the VROOT sdev_node.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   434
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   435
/*ARGSUSED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   436
struct sdev_node *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   437
sdev_mkroot(struct vfs *vfsp, dev_t devdev, struct vnode *mvp,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   438
    struct vnode *avp, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   439
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   440
	struct sdev_node *dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   441
	struct vnode *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   442
	char devdir[] = "/dev";
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   443
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   444
	ASSERT(sdev_node_cache != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   445
	ASSERT(avp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   446
	dv = kmem_cache_alloc(sdev_node_cache, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   447
	vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   448
	vn_reinit(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   449
	vp->v_flag |= VROOT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   450
	vp->v_vfsp = vfsp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   451
	vp->v_type = VDIR;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   452
	vp->v_rdev = devdev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   453
	vn_setops(vp, sdev_vnodeops); /* apply the default vnodeops at /dev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   454
	vn_exists(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   455
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   456
	if (vfsp->vfs_mntpt)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   457
		dv->sdev_name = i_ddi_strdup(
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   458
		    (char *)refstr_value(vfsp->vfs_mntpt), KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   459
	else
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   460
		/* vfs_mountdev1 set mount point later */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   461
		dv->sdev_name = i_ddi_strdup("/dev", KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   462
	dv->sdev_namelen = strlen(dv->sdev_name); /* '\0' not included */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   463
	dv->sdev_path = i_ddi_strdup(devdir, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   464
	dv->sdev_ino = SDEV_ROOTINO;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   465
	dv->sdev_nlink = 2;		/* name + . (no sdev_insert) */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   466
	dv->sdev_dotdot = dv;		/* .. == self */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   467
	dv->sdev_attrvp = avp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   468
	dv->sdev_attr = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   469
	mutex_init(&dv->sdev_lookup_lock, NULL, MUTEX_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   470
	cv_init(&dv->sdev_lookup_cv, NULL, CV_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   471
	if (strcmp(dv->sdev_name, "/dev") == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   472
		mutex_init(&devname_nsmaps_lock, NULL, MUTEX_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   473
		dv->sdev_mapinfo = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   474
		dv->sdev_flags = SDEV_BUILD|SDEV_GLOBAL|SDEV_PERSIST;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   475
		bzero(&dv->sdev_handle, sizeof (dv->sdev_handle));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   476
		dv->sdev_gdir_gen = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   477
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   478
		dv->sdev_flags = SDEV_BUILD;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   479
		dv->sdev_flags &= ~SDEV_PERSIST;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   480
		bzero(&dv->sdev_prof, sizeof (dv->sdev_prof));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   481
		dv->sdev_ldir_gen = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   482
		dv->sdev_devtree_gen = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   483
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   484
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   485
	rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   486
	sdev_set_nodestate(dv, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   487
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   488
	sdev_nc_node_exists(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   489
	return (dv);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   492
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   493
 *  1. load the module
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   494
 *  2. modload invokes sdev_module_register, which in turn sets
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   495
 *     the dv->sdev_mapinfo->dir_ops
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   496
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   497
 * note: locking order:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   498
 *	dv->sdev_contents -> map->dir_lock
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   499
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   500
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   501
sdev_get_moduleops(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   502
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   503
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   504
	struct devname_nsmap *map = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   505
	char *module;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   506
	char *path;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   507
	int load = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   508
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   509
	ASSERT(SDEVTOV(dv)->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   510
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   511
	if (devname_nsmaps == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   512
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   513
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   514
	if (!sdev_nsmaps_loaded() && !sdev_nsmaps_reloaded())
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   515
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   516
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   517
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   518
	path = dv->sdev_path;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   519
	if ((map = sdev_get_nsmap_by_dir(path, 0))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   520
		rw_enter(&map->dir_lock, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   521
		if (map->dir_invalid) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   522
			if (map->dir_module && map->dir_newmodule &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   523
			    (strcmp(map->dir_module,
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
   524
			    map->dir_newmodule) == 0)) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   525
				load = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   526
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   527
			sdev_replace_nsmap(map, map->dir_newmodule,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   528
			    map->dir_newmap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   529
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   530
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   531
		module = map->dir_module;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   532
		if (module && load) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   533
			sdcmn_err6(("sdev_get_moduleops: "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   534
			    "load module %s", module));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   535
			rw_exit(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   536
			error = modload("devname", module);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   537
			sdcmn_err6(("sdev_get_moduleops: error %d\n", error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   538
			if (error < 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   539
				return (-1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   540
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   541
		} else if (module == NULL) {
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
			 * loading the module ops for name services
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   544
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   545
			if (devname_ns_ops == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   546
				sdcmn_err6((
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   547
				    "sdev_get_moduleops: modload default\n"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   548
				error = modload("devname", DEVNAME_NSCONFIG);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   549
				sdcmn_err6((
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   550
				    "sdev_get_moduleops: error %d\n", error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   551
				if (error < 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   552
					return (-1);
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
			if (!rw_tryupgrade(&map->dir_lock)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   557
				rw_exit(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   558
				rw_enter(&map->dir_lock, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   559
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   560
			ASSERT(devname_ns_ops);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   561
			map->dir_ops = devname_ns_ops;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   562
			rw_exit(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   563
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   564
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   565
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   566
	dv->sdev_mapinfo = map;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   567
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   568
}
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
/* directory dependent vop table */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   571
struct sdev_vop_table {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   572
	char *vt_name;				/* subdirectory name */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   573
	const fs_operation_def_t *vt_service;	/* vnodeops table */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   574
	struct vnodeops *vt_vops;		/* constructed vop */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   575
	struct vnodeops **vt_global_vops;	/* global container for vop */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   576
	int (*vt_vtor)(struct sdev_node *);	/* validate sdev_node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   577
	int vt_flags;
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
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
 * A nice improvement would be to provide a plug-in mechanism
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   582
 * for this table instead of a const table.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   583
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   584
static struct sdev_vop_table vtab[] =
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   585
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   586
	{ "pts", devpts_vnodeops_tbl, NULL, &devpts_vnodeops, devpts_validate,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   587
	SDEV_DYNAMIC | SDEV_VTOR },
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   588
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   589
	{ "zcons", NULL, NULL, NULL, NULL, SDEV_NO_NCACHE },
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   590
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
   591
	{ "net", devnet_vnodeops_tbl, NULL, &devnet_vnodeops, devnet_validate,
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
   592
	SDEV_DYNAMIC | SDEV_VTOR },
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
   593
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   594
	{ NULL, NULL, NULL, NULL, NULL, 0}
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   598
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   599
 *  sets a directory's vnodeops if the directory is in the vtab;
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
static struct vnodeops *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   602
sdev_get_vop(struct sdev_node *dv)
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
	int i;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   605
	char *path;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   606
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   607
	path = dv->sdev_path;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   608
	ASSERT(path);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   609
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   610
	/* gets the relative path to /dev/ */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   611
	path += 5;
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
	/* gets the vtab entry if matches */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   614
	for (i = 0; vtab[i].vt_name; i++) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   615
		if (strcmp(vtab[i].vt_name, path) != 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   616
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   617
		dv->sdev_flags |= vtab[i].vt_flags;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   618
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   619
		if (vtab[i].vt_vops) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   620
			if (vtab[i].vt_global_vops)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   621
				*(vtab[i].vt_global_vops) = vtab[i].vt_vops;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   622
			return (vtab[i].vt_vops);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   623
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   624
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   625
		if (vtab[i].vt_service) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   626
			fs_operation_def_t *templ;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   627
			templ = sdev_merge_vtab(vtab[i].vt_service);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   628
			if (vn_make_ops(vtab[i].vt_name,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   629
			    (const fs_operation_def_t *)templ,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   630
			    &vtab[i].vt_vops) != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   631
				cmn_err(CE_PANIC, "%s: malformed vnode ops\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   632
				    vtab[i].vt_name);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   633
				/*NOTREACHED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   634
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   635
			if (vtab[i].vt_global_vops) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   636
				*(vtab[i].vt_global_vops) = vtab[i].vt_vops;
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
			sdev_free_vtab(templ);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   639
			return (vtab[i].vt_vops);
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
		return (sdev_vnodeops);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   642
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   643
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   644
	/* child inherits the persistence of the parent */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   645
	if (SDEV_IS_PERSIST(dv->sdev_dotdot))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   646
		dv->sdev_flags |= SDEV_PERSIST;
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
	return (sdev_vnodeops);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   649
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   650
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   651
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   652
sdev_set_no_nocache(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   653
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   654
	int i;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   655
	char *path;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   656
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   657
	ASSERT(dv->sdev_path);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   658
	path = dv->sdev_path + strlen("/dev/");
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
	for (i = 0; vtab[i].vt_name; i++) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   661
		if (strcmp(vtab[i].vt_name, path) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   662
			if (vtab[i].vt_flags & SDEV_NO_NCACHE)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   663
				dv->sdev_flags |= SDEV_NO_NCACHE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   664
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   665
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   666
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   667
}
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
void *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   670
sdev_get_vtor(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   671
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   672
	int i;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   673
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   674
	for (i = 0; vtab[i].vt_name; i++) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   675
		if (strcmp(vtab[i].vt_name, dv->sdev_name) != 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   676
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   677
		return ((void *)vtab[i].vt_vtor);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   678
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   679
	return (NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   680
}
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
 * Build the base root inode
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   684
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   685
ino_t
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   686
sdev_mkino(struct sdev_node *dv)
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
	ino_t	ino;
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
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   691
	 * for now, follow the lead of tmpfs here
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   692
	 * need to someday understand the requirements here
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
	ino = (ino_t)(uint32_t)((uintptr_t)dv >> 3);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   695
	ino += SDEV_ROOTINO + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   696
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   697
	return (ino);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   698
}
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
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   701
sdev_getlink(struct vnode *linkvp, char **link)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   702
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   703
	int err;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   704
	char *buf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   705
	struct uio uio = {0};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   706
	struct iovec iov = {0};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   707
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   708
	if (linkvp == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   709
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   710
	ASSERT(linkvp->v_type == VLNK);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   711
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   712
	buf = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   713
	iov.iov_base = buf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   714
	iov.iov_len = MAXPATHLEN;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   715
	uio.uio_iov = &iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   716
	uio.uio_iovcnt = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   717
	uio.uio_resid = MAXPATHLEN;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   718
	uio.uio_segflg = UIO_SYSSPACE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   719
	uio.uio_llimit = MAXOFFSET_T;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   720
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
   721
	err = VOP_READLINK(linkvp, &uio, kcred, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   722
	if (err) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   723
		cmn_err(CE_WARN, "readlink %s failed in dev\n", buf);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   724
		kmem_free(buf, MAXPATHLEN);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   725
		return (ENOENT);
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
	/* mission complete */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   729
	*link = i_ddi_strdup(buf, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   730
	kmem_free(buf, MAXPATHLEN);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   731
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   732
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   733
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   734
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   735
 * A convenient wrapper to get the devfs node vnode for a device
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   736
 * minor functionality: readlink() of a /dev symlink
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   737
 * Place the link into dv->sdev_symlink
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   738
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   739
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   740
sdev_follow_link(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   741
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   742
	int err;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   743
	struct vnode *linkvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   744
	char *link = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   745
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   746
	linkvp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   747
	if (linkvp == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   748
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   749
	ASSERT(linkvp->v_type == VLNK);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   750
	err = sdev_getlink(linkvp, &link);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   751
	if (err) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   752
		(void) sdev_nodezombied(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   753
		dv->sdev_symlink = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   754
		return (ENOENT);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   757
	ASSERT(link != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   758
	dv->sdev_symlink = link;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   759
	return (0);
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
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   763
sdev_node_check(struct sdev_node *dv, struct vattr *nvap, void *nargs)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   764
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   765
	vtype_t otype = SDEVTOV(dv)->v_type;
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
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   768
	 * existing sdev_node has a different type.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   769
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   770
	if (otype != nvap->va_type) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   771
		sdcmn_err9(("sdev_node_check: existing node "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   772
		    "  %s type %d does not match new node type %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   773
		    dv->sdev_name, otype, nvap->va_type));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   774
		return (EEXIST);
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
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   778
	 * For a symlink, the target should be the same.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   779
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   780
	if (otype == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   781
		ASSERT(nargs != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   782
		ASSERT(dv->sdev_symlink != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   783
		if (strcmp(dv->sdev_symlink, (char *)nargs) != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   784
			sdcmn_err9(("sdev_node_check: existing node "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   785
			    " %s has different symlink %s as new node "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   786
			    " %s\n", dv->sdev_name, dv->sdev_symlink,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   787
			    (char *)nargs));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   788
			return (EEXIST);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   789
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   790
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   791
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   792
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   793
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   794
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   795
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   796
 * sdev_mknode - a wrapper for sdev_nodeinit(), sdev_nodeready()
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   797
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   798
 * arguments:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   799
 *	- ddv (parent)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   800
 *	- nm (child name)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   801
 *	- newdv (sdev_node for nm is returned here)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   802
 *	- vap (vattr for the node to be created, va_type should be set.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   803
 *	  the defaults should be used if unknown)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   804
 *	- cred
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   805
 *	- args
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   806
 *	    . tnm (for VLNK)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   807
 *	    . global sdev_node (for !SDEV_GLOBAL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   808
 * 	- state: SDEV_INIT, SDEV_READY
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   809
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   810
 * only ddv, nm, newddv, vap, cred are required for sdev_mknode(SDEV_INIT)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   811
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   812
 * NOTE:  directory contents writers lock needs to be held before
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   813
 *	  calling this routine.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   814
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   815
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   816
sdev_mknode(struct sdev_node *ddv, char *nm, struct sdev_node **newdv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   817
    struct vattr *vap, struct vnode *avp, void *args, struct cred *cred,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   818
    sdev_node_state_t state)
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
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   821
	sdev_node_state_t node_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   822
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   823
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   824
	ASSERT(state != SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   825
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   826
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   827
	if (*newdv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   828
		dv = *newdv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   829
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   830
		/* allocate and initialize a sdev_node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   831
		if (ddv->sdev_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   832
			sdcmn_err9(("sdev_mknode: parent %s ZOMBIEd\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   833
			    ddv->sdev_path));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   834
			return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   835
		}
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
		error = sdev_nodeinit(ddv, nm, &dv, vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   838
		if (error != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   839
			sdcmn_err9(("sdev_mknode: error %d,"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   840
			    " name %s can not be initialized\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   841
			    error, nm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   842
			return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   843
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   844
		ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   845
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   846
		/* insert into the directory cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   847
		error = sdev_cache_update(ddv, &dv, nm, SDEV_CACHE_ADD);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   848
		if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   849
			sdcmn_err9(("sdev_mknode: node %s can not"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   850
			    " be added into directory cache\n", nm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   851
			return (ENOENT);
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
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   856
	node_state = dv->sdev_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   857
	ASSERT(node_state != SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   858
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   859
	if (state == SDEV_READY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   860
		switch (node_state) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   861
		case SDEV_INIT:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   862
			error = sdev_nodeready(dv, vap, avp, args, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   863
			/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   864
			 * masking the errors with ENOENT
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
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   867
				sdcmn_err9(("sdev_mknode: node %s can NOT"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   868
				    " be transitioned into READY state, "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   869
				    "error %d\n", nm, error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   870
				error = ENOENT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   871
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   872
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   873
		case SDEV_READY:
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
			 * Do some sanity checking to make sure
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   876
			 * the existing sdev_node is what has been
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   877
			 * asked for.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   878
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   879
			error = sdev_node_check(dv, vap, args);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   880
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   881
		default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   882
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   883
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   884
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   885
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   886
	if (!error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   887
		*newdv = dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   888
		ASSERT((*newdv)->sdev_state != SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   889
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   890
		SDEV_SIMPLE_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   891
		*newdv = NULL;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   894
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   895
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   896
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   897
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   898
 * convenient wrapper to change vp's ATIME, CTIME and ATIME
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   899
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   900
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   901
sdev_update_timestamps(struct vnode *vp, cred_t *cred, uint_t mask)
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
	struct vattr attr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   904
	timestruc_t now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   905
	int err;
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
	ASSERT(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   908
	gethrestime(&now);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   909
	if (mask & AT_CTIME)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   910
		attr.va_ctime = now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   911
	if (mask & AT_MTIME)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   912
		attr.va_mtime = now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   913
	if (mask & AT_ATIME)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   914
		attr.va_atime = now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   915
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   916
	attr.va_mask = (mask & AT_TIMES);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   917
	err = VOP_SETATTR(vp, &attr, 0, cred, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   918
	if (err && (err != EROFS)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   919
		sdcmn_err(("update timestamps error %d\n", err));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   920
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   921
}
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
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   924
 * the backing store vnode is released here
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   925
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   926
/*ARGSUSED1*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   927
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   928
sdev_nodedestroy(struct sdev_node *dv, uint_t flags)
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
	/* no references */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   931
	ASSERT(dv->sdev_nlink == 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   932
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   933
	if (dv->sdev_attrvp != NULLVP) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   934
		VN_RELE(dv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   935
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   936
		 * reset the attrvp so that no more
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   937
		 * references can be made on this already
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   938
		 * vn_rele() vnode
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   939
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   940
		dv->sdev_attrvp = NULLVP;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   943
	if (dv->sdev_attr != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   944
		kmem_free(dv->sdev_attr, sizeof (struct vattr));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   945
		dv->sdev_attr = 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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   948
	if (dv->sdev_name != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   949
		kmem_free(dv->sdev_name, dv->sdev_namelen + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   950
		dv->sdev_name = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   951
	}
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
	if (dv->sdev_symlink != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   954
		kmem_free(dv->sdev_symlink, strlen(dv->sdev_symlink) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   955
		dv->sdev_symlink = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   956
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   957
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   958
	if (dv->sdev_path) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   959
		kmem_free(dv->sdev_path, strlen(dv->sdev_path) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   960
		dv->sdev_path = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   961
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   962
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   963
	if (!SDEV_IS_GLOBAL(dv))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   964
		sdev_prof_free(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   965
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   966
	mutex_destroy(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   967
	cv_destroy(&dv->sdev_lookup_cv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   968
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   969
	/* return node to initial state as per constructor */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   970
	(void) memset((void *)&dv->sdev_instance_data, 0,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   971
	    sizeof (dv->sdev_instance_data));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   972
	vn_invalid(SDEVTOV(dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   973
	kmem_cache_free(sdev_node_cache, dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   974
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   975
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   976
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   977
 * DIRECTORY CACHE lookup
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   978
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   979
struct sdev_node *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   980
sdev_findbyname(struct sdev_node *ddv, char *nm)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   981
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   982
	struct sdev_node *dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   983
	size_t	nmlen = strlen(nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   984
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   985
	ASSERT(RW_LOCK_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   986
	for (dv = ddv->sdev_dot; dv; dv = dv->sdev_next) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   987
		if (dv->sdev_namelen != nmlen) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   988
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   989
		}
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
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   992
		 * Can't lookup stale nodes
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   993
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   994
		if (dv->sdev_flags & SDEV_STALE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   995
			sdcmn_err9((
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   996
			    "sdev_findbyname: skipped stale node: %s\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   997
			    dv->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   998
			continue;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1001
		if (strcmp(dv->sdev_name, nm) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1002
			SDEV_HOLD(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1003
			return (dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1004
		}
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
	return (NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1007
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1008
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1009
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1010
 * Inserts a new sdev_node in a parent directory
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1011
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1012
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1013
sdev_direnter(struct sdev_node *ddv, struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1014
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1015
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1016
	ASSERT(SDEVTOV(ddv)->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1017
	ASSERT(ddv->sdev_nlink >= 2);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1018
	ASSERT(dv->sdev_nlink == 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1019
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1020
	dv->sdev_dotdot = ddv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1021
	dv->sdev_next = ddv->sdev_dot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1022
	ddv->sdev_dot = dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1023
	ddv->sdev_nlink++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1024
}
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
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1027
 * The following check is needed because while sdev_nodes are linked
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1028
 * in SDEV_INIT state, they have their link counts incremented only
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1029
 * in SDEV_READY state.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1030
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1031
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1032
decr_link(struct sdev_node *dv)
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
	if (dv->sdev_state != SDEV_INIT)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1035
		dv->sdev_nlink--;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1036
	else
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1037
		ASSERT(dv->sdev_nlink == 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1038
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1039
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
 * Delete an existing dv from directory cache
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1042
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1043
 * In the case of a node is still held by non-zero reference count,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1044
 *     the node is put into ZOMBIE state. Once the reference count
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1045
 *     reaches "0", the node is unlinked and destroyed,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1046
 *     in sdev_inactive().
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
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1049
sdev_dirdelete(struct sdev_node *ddv, struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1050
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1051
	struct sdev_node *idv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1052
	struct sdev_node *prev = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1053
	struct vnode *vp;
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
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1056
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1057
	vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1058
	mutex_enter(&vp->v_lock);
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
	/* dv is held still */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1061
	if (vp->v_count > 1) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1062
		rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1063
		if (dv->sdev_state == SDEV_READY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1064
			sdcmn_err9((
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1065
			    "sdev_delete: node %s busy with count %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1066
			    dv->sdev_name, vp->v_count));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1067
			dv->sdev_state = SDEV_ZOMBIE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1068
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1069
		rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1070
		--vp->v_count;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1071
		mutex_exit(&vp->v_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1072
		return (EBUSY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1073
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1074
	ASSERT(vp->v_count == 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1075
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1076
	/* unlink from the memory cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1077
	ddv->sdev_nlink--;	/* .. to above */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1078
	if (vp->v_type == VDIR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1079
		decr_link(dv);		/* . to self */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1080
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1081
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1082
	for (idv = ddv->sdev_dot; idv && idv != dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1083
	    prev = idv, idv = idv->sdev_next)
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
	ASSERT(idv == dv);	/* node to be deleted must exist */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1086
	if (prev == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1087
		ddv->sdev_dot = dv->sdev_next;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1088
	else
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1089
		prev->sdev_next = dv->sdev_next;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1090
	dv->sdev_next = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1091
	decr_link(dv);	/* name, back to zero */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1092
	vp->v_count--;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1093
	mutex_exit(&vp->v_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1094
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1095
	/* destroy the node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1096
	sdev_nodedestroy(dv, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1097
	return (0);
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
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1101
 * check if the source is in the path of the target
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
 * source and target are different
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1104
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1105
/*ARGSUSED2*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1106
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1107
sdev_checkpath(struct sdev_node *sdv, struct sdev_node *tdv, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1108
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1109
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1110
	struct sdev_node *dotdot, *dir;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1111
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1112
	dotdot = tdv->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1113
	ASSERT(dotdot);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1114
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1115
	/* fs root */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1116
	if (dotdot == tdv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1117
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1118
	}
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
	for (;;) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1121
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1122
		 * avoid error cases like
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1123
		 *	mv a a/b
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1124
		 *	mv a a/b/c
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1125
		 *	etc.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1126
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1127
		if (dotdot == sdv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1128
			error = EINVAL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1129
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1130
		}
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
		dir = dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1133
		dotdot = dir->sdev_dotdot;
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
		/* done checking because root is reached */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1136
		if (dir == dotdot) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1137
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1138
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1139
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1140
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1141
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1142
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1143
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1144
sdev_rnmnode(struct sdev_node *oddv, struct sdev_node *odv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1145
    struct sdev_node *nddv, struct sdev_node **ndvp, char *nnm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1146
    struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1147
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1148
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1149
	struct vnode *ovp = SDEVTOV(odv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1150
	struct vnode *nvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1151
	struct vattr vattr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1152
	int doingdir = (ovp->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1153
	char *link = NULL;
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1154
	int samedir = (oddv == nddv) ? 1 : 0;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1155
	int bkstore = 0;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1156
	struct sdev_node *idv = NULL;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1157
	struct sdev_node *ndv = NULL;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1158
	timestruc_t now;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1159
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1160
	vattr.va_mask = AT_MODE|AT_UID|AT_GID;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1161
	error = VOP_GETATTR(ovp, &vattr, 0, cred, NULL);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1162
	if (error)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1163
		return (error);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1164
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1165
	if (!samedir)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1166
		rw_enter(&oddv->sdev_contents, RW_WRITER);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1167
	rw_enter(&nddv->sdev_contents, RW_WRITER);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1168
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1169
	/*
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1170
	 * the source may have been deleted by another thread before
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1171
	 * we gets here.
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1172
	 */
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1173
	if (odv->sdev_state != SDEV_READY) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1174
		error = ENOENT;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1175
		goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1176
	}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1177
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1178
	if (doingdir && (odv == nddv)) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1179
		error = EINVAL;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1180
		goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1181
	}
2621
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
	 * If renaming a directory, and the parents are different (".." must be
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1185
	 * changed) then the source dir must not be in the dir hierarchy above
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1186
	 * the target since it would orphan everything below the source dir.
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
	if (doingdir && (oddv != nddv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1189
		error = sdev_checkpath(odv, nddv, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1190
		if (error)
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1191
			goto err_out;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1192
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1193
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1194
	/* destination existing */
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1195
	if (*ndvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1196
		nvp = SDEVTOV(*ndvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1197
		ASSERT(nvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1198
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1199
		/* handling renaming to itself */
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1200
		if (odv == *ndvp) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1201
			error = 0;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1202
			goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1203
		}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1204
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1205
		if (nvp->v_type == VDIR) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1206
			if (!doingdir) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1207
				error = EISDIR;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1208
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1209
			}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1210
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1211
			if (vn_vfswlock(nvp)) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1212
				error = EBUSY;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1213
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1214
			}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1215
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1216
			if (vn_mountedvfs(nvp) != NULL) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1217
				vn_vfsunlock(nvp);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1218
				error = EBUSY;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1219
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1220
			}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1221
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1222
			/* in case dir1 exists in dir2 and "mv dir1 dir2" */
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1223
			if ((*ndvp)->sdev_nlink > 2) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1224
				vn_vfsunlock(nvp);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1225
				error = EEXIST;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1226
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1227
			}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1228
			vn_vfsunlock(nvp);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1229
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1230
			(void) sdev_dirdelete(nddv, *ndvp);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1231
			*ndvp = NULL;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1232
			error = VOP_RMDIR(nddv->sdev_attrvp, nnm,
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  1233
			    nddv->sdev_attrvp, cred, NULL, 0);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1234
			if (error)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1235
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1236
		} else {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1237
			if (doingdir) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1238
				error = ENOTDIR;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1239
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1240
			}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1241
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1242
			if (SDEV_IS_PERSIST((*ndvp))) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1243
				bkstore = 1;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1244
			}
2621
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
			/*
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1247
			 * get rid of the node from the directory cache
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1248
			 * note, in case EBUSY is returned, the ZOMBIE
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1249
			 * node is taken care in sdev_mknode.
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1250
			 */
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1251
			(void) sdev_dirdelete(nddv, *ndvp);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1252
			*ndvp = NULL;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1253
			if (bkstore) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1254
				error = VOP_REMOVE(nddv->sdev_attrvp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1255
				    nnm, cred, NULL, 0);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1256
				if (error)
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  1257
					goto err_out;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1258
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1259
		}
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
	/* fix the source for a symlink */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1263
	if (vattr.va_type == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1264
		if (odv->sdev_symlink == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1265
			error = sdev_follow_link(odv);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1266
			if (error) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1267
				error = ENOENT;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1268
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1269
			}
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1270
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1271
		ASSERT(odv->sdev_symlink);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1272
		link = i_ddi_strdup(odv->sdev_symlink, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1273
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1274
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1275
	/*
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1276
	 * make a fresh node from the source attrs
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1277
	 */
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1278
	ASSERT(RW_WRITE_HELD(&nddv->sdev_contents));
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1279
	error = sdev_mknode(nddv, nnm, ndvp, &vattr,
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1280
	    NULL, (void *)link, cred, SDEV_READY);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1281
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1282
	if (link)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1283
		kmem_free(link, strlen(link) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1284
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1285
	if (error)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1286
		goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1287
	ASSERT(*ndvp);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1288
	ASSERT((*ndvp)->sdev_state == SDEV_READY);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1289
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1290
	/* move dir contents */
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1291
	if (doingdir) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1292
		for (idv = odv->sdev_dot; idv; idv = idv->sdev_next) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1293
			error = sdev_rnmnode(odv, idv,
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1294
			    (struct sdev_node *)(*ndvp), &ndv,
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1295
			    idv->sdev_name, cred);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1296
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1297
			if (error)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1298
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1299
			ndv = NULL;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1300
		}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1301
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1302
	}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1303
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1304
	if ((*ndvp)->sdev_attrvp) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1305
		sdev_update_timestamps((*ndvp)->sdev_attrvp, kcred,
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1306
		    AT_CTIME|AT_ATIME);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1307
	} else {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1308
		ASSERT((*ndvp)->sdev_attr);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1309
		gethrestime(&now);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1310
		(*ndvp)->sdev_attr->va_ctime = now;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1311
		(*ndvp)->sdev_attr->va_atime = now;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1312
	}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1313
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1314
	if (nddv->sdev_attrvp) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1315
		sdev_update_timestamps(nddv->sdev_attrvp, kcred,
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1316
		    AT_MTIME|AT_ATIME);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1317
	} else {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1318
		ASSERT(nddv->sdev_attr);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1319
		gethrestime(&now);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1320
		nddv->sdev_attr->va_mtime = now;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1321
		nddv->sdev_attr->va_atime = now;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1322
	}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1323
	rw_exit(&nddv->sdev_contents);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1324
	if (!samedir)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1325
		rw_exit(&oddv->sdev_contents);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1326
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1327
	SDEV_RELE(*ndvp);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1328
	return (error);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1329
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1330
err_out:
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1331
	rw_exit(&nddv->sdev_contents);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1332
	if (!samedir)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1333
		rw_exit(&oddv->sdev_contents);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1334
	return (error);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1335
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1336
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1337
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1338
 * Merge sdev_node specific information into an attribute structure.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1339
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1340
 * note: sdev_node is not locked here
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1341
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1342
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1343
sdev_vattr_merge(struct sdev_node *dv, struct vattr *vap)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1344
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1345
	struct vnode *vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1346
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1347
	vap->va_nlink = dv->sdev_nlink;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1348
	vap->va_nodeid = dv->sdev_ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1349
	vap->va_fsid = SDEVTOV(dv->sdev_dotdot)->v_rdev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1350
	vap->va_type = vp->v_type;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1351
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1352
	if (vp->v_type == VDIR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1353
		vap->va_rdev = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1354
		vap->va_fsid = vp->v_rdev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1355
	} else if (vp->v_type == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1356
		vap->va_rdev = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1357
		vap->va_mode  &= ~S_IFMT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1358
		vap->va_mode |= S_IFLNK;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1359
	} else if ((vp->v_type == VCHR) || (vp->v_type == VBLK)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1360
		vap->va_rdev = vp->v_rdev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1361
		vap->va_mode &= ~S_IFMT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1362
		if (vap->va_type == VCHR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1363
			vap->va_mode |= S_IFCHR;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1364
		else
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1365
			vap->va_mode |= S_IFBLK;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1366
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1367
		vap->va_rdev = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1368
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1369
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1370
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1371
static struct vattr *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1372
sdev_getdefault_attr(enum vtype type)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1373
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1374
	if (type == VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1375
		return (&sdev_vattr_dir);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1376
	else if (type == VCHR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1377
		return (&sdev_vattr_chr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1378
	else if (type == VBLK)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1379
		return (&sdev_vattr_blk);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1380
	else if (type == VLNK)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1381
		return (&sdev_vattr_lnk);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1382
	else
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1383
		return (NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1384
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1385
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1386
sdev_to_vp(struct sdev_node *dv, struct vnode **vpp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1387
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1388
	int rv = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1389
	struct vnode *vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1390
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1391
	switch (vp->v_type) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1392
	case VCHR:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1393
	case VBLK:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1394
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1395
		 * If vnode is a device, return special vnode instead
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1396
		 * (though it knows all about -us- via sp->s_realvp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1397
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1398
		*vpp = specvp(vp, vp->v_rdev, vp->v_type, kcred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1399
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1400
		if (*vpp == NULLVP)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1401
			rv = ENOSYS;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1402
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1403
	default:	/* most types are returned as is */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1404
		*vpp = vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1405
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1406
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1407
	return (rv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1408
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1409
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1410
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1411
 * loopback into sdev_lookup()
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1412
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1413
static struct vnode *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1414
devname_find_by_devpath(char *devpath, struct vattr *vattr)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1415
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1416
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1417
	struct vnode *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1418
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1419
	error = lookupname(devpath, UIO_SYSSPACE, NO_FOLLOW, NULLVPP, &vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1420
	if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1421
		return (NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1422
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1423
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1424
	if (vattr)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1425
		(void) VOP_GETATTR(vp, vattr, 0, kcred, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1426
	return (vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1427
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1428
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1429
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1430
 * the junction between devname and devfs
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1431
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1432
static struct vnode *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1433
devname_configure_by_path(char *physpath, struct vattr *vattr)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1434
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1435
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1436
	struct vnode *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1437
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1438
	ASSERT(strncmp(physpath, "/devices/", sizeof ("/devices/") - 1)
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1439
	    == 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1440
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1441
	error = devfs_lookupname(physpath + sizeof ("/devices/") - 1,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1442
	    NULLVPP, &vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1443
	if (error != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1444
		if (error == ENODEV) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1445
			cmn_err(CE_CONT, "%s: not found (line %d)\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1446
			    physpath, __LINE__);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1447
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1448
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1449
		return (NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1450
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1451
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1452
	if (vattr)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1453
		(void) VOP_GETATTR(vp, vattr, 0, kcred, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1454
	return (vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1455
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1456
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1457
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1458
 * junction between devname and root file system, e.g. ufs
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1459
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1460
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1461
devname_backstore_lookup(struct sdev_node *ddv, char *nm, struct vnode **rvp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1462
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1463
	struct vnode *rdvp = ddv->sdev_attrvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1464
	int rval = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1465
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1466
	ASSERT(rdvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1467
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1468
	rval = VOP_LOOKUP(rdvp, nm, rvp, NULL, 0, NULL, kcred, NULL, NULL,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1469
	    NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1470
	return (rval);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1471
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1472
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1473
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1474
sdev_filldir_from_store(struct sdev_node *ddv, int dlen, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1475
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1476
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1477
	char	*nm;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1478
	struct vnode *dirvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1479
	int	error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1480
	vnode_t	*vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1481
	int eof;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1482
	struct iovec iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1483
	struct uio uio;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1484
	struct dirent64 *dp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1485
	dirent64_t *dbuf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1486
	size_t dbuflen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1487
	struct vattr vattr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1488
	char *link = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1489
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1490
	if (ddv->sdev_attrvp == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1491
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1492
	if (!(ddv->sdev_flags & SDEV_BUILD))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1493
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1494
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1495
	dirvp = ddv->sdev_attrvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1496
	VN_HOLD(dirvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1497
	dbuf = kmem_zalloc(dlen, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1498
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1499
	uio.uio_iov = &iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1500
	uio.uio_iovcnt = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1501
	uio.uio_segflg = UIO_SYSSPACE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1502
	uio.uio_fmode = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1503
	uio.uio_extflg = UIO_COPY_CACHED;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1504
	uio.uio_loffset = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1505
	uio.uio_llimit = MAXOFFSET_T;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1506
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1507
	eof = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1508
	error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1509
	while (!error && !eof) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1510
		uio.uio_resid = dlen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1511
		iov.iov_base = (char *)dbuf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1512
		iov.iov_len = dlen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1513
		(void) VOP_RWLOCK(dirvp, V_WRITELOCK_FALSE, NULL);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1514
		error = VOP_READDIR(dirvp, &uio, kcred, &eof, NULL, 0);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1515
		VOP_RWUNLOCK(dirvp, V_WRITELOCK_FALSE, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1516
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1517
		dbuflen = dlen - uio.uio_resid;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1518
		if (error || dbuflen == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1519
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1520
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1521
		if (!(ddv->sdev_flags & SDEV_BUILD)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1522
			error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1523
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1524
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1525
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1526
		for (dp = dbuf; ((intptr_t)dp <
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1527
		    (intptr_t)dbuf + dbuflen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1528
		    dp = (dirent64_t *)((intptr_t)dp + dp->d_reclen)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1529
			nm = dp->d_name;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1530
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1531
			if (strcmp(nm, ".") == 0 ||
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1532
			    strcmp(nm, "..") == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1533
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1534
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1535
			vp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1536
			dv = sdev_cache_lookup(ddv, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1537
			if (dv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1538
				if (dv->sdev_state != SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1539
					SDEV_SIMPLE_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1540
				} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1541
					/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1542
					 * A ZOMBIE node may not have been
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1543
					 * cleaned up from the backing store,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1544
					 * bypass this entry in this case,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1545
					 * and clean it up from the directory
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1546
					 * cache if this is the last call.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1547
					 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1548
					(void) sdev_dirdelete(ddv, dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1549
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1550
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1551
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1552
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1553
			/* refill the cache if not already */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1554
			error = devname_backstore_lookup(ddv, nm, &vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1555
			if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1556
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1557
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1558
			vattr.va_mask = AT_MODE|AT_UID|AT_GID;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1559
			error = VOP_GETATTR(vp, &vattr, 0, cred, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1560
			if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1561
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1562
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1563
			if (vattr.va_type == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1564
				error = sdev_getlink(vp, &link);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1565
				if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1566
					continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1567
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1568
				ASSERT(link != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1569
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1570
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1571
			if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1572
				rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1573
				rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1574
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1575
			error = sdev_mknode(ddv, nm, &dv, &vattr, vp, link,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1576
			    cred, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1577
			rw_downgrade(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1578
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1579
			if (link != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1580
				kmem_free(link, strlen(link) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1581
				link = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1582
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1583
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1584
			if (!error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1585
				ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1586
				ASSERT(dv->sdev_state != SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1587
				SDEV_SIMPLE_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1588
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1589
			vp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1590
			dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1591
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1592
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1593
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1594
done:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1595
	VN_RELE(dirvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1596
	kmem_free(dbuf, dlen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1597
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1598
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1599
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1600
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1601
void
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1602
sdev_filldir_dynamic(struct sdev_node *ddv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1603
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1604
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1605
	int i;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1606
	struct vattr *vap;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1607
	char *nm = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1608
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1609
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1610
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1611
	ASSERT((ddv->sdev_flags & SDEV_BUILD));
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1612
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1613
	vap = sdev_getdefault_attr(VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1614
	for (i = 0; vtab[i].vt_name != NULL; i++) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1615
		nm = vtab[i].vt_name;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1616
		ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1617
		dv = NULL;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1618
		error = sdev_mknode(ddv, nm, &dv, vap, NULL,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1619
		    NULL, kcred, SDEV_READY);
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1620
		if (error) {
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1621
			cmn_err(CE_WARN, "%s/%s: error %d\n",
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1622
			    ddv->sdev_name, nm, error);
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1623
		} else {
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1624
			ASSERT(dv);
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1625
			ASSERT(dv->sdev_state != SDEV_ZOMBIE);
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1626
			SDEV_SIMPLE_RELE(dv);
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1627
		}
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1628
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1629
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1630
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1631
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1632
 * Creating a backing store entry based on sdev_attr.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1633
 * This is called either as part of node creation in a persistent directory
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1634
 * or from setattr/setsecattr to persist access attributes across reboot.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1635
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1636
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1637
sdev_shadow_node(struct sdev_node *dv, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1638
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1639
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1640
	struct vnode *dvp = SDEVTOV(dv->sdev_dotdot);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1641
	struct vnode *rdvp = VTOSDEV(dvp)->sdev_attrvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1642
	struct vattr *vap = dv->sdev_attr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1643
	char *nm = dv->sdev_name;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1644
	struct vnode *tmpvp, **rvp = &tmpvp, *rrvp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1645
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1646
	ASSERT(dv && dv->sdev_name && rdvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1647
	ASSERT(RW_WRITE_HELD(&dv->sdev_contents) && dv->sdev_attrvp == NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1648
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1649
lookup:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1650
	/* try to find it in the backing store */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1651
	error = VOP_LOOKUP(rdvp, nm, rvp, NULL, 0, NULL, cred, NULL, NULL,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1652
	    NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1653
	if (error == 0) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1654
		if (VOP_REALVP(*rvp, &rrvp, NULL) == 0) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1655
			VN_HOLD(rrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1656
			VN_RELE(*rvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1657
			*rvp = rrvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1658
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1659
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1660
		kmem_free(dv->sdev_attr, sizeof (vattr_t));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1661
		dv->sdev_attr = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1662
		dv->sdev_attrvp = *rvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1663
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1664
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1665
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1666
	/* let's try to persist the node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1667
	gethrestime(&vap->va_atime);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1668
	vap->va_mtime = vap->va_atime;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1669
	vap->va_ctime = vap->va_atime;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1670
	vap->va_mask |= AT_TYPE|AT_MODE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1671
	switch (vap->va_type) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1672
	case VDIR:
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1673
		error = VOP_MKDIR(rdvp, nm, vap, rvp, cred, NULL, 0, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1674
		sdcmn_err9(("sdev_shadow_node: mkdir vp %p error %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1675
		    (void *)(*rvp), error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1676
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1677
	case VCHR:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1678
	case VBLK:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1679
	case VREG:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1680
	case VDOOR:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1681
		error = VOP_CREATE(rdvp, nm, vap, NONEXCL, VREAD|VWRITE,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1682
		    rvp, cred, 0, NULL, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1683
		sdcmn_err9(("sdev_shadow_node: create vp %p, error %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1684
		    (void *)(*rvp), error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1685
		if (!error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1686
			VN_RELE(*rvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1687
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1688
	case VLNK:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1689
		ASSERT(dv->sdev_symlink);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1690
		error = VOP_SYMLINK(rdvp, nm, vap, dv->sdev_symlink, cred,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1691
		    NULL, 0);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1692
		sdcmn_err9(("sdev_shadow_node: create symlink error %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1693
		    error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1694
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1695
	default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1696
		cmn_err(CE_PANIC, "dev: %s: sdev_shadow_node "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1697
		    "create\n", nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1698
		/*NOTREACHED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1699
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1700
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1701
	/* go back to lookup to factor out spec node and set attrvp */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1702
	if (error == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1703
		goto lookup;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1704
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1705
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1706
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1707
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1708
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1709
sdev_cache_add(struct sdev_node *ddv, struct sdev_node **dv, char *nm)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1710
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1711
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1712
	struct sdev_node *dup = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1713
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1714
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1715
	if ((dup = sdev_findbyname(ddv, nm)) == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1716
		sdev_direnter(ddv, *dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1717
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1718
		if (dup->sdev_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1719
			error = sdev_dirdelete(ddv, dup);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1720
			/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1721
			 * The ZOMBIE node is still hanging
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1722
			 * around with more than one reference counts.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1723
			 * Fail the new node creation so that
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1724
			 * the directory cache won't have
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1725
			 * duplicate entries for the same named node
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1726
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1727
			if (error == EBUSY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1728
				SDEV_SIMPLE_RELE(*dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1729
				sdev_nodedestroy(*dv, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1730
				*dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1731
				return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1732
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1733
			sdev_direnter(ddv, *dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1734
		} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1735
			ASSERT((*dv)->sdev_state != SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1736
			SDEV_SIMPLE_RELE(*dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1737
			sdev_nodedestroy(*dv, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1738
			*dv = dup;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1739
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1740
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1741
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1742
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1743
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1744
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1745
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1746
sdev_cache_delete(struct sdev_node *ddv, struct sdev_node **dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1747
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1748
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1749
	return (sdev_dirdelete(ddv, *dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1750
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1751
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1752
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1753
 * update the in-core directory cache
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1754
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1755
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1756
sdev_cache_update(struct sdev_node *ddv, struct sdev_node **dv, char *nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1757
    sdev_cache_ops_t ops)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1758
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1759
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1760
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1761
	ASSERT((SDEV_HELD(*dv)));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1762
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1763
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1764
	switch (ops) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1765
	case SDEV_CACHE_ADD:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1766
		error = sdev_cache_add(ddv, dv, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1767
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1768
	case SDEV_CACHE_DELETE:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1769
		error = sdev_cache_delete(ddv, dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1770
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1771
	default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1772
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1773
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1774
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1775
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1776
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1777
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1778
/*
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1779
 * retrieve the named entry from the directory cache
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1780
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1781
struct sdev_node *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1782
sdev_cache_lookup(struct sdev_node *ddv, char *nm)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1783
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1784
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1785
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1786
	ASSERT(RW_LOCK_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1787
	dv = sdev_findbyname(ddv, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1788
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1789
	return (dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1790
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1791
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1792
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1793
 * Implicit reconfig for nodes constructed by a link generator
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1794
 * Start devfsadm if needed, or if devfsadm is in progress,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1795
 * prepare to block on devfsadm either completing or
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1796
 * constructing the desired node.  As devfsadmd is global
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1797
 * in scope, constructing all necessary nodes, we only
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1798
 * need to initiate it once.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1799
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1800
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1801
sdev_call_devfsadmd(struct sdev_node *ddv, struct sdev_node *dv, char *nm)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1802
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1803
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1804
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1805
	if (DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1806
		sdcmn_err6(("lookup: waiting for %s/%s, 0x%x\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1807
		    ddv->sdev_name, nm, devfsadm_state));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1808
		mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1809
		SDEV_BLOCK_OTHERS(dv, (SDEV_LOOKUP | SDEV_LGWAITING));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1810
		mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1811
		error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1812
	} else if (!DEVNAME_DEVFSADM_HAS_RUN(devfsadm_state)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1813
		sdcmn_err6(("lookup %s/%s starting devfsadm, 0x%x\n",
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  1814
		    ddv->sdev_name, nm, devfsadm_state));
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1815
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1816
		sdev_devfsadmd_thread(ddv, dv, kcred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1817
		mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1818
		SDEV_BLOCK_OTHERS(dv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1819
		    (SDEV_LOOKUP | SDEV_LGWAITING));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1820
		mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1821
		error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1822
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1823
		error = -1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1824
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1825
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1826
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1827
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1828
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1829
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1830
sdev_call_modulelookup(struct sdev_node *ddv, struct sdev_node **dvp, char *nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1831
    int (*fn)(char *, devname_handle_t *, struct cred *), struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1832
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1833
	struct vnode *rvp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1834
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1835
	struct vattr *vap;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1836
	devname_spec_t spec;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1837
	devname_handle_t *hdl;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1838
	void *args = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1839
	struct sdev_node *dv = *dvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1840
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1841
	ASSERT(dv && ddv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1842
	hdl = &(dv->sdev_handle);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1843
	ASSERT(hdl->dh_data == dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1844
	mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1845
	SDEV_BLOCK_OTHERS(dv, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1846
	mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1847
	error = (*fn)(nm, hdl, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1848
	if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1849
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1850
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1851
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1852
	spec = hdl->dh_spec;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1853
	args = hdl->dh_args;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1854
	ASSERT(args);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1855
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1856
	switch (spec) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1857
	case DEVNAME_NS_PATH:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1858
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1859
		 * symlink of:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1860
		 *	/dev/dir/nm -> /device/...
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1861
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1862
		rvp = devname_configure_by_path((char *)args, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1863
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1864
	case DEVNAME_NS_DEV:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1865
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1866
		 * symlink of:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1867
		 *	/dev/dir/nm -> /dev/...
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1868
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1869
		rvp = devname_find_by_devpath((char *)args, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1870
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1871
	default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1872
		if (args)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1873
			kmem_free((char *)args, strlen(args) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1874
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1875
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1876
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1877
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1878
	if (rvp == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1879
		if (args)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1880
			kmem_free((char *)args, strlen(args) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1881
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1882
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1883
		vap = sdev_getdefault_attr(VLNK);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1884
		ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1885
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1886
		 * Could sdev_mknode return a different dv_node
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1887
		 * once the lock is dropped?
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1888
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1889
		if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1890
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1891
			rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1892
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1893
		error = sdev_mknode(ddv, nm, &dv, vap, NULL, args, cred,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1894
		    SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1895
		rw_downgrade(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1896
		if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1897
			if (args)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1898
				kmem_free((char *)args, strlen(args) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1899
			return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1900
		} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1901
			mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1902
			SDEV_UNBLOCK_OTHERS(dv, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1903
			mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1904
			error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1905
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1906
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1907
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1908
	if (args)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1909
		kmem_free((char *)args, strlen(args) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1910
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1911
	*dvp = dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1912
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1913
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1914
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1915
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1916
 *  Support for specialized device naming construction mechanisms
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1917
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1918
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1919
sdev_call_dircallback(struct sdev_node *ddv, struct sdev_node **dvp, char *nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1920
    int (*callback)(struct sdev_node *, char *, void **, struct cred *,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1921
    void *, char *), int flags, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1922
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1923
	int rv = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1924
	char *physpath = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1925
	struct vnode *rvp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1926
	struct vattr vattr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1927
	struct vattr *vap;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1928
	struct sdev_node *dv = *dvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1929
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1930
	mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1931
	SDEV_BLOCK_OTHERS(dv, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1932
	mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1933
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1934
	/* for non-devfsadm devices */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1935
	if (flags & SDEV_PATH) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1936
		physpath = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1937
		rv = callback(ddv, nm, (void *)&physpath, kcred, NULL,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1938
		    NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1939
		if (rv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1940
			kmem_free(physpath, MAXPATHLEN);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1941
			return (-1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1942
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1943
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1944
		ASSERT(physpath);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1945
		rvp = devname_configure_by_path(physpath, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1946
		if (rvp == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1947
			sdcmn_err3(("devname_configure_by_path: "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1948
			    "failed for /dev/%s/%s\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1949
			    ddv->sdev_name, nm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1950
			kmem_free(physpath, MAXPATHLEN);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1951
			rv = -1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1952
		} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1953
			vap = sdev_getdefault_attr(VLNK);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1954
			ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1955
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1956
			/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1957
			 * Sdev_mknode may return back a different sdev_node
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1958
			 * that was created by another thread that
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1959
			 * raced to the directroy cache before this thread.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1960
			 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1961
			 * With current directory cache mechanism
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1962
			 * (linked list with the sdev_node name as
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1963
			 * the entity key), this is a way to make sure
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1964
			 * only one entry exists for the same name
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1965
			 * in the same directory. The outcome is
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1966
			 * the winner wins.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1967
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1968
			if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1969
				rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1970
				rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1971
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1972
			rv = sdev_mknode(ddv, nm, &dv, vap, NULL,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1973
			    (void *)physpath, cred, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1974
			rw_downgrade(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1975
			kmem_free(physpath, MAXPATHLEN);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1976
			if (rv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1977
				return (rv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1978
			} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1979
				mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1980
				SDEV_UNBLOCK_OTHERS(dv, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1981
				mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1982
				return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1983
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1984
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1985
	} else if (flags & SDEV_VNODE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1986
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1987
		 * DBNR has its own way to create the device
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1988
		 * and return a backing store vnode in rvp
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1989
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1990
		ASSERT(callback);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1991
		rv = callback(ddv, nm, (void *)&rvp, kcred, NULL, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1992
		if (rv || (rvp == NULL)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1993
			sdcmn_err3(("devname_lookup_func: SDEV_VNODE "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1994
			    "callback failed \n"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1995
			return (-1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1996
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1997
		vap = sdev_getdefault_attr(rvp->v_type);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1998
		if (vap == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1999
			return (-1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2000
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2001
		ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2002
		if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2003
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2004
			rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2005
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2006
		rv = sdev_mknode(ddv, nm, &dv, vap, rvp, NULL,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2007
		    cred, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2008
		rw_downgrade(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2009
		if (rv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2010
			return (rv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2011
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2012
		mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2013
		SDEV_UNBLOCK_OTHERS(dv, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2014
		mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2015
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2016
	} else if (flags & SDEV_VATTR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2017
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2018
		 * /dev/pts
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2019
		 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2020
		 * DBNR has its own way to create the device
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2021
		 * "0" is returned upon success.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2022
		 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2023
		 * callback is responsible to set the basic attributes,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2024
		 * e.g. va_type/va_uid/va_gid/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2025
		 *    dev_t if VCHR or VBLK/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2026
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2027
		ASSERT(callback);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2028
		rv = callback(ddv, nm, (void *)&vattr, kcred, NULL, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2029
		if (rv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2030
			sdcmn_err3(("devname_lookup_func: SDEV_NONE "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2031
			    "callback failed \n"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2032
			return (-1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2033
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2034
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2035
		ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2036
		if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2037
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2038
			rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2039
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2040
		rv = sdev_mknode(ddv, nm, &dv, &vattr, NULL, NULL,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2041
		    cred, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2042
		rw_downgrade(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2043
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2044
		if (rv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2045
			return (rv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2046
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2047
		mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2048
		SDEV_UNBLOCK_OTHERS(dv, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2049
		mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2050
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2051
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2052
		impossible(("lookup: %s/%s by %s not supported (%d)\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2053
		    SDEVTOV(ddv)->v_path, nm, curproc->p_user.u_comm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2054
		    __LINE__));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2055
		rv = -1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2056
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2057
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2058
	*dvp = dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2059
	return (rv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2060
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2061
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2062
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2063
is_devfsadm_thread(char *exec_name)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2064
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2065
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2066
	 * note: because devfsadmd -> /usr/sbin/devfsadm
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2067
	 * it is safe to use "devfsadm" to capture the lookups
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2068
	 * from devfsadm and its daemon version.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2069
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2070
	if (strcmp(exec_name, "devfsadm") == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2071
		return (1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2072
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2073
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2074
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2075
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2076
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2077
 * Lookup Order:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2078
 *	sdev_node cache;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2079
 *	backing store (SDEV_PERSIST);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2080
 *	DBNR: a. dir_ops implemented in the loadable modules;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2081
 *	      b. vnode ops in vtab.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2082
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2083
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2084
devname_lookup_func(struct sdev_node *ddv, char *nm, struct vnode **vpp,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2085
    struct cred *cred, int (*callback)(struct sdev_node *, char *, void **,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2086
    struct cred *, void *, char *), int flags)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2087
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2088
	int rv = 0, nmlen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2089
	struct vnode *rvp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2090
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2091
	int	retried = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2092
	int	error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2093
	struct devname_nsmap *map = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2094
	struct devname_ops *dirops = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2095
	int (*fn)(char *, devname_handle_t *, struct cred *) = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2096
	struct vattr vattr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2097
	char *lookup_thread = curproc->p_user.u_comm;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2098
	int failed_flags = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2099
	int (*vtor)(struct sdev_node *) = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2100
	int state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2101
	int parent_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2102
	char *link = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2103
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2104
	if (SDEVTOV(ddv)->v_type != VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2105
		return (ENOTDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2106
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2107
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2108
	 * Empty name or ., return node itself.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2109
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2110
	nmlen = strlen(nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2111
	if ((nmlen == 0) || ((nmlen == 1) && (nm[0] == '.'))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2112
		*vpp = SDEVTOV(ddv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2113
		VN_HOLD(*vpp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2114
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2115
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2116
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2117
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2118
	 * .., return the parent directory
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2119
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2120
	if ((nmlen == 2) && (strcmp(nm, "..") == 0)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2121
		*vpp = SDEVTOV(ddv->sdev_dotdot);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2122
		VN_HOLD(*vpp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2123
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2124
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2125
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2126
	rw_enter(&ddv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2127
	if (ddv->sdev_flags & SDEV_VTOR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2128
		vtor = (int (*)(struct sdev_node *))sdev_get_vtor(ddv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2129
		ASSERT(vtor);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2130
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2131
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2132
tryagain:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2133
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2134
	 * (a) directory cache lookup:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2135
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2136
	ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2137
	parent_state = ddv->sdev_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2138
	dv = sdev_cache_lookup(ddv, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2139
	if (dv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2140
		state = dv->sdev_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2141
		switch (state) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2142
		case SDEV_INIT:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2143
			if (is_devfsadm_thread(lookup_thread))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2144
				break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2145
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2146
			/* ZOMBIED parent won't allow node creation */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2147
			if (parent_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2148
				SD_TRACE_FAILED_LOOKUP(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2149
				    retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2150
				goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2151
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2152
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2153
			mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2154
			/* compensate the threads started after devfsadm */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2155
			if (DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2156
			    !(SDEV_IS_LOOKUP(dv)))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2157
				SDEV_BLOCK_OTHERS(dv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2158
				    (SDEV_LOOKUP | SDEV_LGWAITING));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2159
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2160
			if (SDEV_IS_LOOKUP(dv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2161
				failed_flags |= SLF_REBUILT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2162
				rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2163
				error = sdev_wait4lookup(dv, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2164
				mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2165
				rw_enter(&ddv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2166
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2167
				if (error != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2168
					SD_TRACE_FAILED_LOOKUP(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2169
					    retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2170
					goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2171
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2172
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2173
				state = dv->sdev_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2174
				if (state == SDEV_INIT) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2175
					SD_TRACE_FAILED_LOOKUP(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2176
					    retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2177
					goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2178
				} else if (state == SDEV_READY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2179
					goto found;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2180
				} else if (state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2181
					rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2182
					SD_TRACE_FAILED_LOOKUP(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2183
					    retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2184
					SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2185
					goto lookup_failed;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2186
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2187
			} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2188
				mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2189
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2190
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2191
		case SDEV_READY:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2192
			goto found;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2193
		case SDEV_ZOMBIE:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2194
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2195
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2196
			SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2197
			goto lookup_failed;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2198
		default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2199
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2200
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2201
			sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2202
			*vpp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2203
			return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2204
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2205
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2206
	ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2207
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2208
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2209
	 * ZOMBIED parent does not allow new node creation.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2210
	 * bail out early
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2211
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2212
	if (parent_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2213
		rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2214
		*vpp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2215
		SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2216
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2217
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2218
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2219
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2220
	 * (b0): backing store lookup
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2221
	 *	SDEV_PERSIST is default except:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2222
	 *		1) pts nodes
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2223
	 *		2) non-chmod'ed local nodes
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2224
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2225
	if (SDEV_IS_PERSIST(ddv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2226
		error = devname_backstore_lookup(ddv, nm, &rvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2227
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2228
		if (!error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2229
			sdcmn_err3(("devname_backstore_lookup: "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2230
			    "found attrvp %p for %s\n", (void *)rvp, nm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2231
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2232
			vattr.va_mask = AT_MODE|AT_UID|AT_GID;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  2233
			error = VOP_GETATTR(rvp, &vattr, 0, cred, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2234
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2235
				rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2236
				if (dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2237
					SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2238
				SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2239
				sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2240
				*vpp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2241
				return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2242
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2243
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2244
			if (vattr.va_type == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2245
				error = sdev_getlink(rvp, &link);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2246
				if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2247
					rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2248
					if (dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2249
						SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2250
					SD_TRACE_FAILED_LOOKUP(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2251
					    retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2252
					sdev_lookup_failed(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2253
					    failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2254
					*vpp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2255
					return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2256
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2257
				ASSERT(link != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2258
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2259
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2260
			if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2261
				rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2262
				rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2263
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2264
			error = sdev_mknode(ddv, nm, &dv, &vattr,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2265
			    rvp, link, cred, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2266
			rw_downgrade(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2267
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2268
			if (link != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2269
				kmem_free(link, strlen(link) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2270
				link = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2271
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2272
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2273
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2274
				SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2275
				rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2276
				if (dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2277
					SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2278
				goto lookup_failed;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2279
			} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2280
				goto found;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2281
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2282
		} else if (retried) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2283
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2284
			sdcmn_err3(("retry of lookup of %s/%s: failed\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2285
			    ddv->sdev_name, nm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2286
			if (dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2287
				SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2288
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2289
			sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2290
			*vpp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2291
			return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2292
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2293
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2294
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2295
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2296
	/* first thread that is doing the lookup on this node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2297
	if (!dv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2298
		if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2299
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2300
			rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2301
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2302
		error = sdev_mknode(ddv, nm, &dv, NULL, NULL, NULL,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2303
		    cred, SDEV_INIT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2304
		if (!dv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2305
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2306
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2307
			sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2308
			*vpp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2309
			return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2310
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2311
		rw_downgrade(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2312
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2313
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2314
	ASSERT(SDEV_HELD(dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2315
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2316
	if (SDEV_IS_NO_NCACHE(dv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2317
		failed_flags |= SLF_NO_NCACHE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2318
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2319
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2320
	if (SDEV_IS_GLOBAL(ddv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2321
		map = sdev_get_map(ddv, 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2322
		dirops = map ? map->dir_ops : NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2323
		fn = dirops ? dirops->devnops_lookup : NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2324
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2325
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2326
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2327
	 * (b1) invoking devfsadm once per life time for devfsadm nodes
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2328
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2329
	if ((fn == NULL) && !callback) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2330
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2331
		if (sdev_reconfig_boot || !i_ddi_io_initialized() ||
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2332
		    SDEV_IS_DYNAMIC(ddv) || SDEV_IS_NO_NCACHE(dv) ||
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2333
		    ((moddebug & MODDEBUG_FINI_EBUSY) != 0)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2334
			ASSERT(SDEV_HELD(dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2335
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2336
			goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2337
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2338
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2339
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2340
		 * filter out known non-existent devices recorded
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2341
		 * during initial reconfiguration boot for which
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2342
		 * reconfig should not be done and lookup may
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2343
		 * be short-circuited now.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2344
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2345
		if (sdev_lookup_filter(ddv, nm)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2346
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2347
			goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2348
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2349
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2350
		/* bypassing devfsadm internal nodes */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2351
		if (is_devfsadm_thread(lookup_thread)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2352
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2353
			goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2354
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2355
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2356
		if (sdev_reconfig_disable) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2357
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2358
			goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2359
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2360
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2361
		error = sdev_call_devfsadmd(ddv, dv, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2362
		if (error == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2363
			sdcmn_err8(("lookup of %s/%s by %s: reconfig\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2364
			    ddv->sdev_name, nm, curproc->p_user.u_comm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2365
			if (sdev_reconfig_verbose) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2366
				cmn_err(CE_CONT,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2367
				    "?lookup of %s/%s by %s: reconfig\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2368
				    ddv->sdev_name, nm, curproc->p_user.u_comm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2369
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2370
			retried = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2371
			failed_flags |= SLF_REBUILT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2372
			ASSERT(dv->sdev_state != SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2373
			SDEV_SIMPLE_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2374
			goto tryagain;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2375
		} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2376
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2377
			goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2378
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2379
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2380
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2381
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2382
	 * (b2) Directory Based Name Resolution (DBNR):
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2383
	 *	ddv	- parent
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2384
	 *	nm	- /dev/(ddv->sdev_name)/nm
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2385
	 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2386
	 *	note: module vnode ops take precedence than the build-in ones
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2387
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2388
	if (fn) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2389
		error = sdev_call_modulelookup(ddv, &dv, nm, fn, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2390
		if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2391
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2392
			goto notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2393
		} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2394
			goto found;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2395
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2396
	} else if (callback) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2397
		error = sdev_call_dircallback(ddv, &dv, nm, callback,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2398
		    flags, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2399
		if (error == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2400
			goto found;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2401
		} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2402
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2403
			goto notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2404
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2405
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2406
	ASSERT(rvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2407
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2408
found:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2409
	ASSERT(!(dv->sdev_flags & SDEV_STALE));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2410
	ASSERT(dv->sdev_state == SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2411
	if (vtor) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2412
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2413
		 * Check validity of returned node
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2414
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2415
		switch (vtor(dv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2416
		case SDEV_VTOR_VALID:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2417
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2418
		case SDEV_VTOR_INVALID:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2419
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2420
			sdcmn_err7(("lookup: destroy invalid "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2421
			    "node: %s(%p)\n", dv->sdev_name, (void *)dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2422
			goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2423
		case SDEV_VTOR_SKIP:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2424
			sdcmn_err7(("lookup: node not applicable - "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2425
			    "skipping: %s(%p)\n", dv->sdev_name, (void *)dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2426
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2427
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2428
			SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2429
			goto lookup_failed;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2430
		default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2431
			cmn_err(CE_PANIC,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2432
			    "dev fs: validator failed: %s(%p)\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2433
			    dv->sdev_name, (void *)dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2434
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2435
			/*NOTREACHED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2436
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2437
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2438
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2439
	if ((SDEVTOV(dv)->v_type == VDIR) && SDEV_IS_GLOBAL(dv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2440
		rw_enter(&dv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2441
		(void) sdev_get_map(dv, 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2442
		rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2443
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2444
	rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2445
	rv = sdev_to_vp(dv, vpp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2446
	sdcmn_err3(("devname_lookup_func: returning vp %p v_count %d state %d "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2447
	    "for nm %s, error %d\n", (void *)*vpp, (*vpp)->v_count,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2448
	    dv->sdev_state, nm, rv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2449
	return (rv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2450
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2451
notfound:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2452
	mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2453
	SDEV_UNBLOCK_OTHERS(dv, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2454
	mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2455
nolock_notfound:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2456
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2457
	 * Destroy the node that is created for synchronization purposes.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2458
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2459
	sdcmn_err3(("devname_lookup_func: %s with state %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2460
	    nm, dv->sdev_state));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2461
	ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2462
	if (dv->sdev_state == SDEV_INIT) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2463
		if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2464
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2465
			rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2466
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2467
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2468
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2469
		 * Node state may have changed during the lock
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2470
		 * changes. Re-check.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2471
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2472
		if (dv->sdev_state == SDEV_INIT) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2473
			(void) sdev_dirdelete(ddv, dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2474
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2475
			sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2476
			*vpp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2477
			return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2478
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2479
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2480
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2481
	rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2482
	SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2483
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2484
lookup_failed:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2485
	sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2486
	*vpp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2487
	return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2488
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2489
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2490
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2491
 * Given a directory node, mark all nodes beneath as
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2492
 * STALE, i.e. nodes that don't exist as far as new
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2493
 * consumers are concerned
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2494
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2495
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2496
sdev_stale(struct sdev_node *ddv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2497
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2498
	struct sdev_node *dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2499
	struct vnode *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2500
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2501
	ASSERT(SDEVTOV(ddv)->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2502
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2503
	rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2504
	for (dv = ddv->sdev_dot; dv; dv = dv->sdev_next) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2505
		vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2506
		if (vp->v_type == VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2507
			sdev_stale(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2508
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2509
		sdcmn_err9(("sdev_stale: setting stale %s\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2510
		    dv->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2511
		dv->sdev_flags |= SDEV_STALE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2512
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2513
	ddv->sdev_flags |= SDEV_BUILD;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2514
	rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2515
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2516
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2517
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2518
 * Given a directory node, clean out all the nodes beneath.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2519
 * If expr is specified, clean node with names matching expr.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2520
 * If SDEV_ENFORCE is specified in flags, busy nodes are made stale,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2521
 *	so they are excluded from future lookups.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2522
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2523
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2524
sdev_cleandir(struct sdev_node *ddv, char *expr, uint_t flags)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2525
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2526
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2527
	int busy = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2528
	struct vnode *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2529
	struct sdev_node *dv, *next = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2530
	int bkstore = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2531
	int len = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2532
	char *bks_name = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2533
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2534
	ASSERT(SDEVTOV(ddv)->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2535
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2536
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2537
	 * We try our best to destroy all unused sdev_node's
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2538
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2539
	rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2540
	for (dv = ddv->sdev_dot; dv; dv = next) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2541
		next = dv->sdev_next;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2542
		vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2543
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2544
		if (expr && gmatch(dv->sdev_name, expr) == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2545
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2546
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2547
		if (vp->v_type == VDIR &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2548
		    sdev_cleandir(dv, NULL, flags) != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2549
			sdcmn_err9(("sdev_cleandir: dir %s busy\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2550
			    dv->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2551
			busy++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2552
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2553
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2554
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2555
		if (vp->v_count > 0 && (flags & SDEV_ENFORCE) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2556
			sdcmn_err9(("sdev_cleandir: dir %s busy\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2557
			    dv->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2558
			busy++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2559
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2560
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2561
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2562
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2563
		 * at this point, either dv is not held or SDEV_ENFORCE
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2564
		 * is specified. In either case, dv needs to be deleted
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2565
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2566
		SDEV_HOLD(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2567
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2568
		bkstore = SDEV_IS_PERSIST(dv) ? 1 : 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2569
		if (bkstore && (vp->v_type == VDIR))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2570
			bkstore += 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2571
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2572
		if (bkstore) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2573
			len = strlen(dv->sdev_name) + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2574
			bks_name = kmem_alloc(len, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2575
			bcopy(dv->sdev_name, bks_name, len);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2576
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2577
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2578
		error = sdev_dirdelete(ddv, dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2579
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2580
		if (error == EBUSY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2581
			sdcmn_err9(("sdev_cleandir: dir busy\n"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2582
			busy++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2583
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2584
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2585
		/* take care the backing store clean up */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2586
		if (bkstore && (error == 0)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2587
			ASSERT(bks_name);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2588
			ASSERT(ddv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2589
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2590
			if (bkstore == 1) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2591
				error = VOP_REMOVE(ddv->sdev_attrvp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  2592
				    bks_name, kcred, NULL, 0);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2593
			} else if (bkstore == 2) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2594
				error = VOP_RMDIR(ddv->sdev_attrvp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  2595
				    bks_name, ddv->sdev_attrvp, kcred, NULL, 0);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2596
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2597
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2598
			/* do not propagate the backing store errors */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2599
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2600
				sdcmn_err9(("sdev_cleandir: backing store"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2601
				    "not cleaned\n"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2602
				error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2603
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2604
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2605
			bkstore = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2606
			kmem_free(bks_name, len);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2607
			bks_name = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2608
			len = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2609
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2610
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2611
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2612
	ddv->sdev_flags |= SDEV_BUILD;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2613
	rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2614
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2615
	if (busy) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2616
		error = EBUSY;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2617
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2618
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2619
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2620
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2622
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2623
 * a convenient wrapper for readdir() funcs
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2624
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2625
size_t
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2626
add_dir_entry(dirent64_t *de, char *nm, size_t size, ino_t ino, offset_t off)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2627
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2628
	size_t reclen = DIRENT64_RECLEN(strlen(nm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2629
	if (reclen > size)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2630
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2631
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2632
	de->d_ino = (ino64_t)ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2633
	de->d_off = (off64_t)off + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2634
	de->d_reclen = (ushort_t)reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2635
	(void) strncpy(de->d_name, nm, DIRENT64_NAMELEN(reclen));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2636
	return (reclen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2637
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2638
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2639
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2640
 * sdev_mount service routines
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2641
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2642
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2643
sdev_copyin_mountargs(struct mounta *uap, struct sdev_mountargs *args)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2644
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2645
	int	error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2646
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2647
	if (uap->datalen != sizeof (*args))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2648
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2649
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2650
	if (error = copyin(uap->dataptr, args, sizeof (*args))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2651
		cmn_err(CE_WARN, "sdev_copyin_mountargs: can not"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2652
		    "get user data. error %d\n", error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2653
		return (EFAULT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2654
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2655
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2656
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2657
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2658
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2659
#ifdef nextdp
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2660
#undef nextdp
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2661
#endif
3133
63b5e3581eee 6491034 dev: lint cleanup
jg
parents: 2742
diff changeset
  2662
#define	nextdp(dp)	((struct dirent64 *) \
63b5e3581eee 6491034 dev: lint cleanup
jg
parents: 2742
diff changeset
  2663
			    (intptr_t)((char *)(dp) + (dp)->d_reclen))
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2664
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2665
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2666
 * readdir helper func
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2667
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2668
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2669
devname_readdir_func(vnode_t *vp, uio_t *uiop, cred_t *cred, int *eofp,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2670
    int flags)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2671
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2672
	struct sdev_node *ddv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2673
	struct sdev_node *dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2674
	dirent64_t	*dp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2675
	ulong_t		outcount = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2676
	size_t		namelen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2677
	ulong_t		alloc_count;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2678
	void		*outbuf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2679
	struct iovec	*iovp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2680
	int		error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2681
	size_t		reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2682
	offset_t	diroff;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2683
	offset_t	soff;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2684
	int		this_reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2685
	struct devname_nsmap	*map = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2686
	struct devname_ops	*dirops = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2687
	int (*fn)(devname_handle_t *, struct cred *) = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2688
	int (*vtor)(struct sdev_node *) = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2689
	struct vattr attr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2690
	timestruc_t now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2691
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2692
	ASSERT(ddv->sdev_attr || ddv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2693
	ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2694
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2695
	if (uiop->uio_loffset >= MAXOFF_T) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2696
		if (eofp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2697
			*eofp = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2698
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2699
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2700
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2701
	if (uiop->uio_iovcnt != 1)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2702
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2703
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2704
	if (vp->v_type != VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2705
		return (ENOTDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2706
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2707
	if (ddv->sdev_flags & SDEV_VTOR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2708
		vtor = (int (*)(struct sdev_node *))sdev_get_vtor(ddv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2709
		ASSERT(vtor);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2710
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2711
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2712
	if (eofp != NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2713
		*eofp = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2714
3133
63b5e3581eee 6491034 dev: lint cleanup
jg
parents: 2742
diff changeset
  2715
	soff = uiop->uio_loffset;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2716
	iovp = uiop->uio_iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2717
	alloc_count = iovp->iov_len;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2718
	dp = outbuf = kmem_alloc(alloc_count, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2719
	outcount = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2720
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2721
	if (ddv->sdev_state == SDEV_ZOMBIE)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2722
		goto get_cache;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2723
2679
39fc2aead8db 6464694 assert failure during "ls $ZONEROOT/dev/pts"
szhou
parents: 2621
diff changeset
  2724
	if (SDEV_IS_GLOBAL(ddv)) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2725
		map = sdev_get_map(ddv, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2726
		dirops = map ? map->dir_ops : NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2727
		fn = dirops ? dirops->devnops_readdir : NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2728
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2729
		if (map && map->dir_map) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2730
			/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2731
			 * load the name mapping rule database
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2732
			 * through invoking devfsadm and symlink
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2733
			 * all the entries in the map
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2734
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2735
			devname_rdr_result_t rdr_result;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2736
			int do_thread = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2737
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2738
			rw_enter(&map->dir_lock, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2739
			do_thread = map->dir_maploaded ? 0 : 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2740
			rw_exit(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2741
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2742
			if (do_thread) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2743
				mutex_enter(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2744
				SDEV_BLOCK_OTHERS(ddv, SDEV_READDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2745
				mutex_exit(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2746
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2747
				sdev_dispatch_to_nsrdr_thread(ddv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2748
				    map->dir_map, &rdr_result);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2749
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2750
		} else if ((sdev_boot_state == SDEV_BOOT_STATE_COMPLETE) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2751
		    !sdev_reconfig_boot && (flags & SDEV_BROWSE) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2752
		    !SDEV_IS_DYNAMIC(ddv) && !SDEV_IS_NO_NCACHE(ddv) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2753
		    ((moddebug & MODDEBUG_FINI_EBUSY) == 0) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2754
		    !DEVNAME_DEVFSADM_HAS_RUN(devfsadm_state) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2755
		    !DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2756
		    !sdev_reconfig_disable) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2757
			/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2758
			 * invoking "devfsadm" to do system device reconfig
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2759
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2760
			mutex_enter(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2761
			SDEV_BLOCK_OTHERS(ddv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2762
			    (SDEV_READDIR|SDEV_LGWAITING));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2763
			mutex_exit(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2764
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2765
			sdcmn_err8(("readdir of %s by %s: reconfig\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2766
			    ddv->sdev_path, curproc->p_user.u_comm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2767
			if (sdev_reconfig_verbose) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2768
				cmn_err(CE_CONT,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2769
				    "?readdir of %s by %s: reconfig\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2770
				    ddv->sdev_path, curproc->p_user.u_comm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2771
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2772
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2773
			sdev_devfsadmd_thread(ddv, NULL, kcred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2774
		} else if (DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2775
			/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2776
			 * compensate the "ls" started later than "devfsadm"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2777
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2778
			mutex_enter(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2779
			SDEV_BLOCK_OTHERS(ddv, (SDEV_READDIR|SDEV_LGWAITING));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2780
			mutex_exit(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2781
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2782
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2783
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2784
		 * release the contents lock so that
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  2785
		 * the cache may be updated by devfsadmd
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2786
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2787
		rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2788
		mutex_enter(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2789
		if (SDEV_IS_READDIR(ddv))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2790
			(void) sdev_wait4lookup(ddv, SDEV_READDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2791
		mutex_exit(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2792
		rw_enter(&ddv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2793
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2794
		sdcmn_err4(("readdir of directory %s by %s\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2795
		    ddv->sdev_name, curproc->p_user.u_comm));
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  2796
		if (ddv->sdev_flags & SDEV_BUILD) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2797
			if (SDEV_IS_PERSIST(ddv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2798
				error = sdev_filldir_from_store(ddv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2799
				    alloc_count, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2800
			}
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  2801
			ddv->sdev_flags &= ~SDEV_BUILD;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2802
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2803
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2804
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2805
get_cache:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2806
	/* handle "." and ".." */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2807
	diroff = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2808
	if (soff == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2809
		/* first time */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2810
		this_reclen = DIRENT64_RECLEN(1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2811
		if (alloc_count < this_reclen) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2812
			error = EINVAL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2813
			goto done;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2814
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2815
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2816
		dp->d_ino = (ino64_t)ddv->sdev_ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2817
		dp->d_off = (off64_t)1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2818
		dp->d_reclen = (ushort_t)this_reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2819
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2820
		(void) strncpy(dp->d_name, ".",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2821
		    DIRENT64_NAMELEN(this_reclen));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2822
		outcount += dp->d_reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2823
		dp = nextdp(dp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2824
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2825
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2826
	diroff++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2827
	if (soff <= 1) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2828
		this_reclen = DIRENT64_RECLEN(2);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2829
		if (alloc_count < outcount + this_reclen) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2830
			error = EINVAL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2831
			goto done;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2832
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2833
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2834
		dp->d_reclen = (ushort_t)this_reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2835
		dp->d_ino = (ino64_t)ddv->sdev_dotdot->sdev_ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2836
		dp->d_off = (off64_t)2;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2837
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2838
		(void) strncpy(dp->d_name, "..",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2839
		    DIRENT64_NAMELEN(this_reclen));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2840
		outcount += dp->d_reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2841
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2842
		dp = nextdp(dp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2843
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2844
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2845
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2846
	/* gets the cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2847
	diroff++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2848
	for (dv = ddv->sdev_dot; dv; dv = dv->sdev_next, diroff++) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2849
		sdcmn_err3(("sdev_readdir: diroff %lld soff %lld for '%s' \n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2850
		    diroff, soff, dv->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2851
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2852
		/* bypassing pre-matured nodes */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2853
		if (diroff < soff || (dv->sdev_state != SDEV_READY)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2854
			sdcmn_err3(("sdev_readdir: pre-mature node  "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2855
			    "%s\n", dv->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2856
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2857
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2858
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2859
		/* don't list stale nodes */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2860
		if (dv->sdev_flags & SDEV_STALE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2861
			sdcmn_err4(("sdev_readdir: STALE node  "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2862
			    "%s\n", dv->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2863
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2864
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2865
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2866
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2867
		 * Check validity of node
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2868
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2869
		if (vtor) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2870
			switch (vtor(dv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2871
			case SDEV_VTOR_VALID:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2872
				break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2873
			case SDEV_VTOR_INVALID:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2874
			case SDEV_VTOR_SKIP:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2875
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2876
			default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2877
				cmn_err(CE_PANIC,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2878
				    "dev fs: validator failed: %s(%p)\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2879
				    dv->sdev_name, (void *)dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2880
				break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2881
			/*NOTREACHED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2882
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2883
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2884
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2885
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2886
		 * call back into the module for the validity/bookkeeping
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2887
		 * of this entry
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2888
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2889
		if (fn) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2890
			error = (*fn)(&(dv->sdev_handle), cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2891
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2892
				sdcmn_err4(("sdev_readdir: module did not "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2893
				    "validate %s\n", dv->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2894
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2895
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2896
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2897
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2898
		namelen = strlen(dv->sdev_name);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2899
		reclen = DIRENT64_RECLEN(namelen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2900
		if (outcount + reclen > alloc_count) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2901
			goto full;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2902
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2903
		dp->d_reclen = (ushort_t)reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2904
		dp->d_ino = (ino64_t)dv->sdev_ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2905
		dp->d_off = (off64_t)diroff + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2906
		(void) strncpy(dp->d_name, dv->sdev_name,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2907
		    DIRENT64_NAMELEN(reclen));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2908
		outcount += reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2909
		dp = nextdp(dp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2910
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2911
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2912
full:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2913
	sdcmn_err4(("sdev_readdir: moving %lu bytes: "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2914
	    "diroff %lld, soff %lld, dv %p\n", outcount, diroff, soff,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2915
	    (void *)dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2916
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2917
	if (outcount)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2918
		error = uiomove(outbuf, outcount, UIO_READ, uiop);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2919
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2920
	if (!error) {
3133
63b5e3581eee 6491034 dev: lint cleanup
jg
parents: 2742
diff changeset
  2921
		uiop->uio_loffset = diroff;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2922
		if (eofp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2923
			*eofp = dv ? 0 : 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2924
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2925
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2926
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2927
	if (ddv->sdev_attrvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2928
		gethrestime(&now);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2929
		attr.va_ctime = now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2930
		attr.va_atime = now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2931
		attr.va_mask = AT_CTIME|AT_ATIME;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2932
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2933
		(void) VOP_SETATTR(ddv->sdev_attrvp, &attr, 0, kcred, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2934
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2935
done:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2936
	kmem_free(outbuf, alloc_count);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2937
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2938
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2939
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2940
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2941
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2942
sdev_modctl_lookup(const char *path, vnode_t **r_vp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2943
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2944
	vnode_t *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2945
	vnode_t *cvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2946
	struct sdev_node *svp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2947
	char *nm;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2948
	struct pathname pn;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2949
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2950
	int persisted = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2951
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2952
	if (error = pn_get((char *)path, UIO_SYSSPACE, &pn))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2953
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2954
	nm = kmem_alloc(MAXNAMELEN, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2955
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2956
	vp = rootdir;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2957
	VN_HOLD(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2958
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2959
	while (pn_pathleft(&pn)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2960
		ASSERT(vp->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2961
		(void) pn_getcomponent(&pn, nm);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  2962
		error = VOP_LOOKUP(vp, nm, &cvp, NULL, 0, NULL, kcred, NULL,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  2963
		    NULL, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2964
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2965
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2966
		if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2967
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2968
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2969
		/* traverse mount points encountered on our journey */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2970
		if (vn_ismntpt(cvp) && (error = traverse(&cvp)) != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2971
			VN_RELE(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2972
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2973
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2974
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2975
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2976
		 * Direct the operation to the persisting filesystem
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2977
		 * underlying /dev.  Bail if we encounter a
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2978
		 * non-persistent dev entity here.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2979
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2980
		if (cvp->v_vfsp->vfs_fstype == devtype) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2981
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2982
			if ((VTOSDEV(cvp)->sdev_flags & SDEV_PERSIST) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2983
				error = ENOENT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2984
				VN_RELE(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2985
				break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2986
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2987
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2988
			if (VTOSDEV(cvp) == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2989
				error = ENOENT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2990
				VN_RELE(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2991
				break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2992
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2993
			svp = VTOSDEV(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2994
			if ((vp = svp->sdev_attrvp) == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2995
				error = ENOENT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2996
				VN_RELE(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2997
				break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2998
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2999
			persisted = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3000
			VN_HOLD(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3001
			VN_RELE(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3002
			cvp = vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3003
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3004
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3005
		vp = cvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3006
		pn_skipslash(&pn);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3007
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3008
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3009
	kmem_free(nm, MAXNAMELEN);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3010
	pn_free(&pn);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3011
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3012
	if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3013
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3014
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3015
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3016
	 * Only return persisted nodes in the filesystem underlying /dev.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3017
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3018
	if (!persisted) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3019
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3020
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3021
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3022
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3023
	*r_vp = vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3024
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3025
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3026
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3027
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3028
sdev_modctl_readdir(const char *dir, char ***dirlistp,
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  3029
	int *npathsp, int *npathsp_alloc, int checking_empty)
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3030
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3031
	char	**pathlist = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3032
	char	**newlist = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3033
	int	npaths = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3034
	int	npaths_alloc = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3035
	dirent64_t *dbuf = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3036
	int	n;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3037
	char	*s;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3038
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3039
	vnode_t *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3040
	int eof;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3041
	struct iovec iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3042
	struct uio uio;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3043
	struct dirent64 *dp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3044
	size_t dlen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3045
	size_t dbuflen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3046
	int ndirents = 64;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3047
	char *nm;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3048
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3049
	error = sdev_modctl_lookup(dir, &vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3050
	sdcmn_err11(("modctl readdir: %s by %s: %s\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3051
	    dir, curproc->p_user.u_comm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3052
	    (error == 0) ? "ok" : "failed"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3053
	if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3054
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3055
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3056
	dlen = ndirents * (sizeof (*dbuf));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3057
	dbuf = kmem_alloc(dlen, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3058
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3059
	uio.uio_iov = &iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3060
	uio.uio_iovcnt = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3061
	uio.uio_segflg = UIO_SYSSPACE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3062
	uio.uio_fmode = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3063
	uio.uio_extflg = UIO_COPY_CACHED;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3064
	uio.uio_loffset = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3065
	uio.uio_llimit = MAXOFFSET_T;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3066
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3067
	eof = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3068
	error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3069
	while (!error && !eof) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3070
		uio.uio_resid = dlen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3071
		iov.iov_base = (char *)dbuf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3072
		iov.iov_len = dlen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3073
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3074
		(void) VOP_RWLOCK(vp, V_WRITELOCK_FALSE, NULL);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  3075
		error = VOP_READDIR(vp, &uio, kcred, &eof, NULL, 0);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3076
		VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3077
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3078
		dbuflen = dlen - uio.uio_resid;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3079
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3080
		if (error || dbuflen == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3081
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3082
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3083
		for (dp = dbuf; ((intptr_t)dp < (intptr_t)dbuf + dbuflen);
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  3084
		    dp = (dirent64_t *)((intptr_t)dp + dp->d_reclen)) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3085
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3086
			nm = dp->d_name;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3087
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3088
			if (strcmp(nm, ".") == 0 || strcmp(nm, "..") == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3089
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3090
			if (npaths == npaths_alloc) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3091
				npaths_alloc += 64;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3092
				newlist = (char **)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3093
				    kmem_zalloc((npaths_alloc + 1) *
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  3094
				    sizeof (char *), KM_SLEEP);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3095
				if (pathlist) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3096
					bcopy(pathlist, newlist,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3097
					    npaths * sizeof (char *));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3098
					kmem_free(pathlist,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3099
					    (npaths + 1) * sizeof (char *));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3100
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3101
				pathlist = newlist;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3102
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3103
			n = strlen(nm) + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3104
			s = kmem_alloc(n, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3105
			bcopy(nm, s, n);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3106
			pathlist[npaths++] = s;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3107
			sdcmn_err11(("  %s/%s\n", dir, s));
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  3108
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  3109
			/* if checking empty, one entry is as good as many */
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  3110
			if (checking_empty) {
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  3111
				eof = 1;
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  3112
				break;
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  3113
			}
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3114
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3115
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3116
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3117
exit:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3118
	VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3119
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3120
	if (dbuf)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3121
		kmem_free(dbuf, dlen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3122
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3123
	if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3124
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3125
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3126
	*dirlistp = pathlist;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3127
	*npathsp = npaths;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3128
	*npathsp_alloc = npaths_alloc;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3129
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3130
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3131
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3132
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3133
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3134
sdev_modctl_readdir_free(char **pathlist, int npaths, int npaths_alloc)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3135
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3136
	int	i, n;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3137
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3138
	for (i = 0; i < npaths; i++) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3139
		n = strlen(pathlist[i]) + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3140
		kmem_free(pathlist[i], n);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3141
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3142
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3143
	kmem_free(pathlist, (npaths_alloc + 1) * sizeof (char *));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3144
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3145
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3146
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3147
sdev_modctl_devexists(const char *path)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3148
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3149
	vnode_t *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3150
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3151
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3152
	error = sdev_modctl_lookup(path, &vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3153
	sdcmn_err11(("modctl dev exists: %s by %s: %s\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3154
	    path, curproc->p_user.u_comm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3155
	    (error == 0) ? "ok" : "failed"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3156
	if (error == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3157
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3158
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3159
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3160
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3161
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3162
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3163
sdev_update_newnsmap(struct devname_nsmap *map, char *module, char *mapname)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3164
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3165
	rw_enter(&map->dir_lock, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3166
	if (module) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3167
		ASSERT(map->dir_newmodule == NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3168
		map->dir_newmodule = i_ddi_strdup(module, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3169
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3170
	if (mapname) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3171
		ASSERT(map->dir_newmap == NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3172
		map->dir_newmap = i_ddi_strdup(mapname, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3173
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3174
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3175
	map->dir_invalid = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3176
	rw_exit(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3177
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3178
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3179
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3180
sdev_replace_nsmap(struct devname_nsmap *map, char *module, char *mapname)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3181
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3182
	char *old_module = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3183
	char *old_map = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3184
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3185
	ASSERT(RW_LOCK_HELD(&map->dir_lock));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3186
	if (!rw_tryupgrade(&map->dir_lock)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3187
		rw_exit(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3188
		rw_enter(&map->dir_lock, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3189
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3190
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3191
	old_module = map->dir_module;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3192
	if (module) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3193
		if (old_module && strcmp(old_module, module) != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3194
			kmem_free(old_module, strlen(old_module) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3195
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3196
		map->dir_module = module;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3197
		map->dir_newmodule = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3198
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3199
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3200
	old_map = map->dir_map;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3201
	if (mapname) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3202
		if (old_map && strcmp(old_map, mapname) != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3203
			kmem_free(old_map, strlen(old_map) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3204
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3205
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3206
		map->dir_map = mapname;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3207
		map->dir_newmap = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3208
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3209
	map->dir_maploaded = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3210
	map->dir_invalid = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3211
	rw_downgrade(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3212
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3213
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3214
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3215
 * dir_name should have at least one attribute,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3216
 *	dir_module
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3217
 *	or dir_map
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3218
 *	or both
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3219
 * caller holds the devname_nsmaps_lock
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3220
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3221
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3222
sdev_insert_nsmap(char *dir_name, char *dir_module, char *dir_map)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3223
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3224
	struct devname_nsmap *map;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3225
	int len = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3226
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3227
	ASSERT(dir_name);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3228
	ASSERT(dir_module || dir_map);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3229
	ASSERT(MUTEX_HELD(&devname_nsmaps_lock));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3230
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3231
	if (map = sdev_get_nsmap_by_dir(dir_name, 1)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3232
		sdev_update_newnsmap(map, dir_module, dir_map);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3233
		return;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3234
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3235
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3236
	map = (struct devname_nsmap *)kmem_zalloc(sizeof (*map), KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3237
	map->dir_name = i_ddi_strdup(dir_name, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3238
	if (dir_module) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3239
		map->dir_module = i_ddi_strdup(dir_module, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3240
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3241
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3242
	if (dir_map) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3243
		if (dir_map[0] != '/') {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3244
			len = strlen(ETC_DEV_DIR) + strlen(dir_map) + 2;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3245
			map->dir_map = kmem_zalloc(len, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3246
			(void) snprintf(map->dir_map, len, "%s/%s", ETC_DEV_DIR,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3247
			    dir_map);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3248
		} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3249
			map->dir_map = i_ddi_strdup(dir_map, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3250
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3251
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3252
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3253
	map->dir_ops = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3254
	map->dir_maploaded = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3255
	map->dir_invalid = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3256
	rw_init(&map->dir_lock, NULL, RW_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3257
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3258
	map->next = devname_nsmaps;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3259
	map->prev = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3260
	if (devname_nsmaps) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3261
		devname_nsmaps->prev = map;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3262
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3263
	devname_nsmaps = map;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3264
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3265
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3266
struct devname_nsmap *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3267
sdev_get_nsmap_by_dir(char *dir_path, int locked)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3268
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3269
	struct devname_nsmap *map = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3270
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3271
	if (!locked)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3272
		mutex_enter(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3273
	for (map = devname_nsmaps; map; map = map->next) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3274
		sdcmn_err6(("sdev_get_nsmap_by_dir: dir %s\n", map->dir_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3275
		if (strcmp(map->dir_name, dir_path) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3276
			if (!locked)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3277
				mutex_exit(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3278
			return (map);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3279
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3280
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3281
	if (!locked)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3282
		mutex_exit(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3283
	return (NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3284
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3285
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3286
struct devname_nsmap *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3287
sdev_get_nsmap_by_module(char *mod_name)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3288
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3289
	struct devname_nsmap *map = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3290
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3291
	mutex_enter(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3292
	for (map = devname_nsmaps; map; map = map->next) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3293
		sdcmn_err7(("sdev_get_nsmap_by_module: module %s\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3294
		    map->dir_module));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3295
		if (map->dir_module && strcmp(map->dir_module, mod_name) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3296
			mutex_exit(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3297
			return (map);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3298
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3299
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3300
	mutex_exit(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3301
	return (NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3302
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3303
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3304
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3305
sdev_invalidate_nsmaps()
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3306
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3307
	struct devname_nsmap *map = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3308
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3309
	ASSERT(MUTEX_HELD(&devname_nsmaps_lock));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3310
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3311
	if (devname_nsmaps == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3312
		return;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3313
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3314
	for (map = devname_nsmaps; map; map = map->next) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3315
		rw_enter(&map->dir_lock, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3316
		map->dir_invalid = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3317
		rw_exit(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3318
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3319
	devname_nsmaps_invalidated = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3320
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3321
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3322
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3323
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3324
sdev_nsmaps_loaded()
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3325
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3326
	int ret = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3327
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3328
	mutex_enter(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3329
	if (devname_nsmaps_loaded)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3330
		ret = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3331
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3332
	mutex_exit(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3333
	return (ret);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3334
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3335
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3336
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3337
sdev_nsmaps_reloaded()
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3338
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3339
	int ret = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3340
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3341
	mutex_enter(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3342
	if (devname_nsmaps_invalidated)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3343
		ret = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3344
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3345
	mutex_exit(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3346
	return (ret);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3347
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3348
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3349
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3350
sdev_free_nsmap(struct devname_nsmap *map)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3351
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3352
	ASSERT(map);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3353
	if (map->dir_name)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3354
		kmem_free(map->dir_name, strlen(map->dir_name) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3355
	if (map->dir_module)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3356
		kmem_free(map->dir_module, strlen(map->dir_module) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3357
	if (map->dir_map)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3358
		kmem_free(map->dir_map, strlen(map->dir_map) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3359
	rw_destroy(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3360
	kmem_free(map, sizeof (*map));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3361
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3362
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3363
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3364
sdev_validate_nsmaps()
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3365
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3366
	struct devname_nsmap *map = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3367
	struct devname_nsmap *oldmap = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3368
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3369
	ASSERT(MUTEX_HELD(&devname_nsmaps_lock));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3370
	map = devname_nsmaps;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3371
	while (map) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3372
		rw_enter(&map->dir_lock, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3373
		if ((map->dir_invalid == 1) && (map->dir_newmodule == NULL) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3374
		    (map->dir_newmap == NULL)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3375
			oldmap = map;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3376
			rw_exit(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3377
			if (map->prev)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3378
				map->prev->next = oldmap->next;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3379
			if (map == devname_nsmaps)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3380
				devname_nsmaps = oldmap->next;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3381
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3382
			map = oldmap->next;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3383
			if (map)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3384
				map->prev = oldmap->prev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3385
			sdev_free_nsmap(oldmap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3386
			oldmap = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3387
		} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3388
			rw_exit(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3389
			map = map->next;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3390
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3391
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3392
	devname_nsmaps_invalidated = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3393
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3394
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3395
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3396
sdev_map_is_invalid(struct devname_nsmap *map)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3397
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3398
	int ret = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3399
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3400
	ASSERT(map);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3401
	rw_enter(&map->dir_lock, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3402
	if (map->dir_invalid)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3403
		ret = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3404
	rw_exit(&map->dir_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3405
	return (ret);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3406
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3407
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3408
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3409
sdev_check_map(struct devname_nsmap *map)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3410
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3411
	struct devname_nsmap *mapp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3412
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3413
	mutex_enter(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3414
	if (devname_nsmaps == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3415
		mutex_exit(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3416
		return (1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3417
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3418
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3419
	for (mapp = devname_nsmaps; mapp; mapp = mapp->next) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3420
		if (mapp == map) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3421
			mutex_exit(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3422
			return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3423
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3424
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3425
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3426
	mutex_exit(&devname_nsmaps_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3427
	return (1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3428
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3429
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3430
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3431
struct devname_nsmap *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3432
sdev_get_map(struct sdev_node *dv, int validate)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3433
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3434
	struct devname_nsmap *map;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3435
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3436
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3437
	ASSERT(RW_READ_HELD(&dv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3438
	map = dv->sdev_mapinfo;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3439
	if (map && sdev_check_map(map)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3440
		if (!rw_tryupgrade(&dv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3441
			rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3442
			rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3443
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3444
		dv->sdev_mapinfo = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3445
		rw_downgrade(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3446
		return (NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3447
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3448
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3449
	if (validate && (!map || (map && sdev_map_is_invalid(map)))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3450
		if (!rw_tryupgrade(&dv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3451
			rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3452
			rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3453
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3454
		error = sdev_get_moduleops(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3455
		if (!error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3456
			map = dv->sdev_mapinfo;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3457
		rw_downgrade(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3458
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3459
	return (map);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3460
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3461
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3462
extern int sdev_vnodeops_tbl_size;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3463
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3464
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3465
 * construct a new template with overrides from vtab
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3466
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3467
static fs_operation_def_t *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3468
sdev_merge_vtab(const fs_operation_def_t tab[])
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3469
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3470
	fs_operation_def_t *new;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3471
	const fs_operation_def_t *tab_entry;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3472
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3473
	/* make a copy of standard vnode ops table */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3474
	new = kmem_alloc(sdev_vnodeops_tbl_size, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3475
	bcopy((void *)sdev_vnodeops_tbl, new, sdev_vnodeops_tbl_size);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3476
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3477
	/* replace the overrides from tab */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3478
	for (tab_entry = tab; tab_entry->name != NULL; tab_entry++) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3479
		fs_operation_def_t *std_entry = new;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3480
		while (std_entry->name) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3481
			if (strcmp(tab_entry->name, std_entry->name) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3482
				std_entry->func = tab_entry->func;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3483
				break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3484
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3485
			std_entry++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3486
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3487
		if (std_entry->name == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3488
			cmn_err(CE_NOTE, "sdev_merge_vtab: entry %s unused.",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3489
			    tab_entry->name);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3490
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3491
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3492
	return (new);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3493
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3494
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3495
/* free memory allocated by sdev_merge_vtab */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3496
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3497
sdev_free_vtab(fs_operation_def_t *new)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3498
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3499
	kmem_free(new, sdev_vnodeops_tbl_size);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3500
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3501
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3502
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3503
devname_get_vnode(devname_handle_t *hdl, vnode_t **vpp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3504
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3505
	struct sdev_node *dv = hdl->dh_data;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3506
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3507
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3508
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3509
	rw_enter(&dv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3510
	*vpp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3511
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3512
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3513
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3514
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3515
devname_get_path(devname_handle_t *hdl, char **path)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3516
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3517
	struct sdev_node *dv = hdl->dh_data;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3518
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3519
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3520
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3521
	rw_enter(&dv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3522
	*path = dv->sdev_path;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3523
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3524
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3525
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3526
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3527
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3528
devname_get_name(devname_handle_t *hdl, char **entry)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3529
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3530
	struct sdev_node *dv = hdl->dh_data;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3531
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3532
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3533
	rw_enter(&dv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3534
	*entry = dv->sdev_name;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3535
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3536
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3537
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3538
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3539
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3540
devname_get_dir_vnode(devname_handle_t *hdl, vnode_t **vpp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3541
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3542
	struct sdev_node *dv = hdl->dh_data->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3543
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3544
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3545
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3546
	rw_enter(&dv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3547
	*vpp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3548
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3549
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3550
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3551
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3552
devname_get_dir_path(devname_handle_t *hdl, char **path)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3553
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3554
	struct sdev_node *dv = hdl->dh_data->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3555
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3556
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3557
	rw_enter(&dv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3558
	*path = dv->sdev_path;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3559
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3560
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3561
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3562
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3563
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3564
devname_get_dir_name(devname_handle_t *hdl, char **entry)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3565
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3566
	struct sdev_node *dv = hdl->dh_data->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3567
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3568
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3569
	rw_enter(&dv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3570
	*entry = dv->sdev_name;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3571
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3572
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3573
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3574
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3575
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3576
devname_get_dir_nsmap(devname_handle_t *hdl, struct devname_nsmap **map)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3577
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3578
	struct sdev_node *dv = hdl->dh_data->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3579
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3580
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3581
	rw_enter(&dv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3582
	*map = dv->sdev_mapinfo;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3583
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3584
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3585
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3586
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3587
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3588
devname_get_dir_handle(devname_handle_t *hdl, devname_handle_t **dir_hdl)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3589
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3590
	struct sdev_node *dv = hdl->dh_data->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3591
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3592
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3593
	rw_enter(&dv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3594
	*dir_hdl = &(dv->sdev_handle);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3595
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3596
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3597
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3598
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3599
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3600
devname_set_nodetype(devname_handle_t *hdl, void *args, int spec)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3601
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3602
	struct sdev_node *dv = hdl->dh_data;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3603
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3604
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3605
	rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3606
	hdl->dh_spec = (devname_spec_t)spec;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3607
	hdl->dh_args = (void *)i_ddi_strdup((char *)args, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3608
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3609
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3610
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3611
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3612
 * a generic setattr() function
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3613
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3614
 * note: flags only supports AT_UID and AT_GID.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3615
 *	 Future enhancements can be done for other types, e.g. AT_MODE
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3616
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3617
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3618
devname_setattr_func(struct vnode *vp, struct vattr *vap, int flags,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3619
    struct cred *cred, int (*callback)(struct sdev_node *, struct vattr *,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3620
    int), int protocol)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3621
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3622
	struct sdev_node	*dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3623
	struct sdev_node	*parent = dv->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3624
	struct vattr		*get;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3625
	uint_t			mask = vap->va_mask;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3626
	int 			error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3627
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3628
	/* some sanity checks */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3629
	if (vap->va_mask & AT_NOSET)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3630
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3631
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3632
	if (vap->va_mask & AT_SIZE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3633
		if (vp->v_type == VDIR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3634
			return (EISDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3635
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3636
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3637
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3638
	/* no need to set attribute, but do not fail either */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3639
	ASSERT(parent);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3640
	rw_enter(&parent->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3641
	if (dv->sdev_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3642
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3643
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3644
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3645
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3646
	/* If backing store exists, just set it. */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3647
	if (dv->sdev_attrvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3648
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3649
		return (VOP_SETATTR(dv->sdev_attrvp, vap, flags, cred, NULL));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3650
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3651
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3652
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3653
	 * Otherwise, for nodes with the persistence attribute, create it.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3654
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3655
	ASSERT(dv->sdev_attr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3656
	if (SDEV_IS_PERSIST(dv) ||
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3657
	    ((vap->va_mask & ~AT_TIMES) != 0 && !SDEV_IS_DYNAMIC(dv))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3658
		sdev_vattr_merge(dv, vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3659
		rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3660
		error = sdev_shadow_node(dv, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3661
		rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3662
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3663
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3664
		if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3665
			return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3666
		return (VOP_SETATTR(dv->sdev_attrvp, vap, flags, cred, NULL));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3667
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3668
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3669
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3670
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3671
	 * sdev_attr was allocated in sdev_mknode
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3672
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3673
	rw_enter(&dv->sdev_contents, RW_WRITER);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  3674
	error = secpolicy_vnode_setattr(cred, vp, vap,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  3675
	    dv->sdev_attr, flags, sdev_unlocked_access, dv);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3676
	if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3677
		rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3678
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3679
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3680
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3681
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3682
	get = dv->sdev_attr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3683
	if (mask & AT_MODE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3684
		get->va_mode &= S_IFMT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3685
		get->va_mode |= vap->va_mode & ~S_IFMT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3686
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3687
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3688
	if ((mask & AT_UID) || (mask & AT_GID)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3689
		if (mask & AT_UID)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3690
			get->va_uid = vap->va_uid;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3691
		if (mask & AT_GID)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3692
			get->va_gid = vap->va_gid;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3693
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3694
		 * a callback must be provided if the protocol is set
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3695
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3696
		if ((protocol & AT_UID) || (protocol & AT_GID)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3697
			ASSERT(callback);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3698
			error = callback(dv, get, protocol);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3699
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3700
				rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3701
				rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3702
				return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3703
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3704
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3705
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3706
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3707
	if (mask & AT_ATIME)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3708
		get->va_atime = vap->va_atime;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3709
	if (mask & AT_MTIME)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3710
		get->va_mtime = vap->va_mtime;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3711
	if (mask & (AT_MODE | AT_UID | AT_GID | AT_CTIME)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3712
		gethrestime(&get->va_ctime);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3713
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3714
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3715
	sdev_vattr_merge(dv, get);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3716
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3717
	rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3718
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3719
}
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3720
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3721
/*
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3722
 * a generic inactive() function
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3723
 */
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3724
void
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3725
devname_inactive_func(struct vnode *vp, struct cred *cred,
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3726
    void (*callback)(struct vnode *))
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3727
{
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3728
	int clean;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3729
	struct sdev_node *dv = VTOSDEV(vp);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3730
	struct sdev_node *ddv = dv->sdev_dotdot;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3731
	struct sdev_node *idv;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3732
	struct sdev_node *prev = NULL;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3733
	int state;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3734
	struct devname_nsmap *map = NULL;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3735
	struct devname_ops *dirops = NULL;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3736
	void (*fn)(devname_handle_t *, struct cred *) = NULL;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3737
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3738
	rw_enter(&ddv->sdev_contents, RW_WRITER);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3739
	state = dv->sdev_state;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3740
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3741
	mutex_enter(&vp->v_lock);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3742
	ASSERT(vp->v_count >= 1);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3743
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3744
	if (vp->v_count == 1 && callback != NULL)
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3745
		callback(vp);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3746
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3747
	clean = (vp->v_count == 1) && (state == SDEV_ZOMBIE);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3748
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3749
	/*
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3750
	 * last ref count on the ZOMBIE node is released.
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3751
	 * clean up the sdev_node, and
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3752
	 * release the hold on the backing store node so that
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3753
	 * the ZOMBIE backing stores also cleaned out.
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3754
	 */
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3755
	if (clean) {
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3756
		ASSERT(ddv);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3757
		if (SDEV_IS_GLOBAL(dv)) {
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3758
			map = ddv->sdev_mapinfo;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3759
			dirops = map ? map->dir_ops : NULL;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3760
			if (dirops && (fn = dirops->devnops_inactive))
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3761
				(*fn)(&(dv->sdev_handle), cred);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3762
		}
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3763
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3764
		ddv->sdev_nlink--;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3765
		if (vp->v_type == VDIR) {
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3766
			dv->sdev_nlink--;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3767
		}
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3768
		for (idv = ddv->sdev_dot; idv && idv != dv;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3769
		    prev = idv, idv = idv->sdev_next)
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3770
			;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3771
		ASSERT(idv == dv);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3772
		if (prev == NULL)
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3773
			ddv->sdev_dot = dv->sdev_next;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3774
		else
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3775
			prev->sdev_next = dv->sdev_next;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3776
		dv->sdev_next = NULL;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3777
		dv->sdev_nlink--;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3778
		--vp->v_count;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3779
		mutex_exit(&vp->v_lock);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3780
		sdev_nodedestroy(dv, 0);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3781
	} else {
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3782
		--vp->v_count;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3783
		mutex_exit(&vp->v_lock);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3784
	}
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3785
	rw_exit(&ddv->sdev_contents);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3786
}