usr/src/uts/common/fs/dev/sdev_subr.c
author Jerry Jelinek <jerry.jelinek@joyent.com>
Mon, 11 Jun 2012 18:23:37 +0000
changeset 14222 c3f8a4690b1f
parent 12923 3c964548d01f
child 14223 1652c59077c6
permissions -rw-r--r--
3977 zones can commit suicide by zvol Reviewed by: Gordon Ross <[email protected]> Reviewed by: Richard Lowe <[email protected]> Approved by: Garrett D'Amore <[email protected]>
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
/*
12633
9f2cda0ed938 PSARC 2010/144 lofi(7D) in non global zones
John Levon <john.levon@sun.com>
parents: 11279
diff changeset
    22
 * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
14222
c3f8a4690b1f 3977 zones can commit suicide by zvol
Jerry Jelinek <jerry.jelinek@joyent.com>
parents: 12923
diff changeset
    23
 * Copyright (c) 2012, Joyent, Inc. All rights reserved.
2621
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
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    27
 * utility routines for the /dev fs
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    30
#include <sys/types.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    31
#include <sys/param.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    32
#include <sys/t_lock.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    33
#include <sys/systm.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    34
#include <sys/sysmacros.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    35
#include <sys/user.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    36
#include <sys/time.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    37
#include <sys/vfs.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    38
#include <sys/vnode.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    39
#include <sys/file.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    40
#include <sys/fcntl.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    41
#include <sys/flock.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    42
#include <sys/kmem.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    43
#include <sys/uio.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    44
#include <sys/errno.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    45
#include <sys/stat.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    46
#include <sys/cred.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    47
#include <sys/dirent.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    48
#include <sys/pathname.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    49
#include <sys/cmn_err.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    50
#include <sys/debug.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    51
#include <sys/mode.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    52
#include <sys/policy.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    53
#include <fs/fs_subr.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    54
#include <sys/mount.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    55
#include <sys/fs/snode.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    56
#include <sys/fs/dv_node.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    57
#include <sys/fs/sdev_impl.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    58
#include <sys/sunndi.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    59
#include <sys/sunmdi.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    60
#include <sys/conf.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    61
#include <sys/proc.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    62
#include <sys/user.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    63
#include <sys/modctl.h>
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    64
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    65
#ifdef DEBUG
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    66
int sdev_debug = 0x00000001;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    67
int sdev_debug_cache_flags = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    68
#endif
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    69
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    70
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    71
 * globals
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
/* prototype memory vattrs */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    74
vattr_t sdev_vattr_dir = {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    75
	AT_TYPE|AT_MODE|AT_UID|AT_GID,		/* va_mask */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    76
	VDIR,					/* va_type */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    77
	SDEV_DIRMODE_DEFAULT,			/* va_mode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    78
	SDEV_UID_DEFAULT,			/* va_uid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    79
	SDEV_GID_DEFAULT,			/* va_gid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    80
	0,					/* va_fsid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    81
	0,					/* va_nodeid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    82
	0,					/* va_nlink */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    83
	0,					/* va_size */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    84
	0,					/* va_atime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    85
	0,					/* va_mtime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    86
	0,					/* va_ctime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    87
	0,					/* va_rdev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    88
	0,					/* va_blksize */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    89
	0,					/* va_nblocks */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    90
	0					/* va_vcode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    91
};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    92
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    93
vattr_t sdev_vattr_lnk = {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    94
	AT_TYPE|AT_MODE,			/* va_mask */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    95
	VLNK,					/* va_type */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    96
	SDEV_LNKMODE_DEFAULT,			/* va_mode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    97
	SDEV_UID_DEFAULT,			/* va_uid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    98
	SDEV_GID_DEFAULT,			/* va_gid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
    99
	0,					/* va_fsid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   100
	0,					/* va_nodeid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   101
	0,					/* va_nlink */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   102
	0,					/* va_size */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   103
	0,					/* va_atime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   104
	0,					/* va_mtime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   105
	0,					/* va_ctime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   106
	0,					/* va_rdev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   107
	0,					/* va_blksize */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   108
	0,					/* va_nblocks */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   109
	0					/* va_vcode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   110
};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   111
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   112
vattr_t sdev_vattr_blk = {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   113
	AT_TYPE|AT_MODE|AT_UID|AT_GID,		/* va_mask */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   114
	VBLK,					/* va_type */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   115
	S_IFBLK | SDEV_DEVMODE_DEFAULT,		/* va_mode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   116
	SDEV_UID_DEFAULT,			/* va_uid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   117
	SDEV_GID_DEFAULT,			/* va_gid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   118
	0,					/* va_fsid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   119
	0,					/* va_nodeid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   120
	0,					/* va_nlink */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   121
	0,					/* va_size */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   122
	0,					/* va_atime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   123
	0,					/* va_mtime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   124
	0,					/* va_ctime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   125
	0,					/* va_rdev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   126
	0,					/* va_blksize */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   127
	0,					/* va_nblocks */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   128
	0					/* va_vcode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   129
};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   130
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   131
vattr_t sdev_vattr_chr = {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   132
	AT_TYPE|AT_MODE|AT_UID|AT_GID,		/* va_mask */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   133
	VCHR,					/* va_type */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   134
	S_IFCHR | SDEV_DEVMODE_DEFAULT,		/* va_mode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   135
	SDEV_UID_DEFAULT,			/* va_uid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   136
	SDEV_GID_DEFAULT,			/* va_gid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   137
	0,					/* va_fsid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   138
	0,					/* va_nodeid */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   139
	0,					/* va_nlink */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   140
	0,					/* va_size */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   141
	0,					/* va_atime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   142
	0,					/* va_mtime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   143
	0,					/* va_ctime */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   144
	0,					/* va_rdev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   145
	0,					/* va_blksize */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   146
	0,					/* va_nblocks */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   147
	0					/* va_vcode */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   148
};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   149
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   150
kmem_cache_t	*sdev_node_cache;	/* sdev_node cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   151
int		devtype;		/* fstype */
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
/* static */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   154
static struct vnodeops *sdev_get_vop(struct sdev_node *);
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   155
static void sdev_set_no_negcache(struct sdev_node *);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   156
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
   157
static void sdev_free_vtab(fs_operation_def_t *);
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 void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   160
sdev_prof_free(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   161
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   162
	ASSERT(!SDEV_IS_GLOBAL(dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   163
	if (dv->sdev_prof.dev_name)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   164
		nvlist_free(dv->sdev_prof.dev_name);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   165
	if (dv->sdev_prof.dev_map)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   166
		nvlist_free(dv->sdev_prof.dev_map);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   167
	if (dv->sdev_prof.dev_symlink)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   168
		nvlist_free(dv->sdev_prof.dev_symlink);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   169
	if (dv->sdev_prof.dev_glob_incdir)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   170
		nvlist_free(dv->sdev_prof.dev_glob_incdir);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   171
	if (dv->sdev_prof.dev_glob_excdir)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   172
		nvlist_free(dv->sdev_prof.dev_glob_excdir);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   173
	bzero(&dv->sdev_prof, sizeof (dv->sdev_prof));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   174
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   175
6712
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 6347
diff changeset
   176
/* sdev_node cache constructor */
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   177
/*ARGSUSED1*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   178
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   179
i_sdev_node_ctor(void *buf, void *cfarg, int flag)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   180
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   181
	struct sdev_node *dv = (struct sdev_node *)buf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   182
	struct vnode *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   183
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   184
	bzero(buf, sizeof (struct sdev_node));
6712
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 6347
diff changeset
   185
	vp = dv->sdev_vnode = vn_alloc(flag);
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 6347
diff changeset
   186
	if (vp == NULL) {
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 6347
diff changeset
   187
		return (-1);
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 6347
diff changeset
   188
	}
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 6347
diff changeset
   189
	vp->v_data = dv;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   190
	rw_init(&dv->sdev_contents, NULL, RW_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   191
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   192
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   193
6712
79afecec3f3c 6554564 slab allocator cannot release slabs with lonely buffers
tomee
parents: 6347
diff changeset
   194
/* sdev_node cache destructor */
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   195
/*ARGSUSED1*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   196
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   197
i_sdev_node_dtor(void *buf, void *arg)
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
	struct sdev_node *dv = (struct sdev_node *)buf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   200
	struct vnode *vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   201
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   202
	rw_destroy(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   203
	vn_free(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   204
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   205
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   206
/* initialize sdev_node cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   207
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   208
sdev_node_cache_init()
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   209
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   210
	int flags = 0;
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
#ifdef	DEBUG
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   213
	flags = sdev_debug_cache_flags;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   214
	if (flags)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   215
		sdcmn_err(("cache debug flags 0x%x\n", flags));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   216
#endif	/* DEBUG */
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
	ASSERT(sdev_node_cache == NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   219
	sdev_node_cache = kmem_cache_create("sdev_node_cache",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   220
	    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
   221
	    NULL, NULL, NULL, flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   222
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   223
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   224
/* destroy sdev_node cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   225
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   226
sdev_node_cache_fini()
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   227
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   228
	ASSERT(sdev_node_cache != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   229
	kmem_cache_destroy(sdev_node_cache);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   230
	sdev_node_cache = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   231
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   232
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   233
/*
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   234
 * Compare two nodes lexographically to balance avl tree
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   235
 */
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   236
static int
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   237
sdev_compare_nodes(const struct sdev_node *dv1, const struct sdev_node *dv2)
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   238
{
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   239
	int rv;
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   240
	if ((rv = strcmp(dv1->sdev_name, dv2->sdev_name)) == 0)
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   241
		return (0);
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   242
	return ((rv < 0) ? -1 : 1);
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   243
}
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   244
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   245
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   246
sdev_set_nodestate(struct sdev_node *dv, sdev_node_state_t state)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   247
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   248
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   249
	ASSERT(RW_WRITE_HELD(&dv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   250
	dv->sdev_state = state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   251
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   252
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   253
static void
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   254
sdev_attr_update(struct sdev_node *dv, vattr_t *vap)
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   255
{
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   256
	timestruc_t	now;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   257
	struct vattr	*attrp;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   258
	uint_t		mask;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   259
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   260
	ASSERT(dv->sdev_attr);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   261
	ASSERT(vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   262
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   263
	attrp = dv->sdev_attr;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   264
	mask = vap->va_mask;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   265
	if (mask & AT_TYPE)
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   266
		attrp->va_type = vap->va_type;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   267
	if (mask & AT_MODE)
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   268
		attrp->va_mode = vap->va_mode;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   269
	if (mask & AT_UID)
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   270
		attrp->va_uid = vap->va_uid;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   271
	if (mask & AT_GID)
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   272
		attrp->va_gid = vap->va_gid;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   273
	if (mask & AT_RDEV)
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   274
		attrp->va_rdev = vap->va_rdev;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   275
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   276
	gethrestime(&now);
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   277
	attrp->va_atime = (mask & AT_ATIME) ? vap->va_atime : now;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   278
	attrp->va_mtime = (mask & AT_MTIME) ? vap->va_mtime : now;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   279
	attrp->va_ctime = (mask & AT_CTIME) ? vap->va_ctime : now;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   280
}
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   281
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   282
static void
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   283
sdev_attr_alloc(struct sdev_node *dv, vattr_t *vap)
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   284
{
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   285
	ASSERT(dv->sdev_attr == NULL);
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   286
	ASSERT(vap->va_mask & AT_TYPE);
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   287
	ASSERT(vap->va_mask & AT_MODE);
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   288
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   289
	dv->sdev_attr = kmem_zalloc(sizeof (struct vattr), KM_SLEEP);
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   290
	sdev_attr_update(dv, vap);
2621
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   293
/* alloc and initialize a sdev_node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   294
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   295
sdev_nodeinit(struct sdev_node *ddv, char *nm, struct sdev_node **newdv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   296
    vattr_t *vap)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   297
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   298
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   299
	struct vnode *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   300
	size_t nmlen, len;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   301
	devname_handle_t  *dhl;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   302
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   303
	nmlen = strlen(nm) + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   304
	if (nmlen > MAXNAMELEN) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   305
		sdcmn_err9(("sdev_nodeinit: node name %s"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   306
		    " too long\n", nm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   307
		*newdv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   308
		return (ENAMETOOLONG);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   309
	}
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
	dv = kmem_cache_alloc(sdev_node_cache, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   312
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   313
	dv->sdev_name = kmem_alloc(nmlen, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   314
	bcopy(nm, dv->sdev_name, nmlen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   315
	dv->sdev_namelen = nmlen - 1;	/* '\0' not included */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   316
	len = strlen(ddv->sdev_path) + strlen(nm) + 2;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   317
	dv->sdev_path = kmem_alloc(len, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   318
	(void) snprintf(dv->sdev_path, len, "%s/%s", ddv->sdev_path, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   319
	/* overwritten for VLNK nodes */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   320
	dv->sdev_symlink = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   321
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   322
	vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   323
	vn_reinit(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   324
	vp->v_vfsp = SDEVTOV(ddv)->v_vfsp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   325
	if (vap)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   326
		vp->v_type = vap->va_type;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   327
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   328
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   329
	 * initialized to the parent's vnodeops.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   330
	 * maybe overwriten for a VDIR
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   331
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   332
	vn_setops(vp, vn_getops(SDEVTOV(ddv)));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   333
	vn_exists(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   334
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   335
	dv->sdev_dotdot = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   336
	dv->sdev_attrvp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   337
	if (vap) {
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   338
		sdev_attr_alloc(dv, vap);
2621
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_attr = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   341
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   342
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   343
	dv->sdev_ino = sdev_mkino(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   344
	dv->sdev_nlink = 0;		/* updated on insert */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   345
	dv->sdev_flags = ddv->sdev_flags; /* inherit from the parent first */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   346
	dv->sdev_flags |= SDEV_BUILD;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   347
	mutex_init(&dv->sdev_lookup_lock, NULL, MUTEX_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   348
	cv_init(&dv->sdev_lookup_cv, NULL, CV_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   349
	if (SDEV_IS_GLOBAL(ddv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   350
		dv->sdev_flags |= SDEV_GLOBAL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   351
		dhl = &(dv->sdev_handle);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   352
		dhl->dh_data = dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   353
		dhl->dh_args = NULL;
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   354
		sdev_set_no_negcache(dv);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   355
		dv->sdev_gdir_gen = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   356
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   357
		dv->sdev_flags &= ~SDEV_GLOBAL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   358
		dv->sdev_origin = NULL; /* set later */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   359
		bzero(&dv->sdev_prof, sizeof (dv->sdev_prof));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   360
		dv->sdev_ldir_gen = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   361
		dv->sdev_devtree_gen = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   362
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   363
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   364
	rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   365
	sdev_set_nodestate(dv, SDEV_INIT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   366
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   367
	*newdv = dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   368
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   369
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   370
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   371
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   372
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   373
 * transition a sdev_node into SDEV_READY state
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   374
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   375
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   376
sdev_nodeready(struct sdev_node *dv, struct vattr *vap, struct vnode *avp,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   377
    void *args, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   378
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   379
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   380
	struct vnode *vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   381
	vtype_t type;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   382
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   383
	ASSERT(dv && (dv->sdev_state != SDEV_READY) && vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   384
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   385
	type = vap->va_type;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   386
	vp->v_type = type;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   387
	vp->v_rdev = vap->va_rdev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   388
	rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   389
	if (type == VDIR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   390
		dv->sdev_nlink = 2;
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
		dv->sdev_flags &= ~SDEV_DYNAMIC;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   393
		vn_setops(vp, sdev_get_vop(dv)); /* from internal vtab */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   394
		ASSERT(dv->sdev_dotdot);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   395
		ASSERT(SDEVTOV(dv->sdev_dotdot)->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   396
		vp->v_rdev = SDEVTOV(dv->sdev_dotdot)->v_rdev;
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   397
		avl_create(&dv->sdev_entries,
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   398
		    (int (*)(const void *, const void *))sdev_compare_nodes,
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   399
		    sizeof (struct sdev_node),
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   400
		    offsetof(struct sdev_node, sdev_avllink));
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   401
	} else if (type == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   402
		ASSERT(args);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   403
		dv->sdev_nlink = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   404
		dv->sdev_symlink = i_ddi_strdup((char *)args, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   405
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   406
		dv->sdev_nlink = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   407
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   408
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   409
	if (!(SDEV_IS_GLOBAL(dv))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   410
		dv->sdev_origin = (struct sdev_node *)args;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   411
		dv->sdev_flags &= ~SDEV_PERSIST;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   414
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   415
	 * shadow node is created here OR
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   416
	 * if failed (indicated by dv->sdev_attrvp == NULL),
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   417
	 * created later in sdev_setattr
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
	if (avp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   420
		dv->sdev_attrvp = avp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   421
	} else {
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   422
		if (dv->sdev_attr == NULL) {
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   423
			sdev_attr_alloc(dv, vap);
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   424
		} else {
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   425
			sdev_attr_update(dv, vap);
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
   426
		}
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   427
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   428
		if ((dv->sdev_attrvp == NULL) && SDEV_IS_PERSIST(dv))
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   429
			error = sdev_shadow_node(dv, cred);
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
6335
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
   432
	if (error == 0) {
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
   433
		/* transition to READY state */
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
   434
		sdev_set_nodestate(dv, SDEV_READY);
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
   435
		sdev_nc_node_exists(dv);
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
   436
	} else {
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
   437
		sdev_set_nodestate(dv, SDEV_ZOMBIE);
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
   438
	}
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   439
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   440
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   441
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   442
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
 * setting ZOMBIE state
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   445
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   446
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   447
sdev_nodezombied(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   448
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   449
	rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   450
	sdev_set_nodestate(dv, SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   451
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   452
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   453
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   454
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
 * Build the VROOT sdev_node.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   457
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   458
/*ARGSUSED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   459
struct sdev_node *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   460
sdev_mkroot(struct vfs *vfsp, dev_t devdev, struct vnode *mvp,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   461
    struct vnode *avp, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   462
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   463
	struct sdev_node *dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   464
	struct vnode *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   465
	char devdir[] = "/dev";
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   466
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   467
	ASSERT(sdev_node_cache != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   468
	ASSERT(avp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   469
	dv = kmem_cache_alloc(sdev_node_cache, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   470
	vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   471
	vn_reinit(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   472
	vp->v_flag |= VROOT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   473
	vp->v_vfsp = vfsp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   474
	vp->v_type = VDIR;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   475
	vp->v_rdev = devdev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   476
	vn_setops(vp, sdev_vnodeops); /* apply the default vnodeops at /dev */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   477
	vn_exists(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   478
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   479
	if (vfsp->vfs_mntpt)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   480
		dv->sdev_name = i_ddi_strdup(
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   481
		    (char *)refstr_value(vfsp->vfs_mntpt), KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   482
	else
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   483
		/* vfs_mountdev1 set mount point later */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   484
		dv->sdev_name = i_ddi_strdup("/dev", KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   485
	dv->sdev_namelen = strlen(dv->sdev_name); /* '\0' not included */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   486
	dv->sdev_path = i_ddi_strdup(devdir, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   487
	dv->sdev_ino = SDEV_ROOTINO;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   488
	dv->sdev_nlink = 2;		/* name + . (no sdev_insert) */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   489
	dv->sdev_dotdot = dv;		/* .. == self */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   490
	dv->sdev_attrvp = avp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   491
	dv->sdev_attr = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   492
	mutex_init(&dv->sdev_lookup_lock, NULL, MUTEX_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   493
	cv_init(&dv->sdev_lookup_cv, NULL, CV_DEFAULT, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   494
	if (strcmp(dv->sdev_name, "/dev") == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   495
		dv->sdev_flags = SDEV_BUILD|SDEV_GLOBAL|SDEV_PERSIST;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   496
		bzero(&dv->sdev_handle, sizeof (dv->sdev_handle));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   497
		dv->sdev_gdir_gen = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   498
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   499
		dv->sdev_flags = SDEV_BUILD;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   500
		dv->sdev_flags &= ~SDEV_PERSIST;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   501
		bzero(&dv->sdev_prof, sizeof (dv->sdev_prof));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   502
		dv->sdev_ldir_gen = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   503
		dv->sdev_devtree_gen = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   504
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   505
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   506
	avl_create(&dv->sdev_entries,
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   507
	    (int (*)(const void *, const void *))sdev_compare_nodes,
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   508
	    sizeof (struct sdev_node),
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   509
	    offsetof(struct sdev_node, sdev_avllink));
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   510
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   511
	rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   512
	sdev_set_nodestate(dv, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   513
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   514
	sdev_nc_node_exists(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   515
	return (dv);
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
/* directory dependent vop table */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   519
struct sdev_vop_table {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   520
	char *vt_name;				/* subdirectory name */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   521
	const fs_operation_def_t *vt_service;	/* vnodeops table */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   522
	struct vnodeops *vt_vops;		/* constructed vop */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   523
	struct vnodeops **vt_global_vops;	/* global container for vop */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   524
	int (*vt_vtor)(struct sdev_node *);	/* validate sdev_node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   525
	int vt_flags;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   528
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   529
 * A nice improvement would be to provide a plug-in mechanism
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   530
 * for this table instead of a const table.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   531
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   532
static struct sdev_vop_table vtab[] =
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   533
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   534
	{ "pts", devpts_vnodeops_tbl, NULL, &devpts_vnodeops, devpts_validate,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   535
	SDEV_DYNAMIC | SDEV_VTOR },
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   536
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
   537
	{ "vt", devvt_vnodeops_tbl, NULL, &devvt_vnodeops, devvt_validate,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
   538
	SDEV_DYNAMIC | SDEV_VTOR },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
   539
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   540
	{ "zvol", devzvol_vnodeops_tbl, NULL, &devzvol_vnodeops,
14222
c3f8a4690b1f 3977 zones can commit suicide by zvol
Jerry Jelinek <jerry.jelinek@joyent.com>
parents: 12923
diff changeset
   541
	devzvol_validate, SDEV_ZONED | SDEV_DYNAMIC | SDEV_VTOR | SDEV_SUBDIR },
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   542
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   543
	{ "zcons", NULL, NULL, NULL, NULL, SDEV_NO_NCACHE },
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   544
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
   545
	{ "net", devnet_vnodeops_tbl, NULL, &devnet_vnodeops, devnet_validate,
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
   546
	SDEV_DYNAMIC | SDEV_VTOR },
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
   547
8023
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
   548
	{ "ipnet", devipnet_vnodeops_tbl, NULL, &devipnet_vnodeops,
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
   549
	devipnet_validate, SDEV_DYNAMIC | SDEV_VTOR | SDEV_NO_NCACHE },
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
   550
12923
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   551
	/*
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   552
	 * SDEV_DYNAMIC: prevent calling out to devfsadm, since only the
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   553
	 * lofi driver controls child nodes.
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   554
	 *
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   555
	 * SDEV_PERSIST: ensure devfsadm knows to clean up any persisted
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   556
	 * stale nodes (e.g. from devfsadm -R).
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   557
	 *
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   558
	 * In addition, devfsadm knows not to attempt a rmdir: a zone
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   559
	 * may hold a reference, which would zombify the node,
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   560
	 * preventing a mkdir.
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   561
	 */
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   562
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   563
	{ "lofi", NULL, NULL, NULL, NULL,
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   564
	    SDEV_ZONED | SDEV_DYNAMIC | SDEV_PERSIST },
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   565
	{ "rlofi", NULL, NULL, NULL, NULL,
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
   566
	    SDEV_ZONED | SDEV_DYNAMIC | SDEV_PERSIST },
12633
9f2cda0ed938 PSARC 2010/144 lofi(7D) in non global zones
John Levon <john.levon@sun.com>
parents: 11279
diff changeset
   567
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   568
	{ NULL, NULL, NULL, NULL, NULL, 0}
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
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   571
struct sdev_vop_table *
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   572
sdev_match(struct sdev_node *dv)
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   573
{
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   574
	int vlen;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   575
	int i;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   576
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   577
	for (i = 0; vtab[i].vt_name; i++) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   578
		if (strcmp(vtab[i].vt_name, dv->sdev_name) == 0)
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   579
			return (&vtab[i]);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   580
		if (vtab[i].vt_flags & SDEV_SUBDIR) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   581
			char *ptr;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   582
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   583
			ASSERT(strlen(dv->sdev_path) > 5);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   584
			ptr = dv->sdev_path + 5;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   585
			vlen = strlen(vtab[i].vt_name);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   586
			if ((strncmp(vtab[i].vt_name, ptr,
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   587
			    vlen - 1) == 0) && ptr[vlen] == '/')
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   588
				return (&vtab[i]);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   589
		}
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   590
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   591
	}
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   592
	return (NULL);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   593
}
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   594
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   595
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   596
 *  sets a directory's vnodeops if the directory is in the vtab;
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
static struct vnodeops *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   599
sdev_get_vop(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   600
{
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   601
	struct sdev_vop_table *vtp;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   602
	char *path;
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
	path = dv->sdev_path;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   605
	ASSERT(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
	/* gets the relative path to /dev/ */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   608
	path += 5;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   609
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   610
	/* gets the vtab entry it matches */
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   611
	if ((vtp = sdev_match(dv)) != NULL) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   612
		dv->sdev_flags |= vtp->vt_flags;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   613
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   614
		if (vtp->vt_vops) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   615
			if (vtp->vt_global_vops)
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   616
				*(vtp->vt_global_vops) = vtp->vt_vops;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   617
			return (vtp->vt_vops);
2621
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
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   620
		if (vtp->vt_service) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   621
			fs_operation_def_t *templ;
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   622
			templ = sdev_merge_vtab(vtp->vt_service);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   623
			if (vn_make_ops(vtp->vt_name,
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   624
			    (const fs_operation_def_t *)templ,
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   625
			    &vtp->vt_vops) != 0) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   626
				cmn_err(CE_PANIC, "%s: malformed vnode ops\n",
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   627
				    vtp->vt_name);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   628
				/*NOTREACHED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   629
			}
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   630
			if (vtp->vt_global_vops) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   631
				*(vtp->vt_global_vops) = vtp->vt_vops;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   632
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   633
			sdev_free_vtab(templ);
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   634
			return (vtp->vt_vops);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   635
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   636
		return (sdev_vnodeops);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   639
	/* child inherits the persistence of the parent */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   640
	if (SDEV_IS_PERSIST(dv->sdev_dotdot))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   641
		dv->sdev_flags |= SDEV_PERSIST;
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
	return (sdev_vnodeops);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   644
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   645
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   646
static void
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   647
sdev_set_no_negcache(struct sdev_node *dv)
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   648
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   649
	int i;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   650
	char *path;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   651
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   652
	ASSERT(dv->sdev_path);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   653
	path = dv->sdev_path + strlen("/dev/");
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   654
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   655
	for (i = 0; vtab[i].vt_name; i++) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   656
		if (strcmp(vtab[i].vt_name, path) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   657
			if (vtab[i].vt_flags & SDEV_NO_NCACHE)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   658
				dv->sdev_flags |= SDEV_NO_NCACHE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   659
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   660
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   661
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   662
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   663
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   664
void *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   665
sdev_get_vtor(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   666
{
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   667
	struct sdev_vop_table *vtp;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   668
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   669
	vtp = sdev_match(dv);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   670
	if (vtp)
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   671
		return ((void *)vtp->vt_vtor);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   672
	else
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   673
		return (NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   674
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   675
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   676
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   677
 * Build the base root inode
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
ino_t
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   680
sdev_mkino(struct sdev_node *dv)
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
	ino_t	ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   683
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
	 * for now, follow the lead of tmpfs here
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   686
	 * need to someday understand the requirements here
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 = (ino_t)(uint32_t)((uintptr_t)dv >> 3);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   689
	ino += SDEV_ROOTINO + 1;
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
	return (ino);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   692
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   693
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
   694
int
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   695
sdev_getlink(struct vnode *linkvp, char **link)
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
	int err;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   698
	char *buf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   699
	struct uio uio = {0};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   700
	struct iovec iov = {0};
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   701
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   702
	if (linkvp == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   703
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   704
	ASSERT(linkvp->v_type == VLNK);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   705
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   706
	buf = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   707
	iov.iov_base = buf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   708
	iov.iov_len = MAXPATHLEN;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   709
	uio.uio_iov = &iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   710
	uio.uio_iovcnt = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   711
	uio.uio_resid = MAXPATHLEN;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   712
	uio.uio_segflg = UIO_SYSSPACE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   713
	uio.uio_llimit = MAXOFFSET_T;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   714
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
   715
	err = VOP_READLINK(linkvp, &uio, kcred, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   716
	if (err) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   717
		cmn_err(CE_WARN, "readlink %s failed in dev\n", buf);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   718
		kmem_free(buf, MAXPATHLEN);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   719
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   720
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   721
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   722
	/* mission complete */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   723
	*link = i_ddi_strdup(buf, KM_SLEEP);
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 (0);
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
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   729
 * A convenient wrapper to get the devfs node vnode for a device
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   730
 * minor functionality: readlink() of a /dev symlink
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   731
 * Place the link into dv->sdev_symlink
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
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   734
sdev_follow_link(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   735
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   736
	int err;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   737
	struct vnode *linkvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   738
	char *link = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   739
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   740
	linkvp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   741
	if (linkvp == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   742
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   743
	ASSERT(linkvp->v_type == VLNK);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   744
	err = sdev_getlink(linkvp, &link);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   745
	if (err) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   746
		(void) sdev_nodezombied(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   747
		dv->sdev_symlink = 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
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   750
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   751
	ASSERT(link != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   752
	dv->sdev_symlink = link;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   753
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   754
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   755
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   756
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   757
sdev_node_check(struct sdev_node *dv, struct vattr *nvap, void *nargs)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   758
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   759
	vtype_t otype = SDEVTOV(dv)->v_type;
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
	 * existing sdev_node has a different type.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   763
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   764
	if (otype != nvap->va_type) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   765
		sdcmn_err9(("sdev_node_check: existing node "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   766
		    "  %s type %d does not match new node type %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   767
		    dv->sdev_name, otype, nvap->va_type));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   768
		return (EEXIST);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   771
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   772
	 * For a symlink, the target should be the same.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   773
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   774
	if (otype == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   775
		ASSERT(nargs != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   776
		ASSERT(dv->sdev_symlink != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   777
		if (strcmp(dv->sdev_symlink, (char *)nargs) != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   778
			sdcmn_err9(("sdev_node_check: existing node "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   779
			    " %s has different symlink %s as new node "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   780
			    " %s\n", dv->sdev_name, dv->sdev_symlink,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   781
			    (char *)nargs));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   782
			return (EEXIST);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   783
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   784
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   785
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   786
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   787
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   788
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   789
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   790
 * sdev_mknode - a wrapper for sdev_nodeinit(), sdev_nodeready()
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
 * arguments:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   793
 *	- ddv (parent)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   794
 *	- nm (child name)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   795
 *	- newdv (sdev_node for nm is returned here)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   796
 *	- vap (vattr for the node to be created, va_type should be set.
6335
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
   797
 *	- avp (attribute vnode)
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   798
 *	  the defaults should be used if unknown)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   799
 *	- cred
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   800
 *	- args
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   801
 *	    . tnm (for VLNK)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   802
 *	    . global sdev_node (for !SDEV_GLOBAL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   803
 * 	- state: SDEV_INIT, SDEV_READY
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   804
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   805
 * 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
   806
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   807
 * NOTE:  directory contents writers lock needs to be held before
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   808
 *	  calling this routine.
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
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   811
sdev_mknode(struct sdev_node *ddv, char *nm, struct sdev_node **newdv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   812
    struct vattr *vap, struct vnode *avp, void *args, struct cred *cred,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   813
    sdev_node_state_t state)
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 error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   816
	sdev_node_state_t node_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   817
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   818
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   819
	ASSERT(state != SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   820
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   821
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   822
	if (*newdv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   823
		dv = *newdv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   824
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   825
		/* allocate and initialize a sdev_node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   826
		if (ddv->sdev_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   827
			sdcmn_err9(("sdev_mknode: parent %s ZOMBIEd\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   828
			    ddv->sdev_path));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   829
			return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   830
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   831
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   832
		error = sdev_nodeinit(ddv, nm, &dv, vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   833
		if (error != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   834
			sdcmn_err9(("sdev_mknode: error %d,"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   835
			    " name %s can not be initialized\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   836
			    error, nm));
6335
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
   837
			return (error);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   838
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   839
		ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   840
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   841
		/* insert into the directory cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   842
		error = sdev_cache_update(ddv, &dv, nm, SDEV_CACHE_ADD);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   843
		if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   844
			sdcmn_err9(("sdev_mknode: node %s can not"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   845
			    " be added into directory cache\n", nm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   846
			return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   847
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   848
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   849
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   850
	ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   851
	node_state = dv->sdev_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   852
	ASSERT(node_state != SDEV_ZOMBIE);
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
	if (state == SDEV_READY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   855
		switch (node_state) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   856
		case SDEV_INIT:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   857
			error = sdev_nodeready(dv, vap, avp, args, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   858
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   859
				sdcmn_err9(("sdev_mknode: node %s can NOT"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   860
				    " be transitioned into READY state, "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   861
				    "error %d\n", nm, error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   862
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   863
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   864
		case SDEV_READY:
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
			 * Do some sanity checking to make sure
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   867
			 * the existing sdev_node is what has been
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   868
			 * asked for.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   869
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   870
			error = sdev_node_check(dv, vap, args);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   871
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   872
		default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   873
			break;
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
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   876
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   877
	if (!error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   878
		*newdv = dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   879
		ASSERT((*newdv)->sdev_state != SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   880
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   881
		SDEV_SIMPLE_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   882
		*newdv = NULL;
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
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   886
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   887
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   888
/*
6335
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
   889
 * convenient wrapper to change vp's ATIME, CTIME and MTIME
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   890
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   891
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   892
sdev_update_timestamps(struct vnode *vp, cred_t *cred, uint_t mask)
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
	struct vattr attr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   895
	timestruc_t now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   896
	int err;
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
	ASSERT(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   899
	gethrestime(&now);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   900
	if (mask & AT_CTIME)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   901
		attr.va_ctime = now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   902
	if (mask & AT_MTIME)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   903
		attr.va_mtime = now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   904
	if (mask & AT_ATIME)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   905
		attr.va_atime = now;
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
	attr.va_mask = (mask & AT_TIMES);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   908
	err = VOP_SETATTR(vp, &attr, 0, cred, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   909
	if (err && (err != EROFS)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   910
		sdcmn_err(("update timestamps error %d\n", err));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   911
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   912
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   913
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   914
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   915
 * the backing store vnode is released here
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   916
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   917
/*ARGSUSED1*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   918
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   919
sdev_nodedestroy(struct sdev_node *dv, uint_t flags)
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
	/* no references */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   922
	ASSERT(dv->sdev_nlink == 0);
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
	if (dv->sdev_attrvp != NULLVP) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   925
		VN_RELE(dv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   926
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   927
		 * reset the attrvp so that no more
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   928
		 * references can be made on this already
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   929
		 * vn_rele() vnode
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   930
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   931
		dv->sdev_attrvp = NULLVP;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   934
	if (dv->sdev_attr != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   935
		kmem_free(dv->sdev_attr, sizeof (struct vattr));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   936
		dv->sdev_attr = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   937
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   938
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   939
	if (dv->sdev_name != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   940
		kmem_free(dv->sdev_name, dv->sdev_namelen + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   941
		dv->sdev_name = NULL;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   944
	if (dv->sdev_symlink != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   945
		kmem_free(dv->sdev_symlink, strlen(dv->sdev_symlink) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   946
		dv->sdev_symlink = NULL;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   949
	if (dv->sdev_path) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   950
		kmem_free(dv->sdev_path, strlen(dv->sdev_path) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   951
		dv->sdev_path = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   952
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   953
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   954
	if (!SDEV_IS_GLOBAL(dv))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   955
		sdev_prof_free(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   956
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   957
	if (SDEVTOV(dv)->v_type == VDIR) {
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   958
		ASSERT(SDEV_FIRST_ENTRY(dv) == NULL);
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   959
		avl_destroy(&dv->sdev_entries);
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   960
	}
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   961
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   962
	mutex_destroy(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   963
	cv_destroy(&dv->sdev_lookup_cv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   964
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   965
	/* return node to initial state as per constructor */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   966
	(void) memset((void *)&dv->sdev_instance_data, 0,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   967
	    sizeof (dv->sdev_instance_data));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   968
	vn_invalid(SDEVTOV(dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   969
	kmem_cache_free(sdev_node_cache, dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   970
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   971
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   972
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   973
 * DIRECTORY CACHE lookup
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
struct sdev_node *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   976
sdev_findbyname(struct sdev_node *ddv, char *nm)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   977
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   978
	struct sdev_node *dv;
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   979
	struct sdev_node dvtmp;
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   980
	avl_index_t	where;
2621
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
	ASSERT(RW_LOCK_HELD(&ddv->sdev_contents));
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   983
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   984
	dvtmp.sdev_name = nm;
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   985
	dv = avl_find(&ddv->sdev_entries, &dvtmp, &where);
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   986
	if (dv) {
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   987
		ASSERT(dv->sdev_dotdot == ddv);
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
   988
		ASSERT(strcmp(dv->sdev_name, nm) == 0);
6347
4a8f3222f5f2 6683580 remount during install causes panic in subsequent lookup
jg
parents: 6335
diff changeset
   989
		SDEV_HOLD(dv);
4a8f3222f5f2 6683580 remount during install causes panic in subsequent lookup
jg
parents: 6335
diff changeset
   990
		return (dv);
2621
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
	return (NULL);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   995
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   996
 * Inserts a new sdev_node in a parent directory
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   997
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   998
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
   999
sdev_direnter(struct sdev_node *ddv, struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1000
{
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  1001
	avl_index_t where;
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  1002
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1003
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1004
	ASSERT(SDEVTOV(ddv)->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1005
	ASSERT(ddv->sdev_nlink >= 2);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1006
	ASSERT(dv->sdev_nlink == 0);
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
	dv->sdev_dotdot = ddv;
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  1009
	VERIFY(avl_find(&ddv->sdev_entries, dv, &where) == NULL);
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  1010
	avl_insert(&ddv->sdev_entries, dv, where);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1011
	ddv->sdev_nlink++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1012
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1013
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
 * The following check is needed because while sdev_nodes are linked
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1016
 * in SDEV_INIT state, they have their link counts incremented only
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1017
 * in SDEV_READY state.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1018
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1019
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1020
decr_link(struct sdev_node *dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1021
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1022
	if (dv->sdev_state != SDEV_INIT)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1023
		dv->sdev_nlink--;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1024
	else
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1025
		ASSERT(dv->sdev_nlink == 0);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1028
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1029
 * Delete an existing dv from directory cache
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
 * 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
  1032
 *     the node is put into ZOMBIE state. Once the reference count
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1033
 *     reaches "0", the node is unlinked and destroyed,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1034
 *     in sdev_inactive().
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1035
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1036
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1037
sdev_dirdelete(struct sdev_node *ddv, struct sdev_node *dv)
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
	struct vnode *vp;
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
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
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
	vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1044
	mutex_enter(&vp->v_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1045
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1046
	/* dv is held still */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1047
	if (vp->v_count > 1) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1048
		rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1049
		if (dv->sdev_state == SDEV_READY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1050
			sdcmn_err9((
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1051
			    "sdev_dirdelete: node %s busy with count %d\n",
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1052
			    dv->sdev_name, vp->v_count));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1053
			dv->sdev_state = SDEV_ZOMBIE;
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
		rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1056
		--vp->v_count;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1057
		mutex_exit(&vp->v_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1058
		return (EBUSY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1059
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1060
	ASSERT(vp->v_count == 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1061
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1062
	/* unlink from the memory cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1063
	ddv->sdev_nlink--;	/* .. to above */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1064
	if (vp->v_type == VDIR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1065
		decr_link(dv);		/* . to self */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1066
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1067
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  1068
	avl_remove(&ddv->sdev_entries, dv);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1069
	decr_link(dv);	/* name, back to zero */
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1073
	/* destroy the node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1074
	sdev_nodedestroy(dv, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1075
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1076
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1077
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1078
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1079
 * check if the source is in the path of the target
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
 * source and target are different
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1082
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1083
/*ARGSUSED2*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1084
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1085
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
  1086
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1087
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1088
	struct sdev_node *dotdot, *dir;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1089
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1090
	dotdot = tdv->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1091
	ASSERT(dotdot);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1092
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1093
	/* fs root */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1094
	if (dotdot == tdv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1095
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1096
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1097
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1098
	for (;;) {
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
		 * avoid error cases like
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1101
		 *	mv a a/b
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1102
		 *	mv a a/b/c
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1103
		 *	etc.
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
		if (dotdot == sdv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1106
			error = EINVAL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1107
			break;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1110
		dir = dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1111
		dotdot = dir->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1112
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1113
		/* done checking because root is reached */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1114
		if (dir == dotdot) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1115
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1116
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1117
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1118
	return (error);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1121
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1122
sdev_rnmnode(struct sdev_node *oddv, struct sdev_node *odv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1123
    struct sdev_node *nddv, struct sdev_node **ndvp, char *nnm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1124
    struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1125
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1126
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1127
	struct vnode *ovp = SDEVTOV(odv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1128
	struct vnode *nvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1129
	struct vattr vattr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1130
	int doingdir = (ovp->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1131
	char *link = NULL;
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1132
	int samedir = (oddv == nddv) ? 1 : 0;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1133
	int bkstore = 0;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1134
	struct sdev_node *idv = NULL;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1135
	struct sdev_node *ndv = NULL;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1136
	timestruc_t now;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1137
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
  1138
	vattr.va_mask = AT_TYPE|AT_MODE|AT_UID|AT_GID;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1139
	error = VOP_GETATTR(ovp, &vattr, 0, cred, NULL);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1140
	if (error)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1141
		return (error);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1142
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1143
	if (!samedir)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1144
		rw_enter(&oddv->sdev_contents, RW_WRITER);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1145
	rw_enter(&nddv->sdev_contents, RW_WRITER);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1146
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1147
	/*
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1148
	 * the source may have been deleted by another thread before
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1149
	 * we gets here.
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1150
	 */
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1151
	if (odv->sdev_state != SDEV_READY) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1152
		error = ENOENT;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1153
		goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1154
	}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1155
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1156
	if (doingdir && (odv == nddv)) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1157
		error = EINVAL;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1158
		goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1159
	}
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1160
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1161
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1162
	 * If renaming a directory, and the parents are different (".." must be
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1163
	 * 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
  1164
	 * the target since it would orphan everything below the source dir.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1165
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1166
	if (doingdir && (oddv != nddv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1167
		error = sdev_checkpath(odv, nddv, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1168
		if (error)
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1169
			goto err_out;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1170
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1171
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1172
	/* destination existing */
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1173
	if (*ndvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1174
		nvp = SDEVTOV(*ndvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1175
		ASSERT(nvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1176
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1177
		/* handling renaming to itself */
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1178
		if (odv == *ndvp) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1179
			error = 0;
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
		}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1182
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1183
		if (nvp->v_type == VDIR) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1184
			if (!doingdir) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1185
				error = EISDIR;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1186
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1187
			}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1188
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1189
			if (vn_vfswlock(nvp)) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1190
				error = EBUSY;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1191
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1192
			}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1193
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1194
			if (vn_mountedvfs(nvp) != NULL) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1195
				vn_vfsunlock(nvp);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1196
				error = EBUSY;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1197
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1198
			}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1199
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1200
			/* in case dir1 exists in dir2 and "mv dir1 dir2" */
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1201
			if ((*ndvp)->sdev_nlink > 2) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1202
				vn_vfsunlock(nvp);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1203
				error = EEXIST;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1204
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1205
			}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1206
			vn_vfsunlock(nvp);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1207
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1208
			(void) sdev_dirdelete(nddv, *ndvp);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1209
			*ndvp = NULL;
6335
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
  1210
			ASSERT(nddv->sdev_attrvp);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1211
			error = VOP_RMDIR(nddv->sdev_attrvp, nnm,
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  1212
			    nddv->sdev_attrvp, cred, NULL, 0);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1213
			if (error)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1214
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1215
		} else {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1216
			if (doingdir) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1217
				error = ENOTDIR;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1218
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1219
			}
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
			if (SDEV_IS_PERSIST((*ndvp))) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1222
				bkstore = 1;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1223
			}
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1224
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1225
			/*
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1226
			 * get rid of the node from the directory cache
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1227
			 * note, in case EBUSY is returned, the ZOMBIE
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1228
			 * node is taken care in sdev_mknode.
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1229
			 */
2729
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
			if (bkstore) {
6335
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
  1233
				ASSERT(nddv->sdev_attrvp);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1234
				error = VOP_REMOVE(nddv->sdev_attrvp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1235
				    nnm, cred, NULL, 0);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1236
				if (error)
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  1237
					goto err_out;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1238
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1239
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1240
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1241
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1242
	/* fix the source for a symlink */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1243
	if (vattr.va_type == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1244
		if (odv->sdev_symlink == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1245
			error = sdev_follow_link(odv);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1246
			if (error) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1247
				error = ENOENT;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1248
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1249
			}
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1250
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1251
		ASSERT(odv->sdev_symlink);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1252
		link = i_ddi_strdup(odv->sdev_symlink, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1253
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1254
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1255
	/*
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1256
	 * make a fresh node from the source attrs
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1257
	 */
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1258
	ASSERT(RW_WRITE_HELD(&nddv->sdev_contents));
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1259
	error = sdev_mknode(nddv, nnm, ndvp, &vattr,
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1260
	    NULL, (void *)link, cred, SDEV_READY);
2621
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
	if (link)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1263
		kmem_free(link, strlen(link) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1264
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1265
	if (error)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1266
		goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1267
	ASSERT(*ndvp);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1268
	ASSERT((*ndvp)->sdev_state == SDEV_READY);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1269
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1270
	/* move dir contents */
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1271
	if (doingdir) {
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  1272
		for (idv = SDEV_FIRST_ENTRY(odv); idv;
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  1273
		    idv = SDEV_NEXT_ENTRY(odv, idv)) {
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1274
			error = sdev_rnmnode(odv, idv,
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1275
			    (struct sdev_node *)(*ndvp), &ndv,
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1276
			    idv->sdev_name, cred);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1277
			if (error)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1278
				goto err_out;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1279
			ndv = NULL;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1280
		}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1281
	}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1282
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1283
	if ((*ndvp)->sdev_attrvp) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1284
		sdev_update_timestamps((*ndvp)->sdev_attrvp, kcred,
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1285
		    AT_CTIME|AT_ATIME);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1286
	} else {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1287
		ASSERT((*ndvp)->sdev_attr);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1288
		gethrestime(&now);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1289
		(*ndvp)->sdev_attr->va_ctime = now;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1290
		(*ndvp)->sdev_attr->va_atime = now;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1291
	}
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1292
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1293
	if (nddv->sdev_attrvp) {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1294
		sdev_update_timestamps(nddv->sdev_attrvp, kcred,
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1295
		    AT_MTIME|AT_ATIME);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1296
	} else {
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1297
		ASSERT(nddv->sdev_attr);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1298
		gethrestime(&now);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1299
		nddv->sdev_attr->va_mtime = now;
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1300
		nddv->sdev_attr->va_atime = now;
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
	rw_exit(&nddv->sdev_contents);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1303
	if (!samedir)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1304
		rw_exit(&oddv->sdev_contents);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1305
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1306
	SDEV_RELE(*ndvp);
2729
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1307
	return (error);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1308
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1309
err_out:
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1310
	rw_exit(&nddv->sdev_contents);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1311
	if (!samedir)
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1312
		rw_exit(&oddv->sdev_contents);
aeda30620271 6467958 inappropriate error message displayed from Devfsadm
llai1
parents: 2679
diff changeset
  1313
	return (error);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1314
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1315
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1316
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1317
 * Merge sdev_node specific information into an attribute structure.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1318
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1319
 * note: sdev_node is not locked here
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1320
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1321
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1322
sdev_vattr_merge(struct sdev_node *dv, struct vattr *vap)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1323
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1324
	struct vnode *vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1325
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1326
	vap->va_nlink = dv->sdev_nlink;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1327
	vap->va_nodeid = dv->sdev_ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1328
	vap->va_fsid = SDEVTOV(dv->sdev_dotdot)->v_rdev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1329
	vap->va_type = vp->v_type;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1330
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1331
	if (vp->v_type == VDIR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1332
		vap->va_rdev = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1333
		vap->va_fsid = vp->v_rdev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1334
	} else if (vp->v_type == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1335
		vap->va_rdev = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1336
		vap->va_mode  &= ~S_IFMT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1337
		vap->va_mode |= S_IFLNK;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1338
	} else if ((vp->v_type == VCHR) || (vp->v_type == VBLK)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1339
		vap->va_rdev = vp->v_rdev;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1340
		vap->va_mode &= ~S_IFMT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1341
		if (vap->va_type == VCHR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1342
			vap->va_mode |= S_IFCHR;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1343
		else
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1344
			vap->va_mode |= S_IFBLK;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1345
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1346
		vap->va_rdev = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1347
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1348
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1349
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1350
struct vattr *
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1351
sdev_getdefault_attr(enum vtype type)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1352
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1353
	if (type == VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1354
		return (&sdev_vattr_dir);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1355
	else if (type == VCHR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1356
		return (&sdev_vattr_chr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1357
	else if (type == VBLK)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1358
		return (&sdev_vattr_blk);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1359
	else if (type == VLNK)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1360
		return (&sdev_vattr_lnk);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1361
	else
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1362
		return (NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1363
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1364
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1365
sdev_to_vp(struct sdev_node *dv, struct vnode **vpp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1366
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1367
	int rv = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1368
	struct vnode *vp = SDEVTOV(dv);
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
	switch (vp->v_type) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1371
	case VCHR:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1372
	case VBLK:
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 vnode is a device, return special vnode instead
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1375
		 * (though it knows all about -us- via sp->s_realvp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1376
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1377
		*vpp = specvp(vp, vp->v_rdev, vp->v_type, kcred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1378
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1379
		if (*vpp == NULLVP)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1380
			rv = ENOSYS;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1381
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1382
	default:	/* most types are returned as is */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1383
		*vpp = vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1384
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1385
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1386
	return (rv);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1389
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1390
 * junction between devname and root file system, e.g. ufs
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1391
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1392
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1393
devname_backstore_lookup(struct sdev_node *ddv, char *nm, struct vnode **rvp)
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
	struct vnode *rdvp = ddv->sdev_attrvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1396
	int rval = 0;
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
	ASSERT(rdvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1399
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1400
	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
  1401
	    NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1402
	return (rval);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1403
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1404
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1405
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1406
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
  1407
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1408
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1409
	char	*nm;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1410
	struct vnode *dirvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1411
	int	error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1412
	vnode_t	*vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1413
	int eof;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1414
	struct iovec iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1415
	struct uio uio;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1416
	struct dirent64 *dp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1417
	dirent64_t *dbuf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1418
	size_t dbuflen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1419
	struct vattr vattr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1420
	char *link = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1421
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1422
	if (ddv->sdev_attrvp == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1423
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1424
	if (!(ddv->sdev_flags & SDEV_BUILD))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1425
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1426
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1427
	dirvp = ddv->sdev_attrvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1428
	VN_HOLD(dirvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1429
	dbuf = kmem_zalloc(dlen, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1430
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1431
	uio.uio_iov = &iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1432
	uio.uio_iovcnt = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1433
	uio.uio_segflg = UIO_SYSSPACE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1434
	uio.uio_fmode = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1435
	uio.uio_extflg = UIO_COPY_CACHED;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1436
	uio.uio_loffset = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1437
	uio.uio_llimit = MAXOFFSET_T;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1438
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1439
	eof = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1440
	error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1441
	while (!error && !eof) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1442
		uio.uio_resid = dlen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1443
		iov.iov_base = (char *)dbuf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1444
		iov.iov_len = dlen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1445
		(void) VOP_RWLOCK(dirvp, V_WRITELOCK_FALSE, NULL);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1446
		error = VOP_READDIR(dirvp, &uio, kcred, &eof, NULL, 0);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1447
		VOP_RWUNLOCK(dirvp, V_WRITELOCK_FALSE, NULL);
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
		dbuflen = dlen - uio.uio_resid;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1450
		if (error || dbuflen == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1451
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1452
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1453
		if (!(ddv->sdev_flags & SDEV_BUILD))
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1454
			break;
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
		for (dp = dbuf; ((intptr_t)dp <
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1457
		    (intptr_t)dbuf + dbuflen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1458
		    dp = (dirent64_t *)((intptr_t)dp + dp->d_reclen)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1459
			nm = dp->d_name;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1460
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1461
			if (strcmp(nm, ".") == 0 ||
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1462
			    strcmp(nm, "..") == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1463
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1464
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1465
			vp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1466
			dv = sdev_cache_lookup(ddv, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1467
			if (dv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1468
				if (dv->sdev_state != SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1469
					SDEV_SIMPLE_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1470
				} else {
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
					 * A ZOMBIE node may not have been
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1473
					 * cleaned up from the backing store,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1474
					 * bypass this entry in this case,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1475
					 * and clean it up from the directory
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1476
					 * cache if this is the last call.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1477
					 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1478
					(void) sdev_dirdelete(ddv, dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1479
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1480
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1481
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1482
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1483
			/* refill the cache if not already */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1484
			error = devname_backstore_lookup(ddv, nm, &vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1485
			if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1486
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1487
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
  1488
			vattr.va_mask = AT_TYPE|AT_MODE|AT_UID|AT_GID;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1489
			error = VOP_GETATTR(vp, &vattr, 0, cred, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1490
			if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1491
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1492
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1493
			if (vattr.va_type == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1494
				error = sdev_getlink(vp, &link);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1495
				if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1496
					continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1497
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1498
				ASSERT(link != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1499
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1500
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1501
			if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1502
				rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1503
				rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1504
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1505
			error = sdev_mknode(ddv, nm, &dv, &vattr, vp, link,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1506
			    cred, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1507
			rw_downgrade(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1508
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1509
			if (link != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1510
				kmem_free(link, strlen(link) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1511
				link = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1512
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1513
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1514
			if (!error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1515
				ASSERT(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1516
				ASSERT(dv->sdev_state != SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1517
				SDEV_SIMPLE_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1518
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1519
			vp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1520
			dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1521
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1522
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1523
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1524
done:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1525
	VN_RELE(dirvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1526
	kmem_free(dbuf, dlen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1527
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1528
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1529
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1530
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1531
void
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1532
sdev_filldir_dynamic(struct sdev_node *ddv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1533
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1534
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1535
	int i;
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
  1536
	struct vattr vattr;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
  1537
	struct vattr *vap = &vattr;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1538
	char *nm = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1539
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1540
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1541
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1542
	ASSERT((ddv->sdev_flags & SDEV_BUILD));
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1543
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
  1544
	*vap = *sdev_getdefault_attr(VDIR);	/* note structure copy here */
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1545
	gethrestime(&vap->va_atime);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1546
	vap->va_mtime = vap->va_atime;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1547
	vap->va_ctime = vap->va_atime;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1548
	for (i = 0; vtab[i].vt_name != NULL; i++) {
12923
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
  1549
		/*
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
  1550
		 * This early, we may be in a read-only /dev
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
  1551
		 * environment: leave the creation of any nodes we'd
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
  1552
		 * attempt to persist to devfsadm.
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
  1553
		 */
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
  1554
		if (vtab[i].vt_flags & SDEV_PERSIST)
3c964548d01f 6968425 Seeing build_devlink_list: readlink failed messages in console with Osolb143
John Levon <john.levon@sun.com>
parents: 12717
diff changeset
  1555
			continue;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1556
		nm = vtab[i].vt_name;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1557
		ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1558
		dv = NULL;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1559
		error = sdev_mknode(ddv, nm, &dv, vap, NULL,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1560
		    NULL, kcred, SDEV_READY);
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1561
		if (error) {
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1562
			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
  1563
			    ddv->sdev_name, nm, error);
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1564
		} else {
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1565
			ASSERT(dv);
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1566
			ASSERT(dv->sdev_state != SDEV_ZOMBIE);
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1567
			SDEV_SIMPLE_RELE(dv);
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  1568
		}
2621
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1572
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1573
 * Creating a backing store entry based on sdev_attr.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1574
 * 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
  1575
 * or from setattr/setsecattr to persist access attributes across reboot.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1576
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1577
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1578
sdev_shadow_node(struct sdev_node *dv, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1579
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1580
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1581
	struct vnode *dvp = SDEVTOV(dv->sdev_dotdot);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1582
	struct vnode *rdvp = VTOSDEV(dvp)->sdev_attrvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1583
	struct vattr *vap = dv->sdev_attr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1584
	char *nm = dv->sdev_name;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1585
	struct vnode *tmpvp, **rvp = &tmpvp, *rrvp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1586
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1587
	ASSERT(dv && dv->sdev_name && rdvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1588
	ASSERT(RW_WRITE_HELD(&dv->sdev_contents) && dv->sdev_attrvp == NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1589
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1590
lookup:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1591
	/* try to find it in the backing store */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1592
	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
  1593
	    NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1594
	if (error == 0) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1595
		if (VOP_REALVP(*rvp, &rrvp, NULL) == 0) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1596
			VN_HOLD(rrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1597
			VN_RELE(*rvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1598
			*rvp = rrvp;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1601
		kmem_free(dv->sdev_attr, sizeof (vattr_t));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1602
		dv->sdev_attr = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1603
		dv->sdev_attrvp = *rvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1604
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1605
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1606
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1607
	/* let's try to persist the node */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1608
	gethrestime(&vap->va_atime);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1609
	vap->va_mtime = vap->va_atime;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1610
	vap->va_ctime = vap->va_atime;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1611
	vap->va_mask |= AT_TYPE|AT_MODE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1612
	switch (vap->va_type) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1613
	case VDIR:
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1614
		error = VOP_MKDIR(rdvp, nm, vap, rvp, cred, NULL, 0, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1615
		sdcmn_err9(("sdev_shadow_node: mkdir vp %p error %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1616
		    (void *)(*rvp), error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1617
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1618
	case VCHR:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1619
	case VBLK:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1620
	case VREG:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1621
	case VDOOR:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1622
		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
  1623
		    rvp, cred, 0, NULL, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1624
		sdcmn_err9(("sdev_shadow_node: create vp %p, error %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1625
		    (void *)(*rvp), error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1626
		if (!error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1627
			VN_RELE(*rvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1628
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1629
	case VLNK:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1630
		ASSERT(dv->sdev_symlink);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1631
		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
  1632
		    NULL, 0);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1633
		sdcmn_err9(("sdev_shadow_node: create symlink error %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1634
		    error));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1635
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1636
	default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1637
		cmn_err(CE_PANIC, "dev: %s: sdev_shadow_node "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1638
		    "create\n", nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1639
		/*NOTREACHED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1640
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1641
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1642
	/* go back to lookup to factor out spec node and set attrvp */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1643
	if (error == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1644
		goto lookup;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1645
6335
04814a62796c 6525813 assertion failed: rdvp, file: ../../common/fs/dev/sdev_subr.c, line: 1463
jg
parents: 6260
diff changeset
  1646
	sdcmn_err(("cannot persist %s - error %d\n", dv->sdev_path, error));
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1647
	return (error);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1650
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1651
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
  1652
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1653
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1654
	struct sdev_node *dup = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1655
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1656
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1657
	if ((dup = sdev_findbyname(ddv, nm)) == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1658
		sdev_direnter(ddv, *dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1659
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1660
		if (dup->sdev_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1661
			error = sdev_dirdelete(ddv, dup);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1662
			/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1663
			 * The ZOMBIE node is still hanging
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1664
			 * around with more than one reference counts.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1665
			 * Fail the new node creation so that
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1666
			 * the directory cache won't have
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1667
			 * duplicate entries for the same named node
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1668
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1669
			if (error == EBUSY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1670
				SDEV_SIMPLE_RELE(*dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1671
				sdev_nodedestroy(*dv, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1672
				*dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1673
				return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1674
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1675
			sdev_direnter(ddv, *dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1676
		} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1677
			ASSERT((*dv)->sdev_state != SDEV_ZOMBIE);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1678
			SDEV_SIMPLE_RELE(*dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1679
			sdev_nodedestroy(*dv, 0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1680
			*dv = dup;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1681
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1682
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1683
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1684
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1685
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1686
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1687
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1688
sdev_cache_delete(struct sdev_node *ddv, struct sdev_node **dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1689
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1690
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1691
	return (sdev_dirdelete(ddv, *dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1692
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1693
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1694
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1695
 * update the in-core directory cache
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1696
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1697
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1698
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
  1699
    sdev_cache_ops_t ops)
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
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1702
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1703
	ASSERT((SDEV_HELD(*dv)));
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
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1706
	switch (ops) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1707
	case SDEV_CACHE_ADD:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1708
		error = sdev_cache_add(ddv, dv, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1709
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1710
	case SDEV_CACHE_DELETE:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1711
		error = sdev_cache_delete(ddv, dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1712
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1713
	default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1714
		break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1715
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1716
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1717
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1718
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1719
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1720
/*
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  1721
 * retrieve the named entry from the directory cache
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1722
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1723
struct sdev_node *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1724
sdev_cache_lookup(struct sdev_node *ddv, char *nm)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1725
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1726
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1727
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1728
	ASSERT(RW_LOCK_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1729
	dv = sdev_findbyname(ddv, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1730
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1731
	return (dv);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1734
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1735
 * Implicit reconfig for nodes constructed by a link generator
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1736
 * Start devfsadm if needed, or if devfsadm is in progress,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1737
 * prepare to block on devfsadm either completing or
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1738
 * constructing the desired node.  As devfsadmd is global
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1739
 * in scope, constructing all necessary nodes, we only
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1740
 * need to initiate it once.
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
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1743
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
  1744
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1745
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1746
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1747
	if (DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1748
		sdcmn_err6(("lookup: waiting for %s/%s, 0x%x\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1749
		    ddv->sdev_name, nm, devfsadm_state));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1750
		mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1751
		SDEV_BLOCK_OTHERS(dv, (SDEV_LOOKUP | SDEV_LGWAITING));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1752
		mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1753
		error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1754
	} else if (!DEVNAME_DEVFSADM_HAS_RUN(devfsadm_state)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1755
		sdcmn_err6(("lookup %s/%s starting devfsadm, 0x%x\n",
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  1756
		    ddv->sdev_name, nm, devfsadm_state));
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1757
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1758
		sdev_devfsadmd_thread(ddv, dv, kcred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1759
		mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1760
		SDEV_BLOCK_OTHERS(dv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1761
		    (SDEV_LOOKUP | SDEV_LGWAITING));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1762
		mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1763
		error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1764
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1765
		error = -1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1766
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1767
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1768
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1769
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1770
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1771
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1772
 *  Support for specialized device naming construction mechanisms
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
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1775
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
  1776
    int (*callback)(struct sdev_node *, char *, void **, struct cred *,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1777
    void *, char *), int flags, struct cred *cred)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1778
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1779
	int rv = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1780
	char *physpath = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1781
	struct vattr vattr;
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
  1782
	struct vattr *vap = &vattr;
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1783
	struct sdev_node *dv = NULL;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1784
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1785
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1786
	if (flags & SDEV_VLINK) {
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1787
		physpath = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1788
		rv = callback(ddv, nm, (void *)&physpath, kcred, NULL,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1789
		    NULL);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1790
		if (rv) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1791
			kmem_free(physpath, MAXPATHLEN);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1792
			return (-1);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1793
		}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1794
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
  1795
		*vap = *sdev_getdefault_attr(VLNK);	/* structure copy */
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1796
		vap->va_size = strlen(physpath);
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1797
		gethrestime(&vap->va_atime);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1798
		vap->va_mtime = vap->va_atime;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1799
		vap->va_ctime = vap->va_atime;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1800
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1801
		rv = sdev_mknode(ddv, nm, &dv, vap, NULL,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1802
		    (void *)physpath, cred, SDEV_READY);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1803
		kmem_free(physpath, MAXPATHLEN);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1804
		if (rv)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 6712
diff changeset
  1805
			return (rv);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1806
	} else if (flags & SDEV_VATTR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1807
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1808
		 * /dev/pts
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1809
		 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1810
		 * callback is responsible to set the basic attributes,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1811
		 * e.g. va_type/va_uid/va_gid/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1812
		 *    dev_t if VCHR or VBLK/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1813
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1814
		ASSERT(callback);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1815
		rv = callback(ddv, nm, (void *)&vattr, kcred, NULL, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1816
		if (rv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1817
			sdcmn_err3(("devname_lookup_func: SDEV_NONE "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1818
			    "callback failed \n"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1819
			return (-1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1820
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1821
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1822
		rv = sdev_mknode(ddv, nm, &dv, &vattr, NULL, NULL,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1823
		    cred, SDEV_READY);
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
		if (rv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1826
			return (rv);
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
	} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1829
		impossible(("lookup: %s/%s by %s not supported (%d)\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1830
		    SDEVTOV(ddv)->v_path, nm, curproc->p_user.u_comm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1831
		    __LINE__));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1832
		rv = -1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1833
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1834
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1835
	*dvp = dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1836
	return (rv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1837
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1838
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1839
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1840
is_devfsadm_thread(char *exec_name)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1841
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1842
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1843
	 * note: because devfsadmd -> /usr/sbin/devfsadm
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1844
	 * it is safe to use "devfsadm" to capture the lookups
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1845
	 * from devfsadm and its daemon version.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1846
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1847
	if (strcmp(exec_name, "devfsadm") == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1848
		return (1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1849
	return (0);
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
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1853
 * Lookup Order:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1854
 *	sdev_node cache;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1855
 *	backing store (SDEV_PERSIST);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1856
 *	DBNR: a. dir_ops implemented in the loadable modules;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1857
 *	      b. vnode ops in vtab.
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
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1860
devname_lookup_func(struct sdev_node *ddv, char *nm, struct vnode **vpp,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1861
    struct cred *cred, int (*callback)(struct sdev_node *, char *, void **,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1862
    struct cred *, void *, char *), int flags)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1863
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1864
	int rv = 0, nmlen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1865
	struct vnode *rvp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1866
	struct sdev_node *dv = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1867
	int	retried = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1868
	int	error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1869
	struct vattr vattr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1870
	char *lookup_thread = curproc->p_user.u_comm;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1871
	int failed_flags = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1872
	int (*vtor)(struct sdev_node *) = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1873
	int state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1874
	int parent_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1875
	char *link = NULL;
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
	if (SDEVTOV(ddv)->v_type != VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1878
		return (ENOTDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1879
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1880
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1881
	 * Empty name or ., return node itself.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1882
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1883
	nmlen = strlen(nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1884
	if ((nmlen == 0) || ((nmlen == 1) && (nm[0] == '.'))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1885
		*vpp = SDEVTOV(ddv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1886
		VN_HOLD(*vpp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1887
		return (0);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1890
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1891
	 * .., return the parent directory
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
	if ((nmlen == 2) && (strcmp(nm, "..") == 0)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1894
		*vpp = SDEVTOV(ddv->sdev_dotdot);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1895
		VN_HOLD(*vpp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1896
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1897
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1898
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1899
	rw_enter(&ddv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1900
	if (ddv->sdev_flags & SDEV_VTOR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1901
		vtor = (int (*)(struct sdev_node *))sdev_get_vtor(ddv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1902
		ASSERT(vtor);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1903
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1904
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1905
tryagain:
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
	 * (a) directory cache lookup:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1908
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1909
	ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1910
	parent_state = ddv->sdev_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1911
	dv = sdev_cache_lookup(ddv, nm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1912
	if (dv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1913
		state = dv->sdev_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1914
		switch (state) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1915
		case SDEV_INIT:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1916
			if (is_devfsadm_thread(lookup_thread))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1917
				break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1918
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1919
			/* ZOMBIED parent won't allow node creation */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1920
			if (parent_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1921
				SD_TRACE_FAILED_LOOKUP(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1922
				    retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1923
				goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1924
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1925
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1926
			mutex_enter(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1927
			/* compensate the threads started after devfsadm */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1928
			if (DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1929
			    !(SDEV_IS_LOOKUP(dv)))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1930
				SDEV_BLOCK_OTHERS(dv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1931
				    (SDEV_LOOKUP | SDEV_LGWAITING));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1932
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1933
			if (SDEV_IS_LOOKUP(dv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1934
				failed_flags |= SLF_REBUILT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1935
				rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1936
				error = sdev_wait4lookup(dv, SDEV_LOOKUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1937
				mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1938
				rw_enter(&ddv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1939
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1940
				if (error != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1941
					SD_TRACE_FAILED_LOOKUP(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1942
					    retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1943
					goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1944
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1945
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1946
				state = dv->sdev_state;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1947
				if (state == SDEV_INIT) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1948
					SD_TRACE_FAILED_LOOKUP(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1949
					    retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1950
					goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1951
				} else if (state == SDEV_READY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1952
					goto found;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1953
				} else if (state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1954
					rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1955
					SD_TRACE_FAILED_LOOKUP(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1956
					    retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1957
					SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1958
					goto lookup_failed;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1959
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1960
			} else {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1961
				mutex_exit(&dv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1962
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1963
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1964
		case SDEV_READY:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1965
			goto found;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1966
		case SDEV_ZOMBIE:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1967
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1968
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1969
			SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1970
			goto lookup_failed;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1971
		default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1972
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1973
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1974
			sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1975
			*vpp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1976
			return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1977
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1978
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1979
	ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1980
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1981
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1982
	 * ZOMBIED parent does not allow new node creation.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1983
	 * bail out early
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
	if (parent_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1986
		rw_exit(&ddv->sdev_contents);
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1987
		*vpp = NULLVP;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1988
		SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1989
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1990
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1991
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1992
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1993
	 * (b0): backing store lookup
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1994
	 *	SDEV_PERSIST is default except:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1995
	 *		1) pts nodes
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1996
	 *		2) non-chmod'ed local nodes
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  1997
	 *		3) zvol nodes
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1998
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  1999
	if (SDEV_IS_PERSIST(ddv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2000
		error = devname_backstore_lookup(ddv, nm, &rvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2001
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2002
		if (!error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2003
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 10588
diff changeset
  2004
			vattr.va_mask = AT_TYPE|AT_MODE|AT_UID|AT_GID;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  2005
			error = VOP_GETATTR(rvp, &vattr, 0, cred, NULL);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2006
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2007
				rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2008
				if (dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2009
					SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2010
				SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2011
				sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2012
				*vpp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2013
				return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2014
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2015
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2016
			if (vattr.va_type == VLNK) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2017
				error = sdev_getlink(rvp, &link);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2018
				if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2019
					rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2020
					if (dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2021
						SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2022
					SD_TRACE_FAILED_LOOKUP(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2023
					    retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2024
					sdev_lookup_failed(ddv, nm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2025
					    failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2026
					*vpp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2027
					return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2028
				}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2029
				ASSERT(link != NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2030
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2031
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2032
			if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2033
				rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2034
				rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2035
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2036
			error = sdev_mknode(ddv, nm, &dv, &vattr,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2037
			    rvp, link, cred, SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2038
			rw_downgrade(&ddv->sdev_contents);
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
			if (link != NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2041
				kmem_free(link, strlen(link) + 1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2042
				link = NULL;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2045
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2046
				SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2047
				rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2048
				if (dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2049
					SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2050
				goto lookup_failed;
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
				goto found;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2053
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2054
		} else if (retried) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2055
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2056
			sdcmn_err3(("retry of lookup of %s/%s: failed\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2057
			    ddv->sdev_name, nm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2058
			if (dv)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2059
				SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2060
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2061
			sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2062
			*vpp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2063
			return (ENOENT);
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
8023
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2067
lookup_create_node:
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2068
	/* first thread that is doing the lookup on this node */
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2069
	if (callback) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2070
		ASSERT(dv == NULL);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2071
		if (!rw_tryupgrade(&ddv->sdev_contents)) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2072
			rw_exit(&ddv->sdev_contents);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2073
			rw_enter(&ddv->sdev_contents, RW_WRITER);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2074
		}
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2075
		error = sdev_call_dircallback(ddv, &dv, nm, callback,
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2076
		    flags, cred);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2077
		rw_downgrade(&ddv->sdev_contents);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2078
		if (error == 0) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2079
			goto found;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2080
		} else {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2081
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2082
			rw_exit(&ddv->sdev_contents);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2083
			goto lookup_failed;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2084
		}
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2085
	}
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2086
	if (!dv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2087
		if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2088
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2089
			rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2090
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2091
		error = sdev_mknode(ddv, nm, &dv, NULL, NULL, NULL,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2092
		    cred, SDEV_INIT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2093
		if (!dv) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2094
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2095
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2096
			sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2097
			*vpp = NULLVP;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2098
			return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2099
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2100
		rw_downgrade(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2101
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2102
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
	 * (b1) invoking devfsadm once per life time for devfsadm nodes
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2105
	 */
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2106
	ASSERT(SDEV_HELD(dv));
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2107
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2108
	if (SDEV_IS_NO_NCACHE(dv))
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2109
		failed_flags |= SLF_NO_NCACHE;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2110
	if (sdev_reconfig_boot || !i_ddi_io_initialized() ||
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2111
	    SDEV_IS_DYNAMIC(ddv) || SDEV_IS_NO_NCACHE(dv) ||
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2112
	    ((moddebug & MODDEBUG_FINI_EBUSY) != 0)) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2113
		ASSERT(SDEV_HELD(dv));
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2114
		SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2115
		goto nolock_notfound;
2621
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
	/*
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2119
	 * filter out known non-existent devices recorded
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2120
	 * during initial reconfiguration boot for which
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2121
	 * reconfig should not be done and lookup may
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2122
	 * be short-circuited now.
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2123
	 */
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2124
	if (sdev_lookup_filter(ddv, nm)) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2125
		SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2126
		goto nolock_notfound;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2127
	}
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2128
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2129
	/* bypassing devfsadm internal nodes */
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2130
	if (is_devfsadm_thread(lookup_thread)) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2131
		SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2132
		goto nolock_notfound;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2133
	}
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2134
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2135
	if (sdev_reconfig_disable) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2136
		SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2137
		goto nolock_notfound;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2138
	}
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2139
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2140
	error = sdev_call_devfsadmd(ddv, dv, nm);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2141
	if (error == 0) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2142
		sdcmn_err8(("lookup of %s/%s by %s: reconfig\n",
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2143
		    ddv->sdev_name, nm, curproc->p_user.u_comm));
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2144
		if (sdev_reconfig_verbose) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2145
			cmn_err(CE_CONT,
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2146
			    "?lookup of %s/%s by %s: reconfig\n",
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2147
			    ddv->sdev_name, nm, curproc->p_user.u_comm);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2148
		}
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2149
		retried = 1;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2150
		failed_flags |= SLF_REBUILT;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2151
		ASSERT(dv->sdev_state != SDEV_ZOMBIE);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2152
		SDEV_SIMPLE_RELE(dv);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2153
		goto tryagain;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2154
	} else {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2155
		SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2156
		goto nolock_notfound;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2157
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2158
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2159
found:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2160
	ASSERT(!(dv->sdev_flags & SDEV_STALE));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2161
	ASSERT(dv->sdev_state == SDEV_READY);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2162
	if (vtor) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2163
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2164
		 * Check validity of returned node
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2165
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2166
		switch (vtor(dv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2167
		case SDEV_VTOR_VALID:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2168
			break;
8023
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2169
		case SDEV_VTOR_STALE:
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2170
			/*
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2171
			 * The name exists, but the cache entry is
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2172
			 * stale and needs to be re-created.
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2173
			 */
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2174
			ASSERT(RW_READ_HELD(&ddv->sdev_contents));
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2175
			if (rw_tryupgrade(&ddv->sdev_contents) == 0) {
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2176
				rw_exit(&ddv->sdev_contents);
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2177
				rw_enter(&ddv->sdev_contents, RW_WRITER);
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2178
			}
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2179
			error = sdev_cache_update(ddv, &dv, nm,
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2180
			    SDEV_CACHE_DELETE);
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2181
			rw_downgrade(&ddv->sdev_contents);
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2182
			if (error == 0) {
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2183
				dv = NULL;
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2184
				goto lookup_create_node;
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2185
			}
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7988
diff changeset
  2186
			/* FALLTHRU */
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2187
		case SDEV_VTOR_INVALID:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2188
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2189
			sdcmn_err7(("lookup: destroy invalid "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2190
			    "node: %s(%p)\n", dv->sdev_name, (void *)dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2191
			goto nolock_notfound;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2192
		case SDEV_VTOR_SKIP:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2193
			sdcmn_err7(("lookup: node not applicable - "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2194
			    "skipping: %s(%p)\n", dv->sdev_name, (void *)dv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2195
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2196
			SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2197
			SDEV_RELE(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2198
			goto lookup_failed;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2199
		default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2200
			cmn_err(CE_PANIC,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2201
			    "dev fs: validator failed: %s(%p)\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2202
			    dv->sdev_name, (void *)dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2203
			break;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2207
	rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2208
	rv = sdev_to_vp(dv, vpp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2209
	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
  2210
	    "for nm %s, error %d\n", (void *)*vpp, (*vpp)->v_count,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2211
	    dv->sdev_state, nm, rv));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2212
	return (rv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2213
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2214
nolock_notfound:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2215
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2216
	 * Destroy the node that is created for synchronization purposes.
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
	sdcmn_err3(("devname_lookup_func: %s with state %d\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2219
	    nm, dv->sdev_state));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2220
	ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2221
	if (dv->sdev_state == SDEV_INIT) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2222
		if (!rw_tryupgrade(&ddv->sdev_contents)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2223
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2224
			rw_enter(&ddv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2225
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2226
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
		 * Node state may have changed during the lock
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2229
		 * changes. Re-check.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2230
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2231
		if (dv->sdev_state == SDEV_INIT) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2232
			(void) sdev_dirdelete(ddv, dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2233
			rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2234
			sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2235
			*vpp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2236
			return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2237
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2238
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2239
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2240
	rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2241
	SDEV_RELE(dv);
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
lookup_failed:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2244
	sdev_lookup_failed(ddv, nm, failed_flags);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2245
	*vpp = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2246
	return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2247
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2248
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2249
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2250
 * Given a directory node, mark all nodes beneath as
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2251
 * STALE, i.e. nodes that don't exist as far as new
6347
4a8f3222f5f2 6683580 remount during install causes panic in subsequent lookup
jg
parents: 6335
diff changeset
  2252
 * consumers are concerned.  Remove them from the
4a8f3222f5f2 6683580 remount during install causes panic in subsequent lookup
jg
parents: 6335
diff changeset
  2253
 * list of directory entries so that no lookup or
4a8f3222f5f2 6683580 remount during install causes panic in subsequent lookup
jg
parents: 6335
diff changeset
  2254
 * directory traversal will find them.  The node
4a8f3222f5f2 6683580 remount during install causes panic in subsequent lookup
jg
parents: 6335
diff changeset
  2255
 * not deallocated so existing holds are not affected.
2621
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
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2258
sdev_stale(struct sdev_node *ddv)
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
	struct sdev_node *dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2261
	struct vnode *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2262
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2263
	ASSERT(SDEVTOV(ddv)->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2264
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2265
	rw_enter(&ddv->sdev_contents, RW_WRITER);
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  2266
	for (dv = SDEV_FIRST_ENTRY(ddv); dv; dv = SDEV_NEXT_ENTRY(ddv, dv)) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2267
		vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2268
		if (vp->v_type == VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2269
			sdev_stale(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2270
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2271
		sdcmn_err9(("sdev_stale: setting stale %s\n",
6347
4a8f3222f5f2 6683580 remount during install causes panic in subsequent lookup
jg
parents: 6335
diff changeset
  2272
		    dv->sdev_path));
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2273
		dv->sdev_flags |= SDEV_STALE;
6347
4a8f3222f5f2 6683580 remount during install causes panic in subsequent lookup
jg
parents: 6335
diff changeset
  2274
		avl_remove(&ddv->sdev_entries, dv);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2275
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2276
	ddv->sdev_flags |= SDEV_BUILD;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2277
	rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2278
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2279
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2280
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2281
 * Given a directory node, clean out all the nodes beneath.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2282
 * If expr is specified, clean node with names matching expr.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2283
 * If SDEV_ENFORCE is specified in flags, busy nodes are made stale,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2284
 *	so they are excluded from future lookups.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2285
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2286
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2287
sdev_cleandir(struct sdev_node *ddv, char *expr, uint_t flags)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2288
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2289
	int error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2290
	int busy = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2291
	struct vnode *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2292
	struct sdev_node *dv, *next = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2293
	int bkstore = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2294
	int len = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2295
	char *bks_name = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2296
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2297
	ASSERT(SDEVTOV(ddv)->v_type == VDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2298
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2299
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2300
	 * We try our best to destroy all unused sdev_node's
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
	rw_enter(&ddv->sdev_contents, RW_WRITER);
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  2303
	for (dv = SDEV_FIRST_ENTRY(ddv); dv; dv = next) {
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  2304
		next = SDEV_NEXT_ENTRY(ddv, dv);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2305
		vp = SDEVTOV(dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2306
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2307
		if (expr && gmatch(dv->sdev_name, expr) == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2308
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2309
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2310
		if (vp->v_type == VDIR &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2311
		    sdev_cleandir(dv, NULL, flags) != 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2312
			sdcmn_err9(("sdev_cleandir: dir %s busy\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2313
			    dv->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2314
			busy++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2315
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2316
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2317
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2318
		if (vp->v_count > 0 && (flags & SDEV_ENFORCE) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2319
			sdcmn_err9(("sdev_cleandir: dir %s busy\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2320
			    dv->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2321
			busy++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2322
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2323
		}
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
		 * at this point, either dv is not held or SDEV_ENFORCE
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2327
		 * is specified. In either case, dv needs to be deleted
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
		SDEV_HOLD(dv);
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
		bkstore = SDEV_IS_PERSIST(dv) ? 1 : 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2332
		if (bkstore && (vp->v_type == VDIR))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2333
			bkstore += 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2334
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2335
		if (bkstore) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2336
			len = strlen(dv->sdev_name) + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2337
			bks_name = kmem_alloc(len, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2338
			bcopy(dv->sdev_name, bks_name, len);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2341
		error = sdev_dirdelete(ddv, dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2342
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2343
		if (error == EBUSY) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2344
			sdcmn_err9(("sdev_cleandir: dir busy\n"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2345
			busy++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2346
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2347
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2348
		/* take care the backing store clean up */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2349
		if (bkstore && (error == 0)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2350
			ASSERT(bks_name);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2351
			ASSERT(ddv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2352
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2353
			if (bkstore == 1) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2354
				error = VOP_REMOVE(ddv->sdev_attrvp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  2355
				    bks_name, kcred, NULL, 0);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2356
			} else if (bkstore == 2) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2357
				error = VOP_RMDIR(ddv->sdev_attrvp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  2358
				    bks_name, ddv->sdev_attrvp, kcred, NULL, 0);
2621
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
			/* do not propagate the backing store errors */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2362
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2363
				sdcmn_err9(("sdev_cleandir: backing store"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2364
				    "not cleaned\n"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2365
				error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2366
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2367
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2368
			bkstore = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2369
			kmem_free(bks_name, len);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2370
			bks_name = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2371
			len = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2372
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2373
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2374
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2375
	ddv->sdev_flags |= SDEV_BUILD;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2376
	rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2377
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2378
	if (busy) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2379
		error = EBUSY;
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
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2383
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2384
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
 * a convenient wrapper for readdir() funcs
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
size_t
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2389
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
  2390
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2391
	size_t reclen = DIRENT64_RECLEN(strlen(nm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2392
	if (reclen > size)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2393
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2394
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2395
	de->d_ino = (ino64_t)ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2396
	de->d_off = (off64_t)off + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2397
	de->d_reclen = (ushort_t)reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2398
	(void) strncpy(de->d_name, nm, DIRENT64_NAMELEN(reclen));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2399
	return (reclen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2400
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2401
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2402
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2403
 * sdev_mount service routines
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
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2406
sdev_copyin_mountargs(struct mounta *uap, struct sdev_mountargs *args)
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
	int	error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2409
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2410
	if (uap->datalen != sizeof (*args))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2411
		return (EINVAL);
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
	if (error = copyin(uap->dataptr, args, sizeof (*args))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2414
		cmn_err(CE_WARN, "sdev_copyin_mountargs: can not"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2415
		    "get user data. error %d\n", error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2416
		return (EFAULT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2417
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2418
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2419
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2420
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2421
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2422
#ifdef nextdp
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2423
#undef nextdp
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2424
#endif
3133
63b5e3581eee 6491034 dev: lint cleanup
jg
parents: 2742
diff changeset
  2425
#define	nextdp(dp)	((struct dirent64 *) \
63b5e3581eee 6491034 dev: lint cleanup
jg
parents: 2742
diff changeset
  2426
			    (intptr_t)((char *)(dp) + (dp)->d_reclen))
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2427
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2428
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2429
 * readdir helper func
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2430
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2431
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2432
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
  2433
    int flags)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2434
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2435
	struct sdev_node *ddv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2436
	struct sdev_node *dv;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2437
	dirent64_t	*dp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2438
	ulong_t		outcount = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2439
	size_t		namelen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2440
	ulong_t		alloc_count;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2441
	void		*outbuf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2442
	struct iovec	*iovp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2443
	int		error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2444
	size_t		reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2445
	offset_t	diroff;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2446
	offset_t	soff;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2447
	int		this_reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2448
	int (*vtor)(struct sdev_node *) = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2449
	struct vattr attr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2450
	timestruc_t now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2451
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2452
	ASSERT(ddv->sdev_attr || ddv->sdev_attrvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2453
	ASSERT(RW_READ_HELD(&ddv->sdev_contents));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2454
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2455
	if (uiop->uio_loffset >= MAXOFF_T) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2456
		if (eofp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2457
			*eofp = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2458
		return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2459
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2460
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2461
	if (uiop->uio_iovcnt != 1)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2462
		return (EINVAL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2463
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2464
	if (vp->v_type != VDIR)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2465
		return (ENOTDIR);
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
	if (ddv->sdev_flags & SDEV_VTOR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2468
		vtor = (int (*)(struct sdev_node *))sdev_get_vtor(ddv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2469
		ASSERT(vtor);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2470
	}
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 (eofp != NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2473
		*eofp = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2474
3133
63b5e3581eee 6491034 dev: lint cleanup
jg
parents: 2742
diff changeset
  2475
	soff = uiop->uio_loffset;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2476
	iovp = uiop->uio_iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2477
	alloc_count = iovp->iov_len;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2478
	dp = outbuf = kmem_alloc(alloc_count, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2479
	outcount = 0;
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
	if (ddv->sdev_state == SDEV_ZOMBIE)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2482
		goto get_cache;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2483
2679
39fc2aead8db 6464694 assert failure during "ls $ZONEROOT/dev/pts"
szhou
parents: 2621
diff changeset
  2484
	if (SDEV_IS_GLOBAL(ddv)) {
10097
e33d224110c9 6851199 unused /dev nameservices code can be removed
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 8023
diff changeset
  2485
e33d224110c9 6851199 unused /dev nameservices code can be removed
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 8023
diff changeset
  2486
		if ((sdev_boot_state == SDEV_BOOT_STATE_COMPLETE) &&
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2487
		    !sdev_reconfig_boot && (flags & SDEV_BROWSE) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2488
		    !SDEV_IS_DYNAMIC(ddv) && !SDEV_IS_NO_NCACHE(ddv) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2489
		    ((moddebug & MODDEBUG_FINI_EBUSY) == 0) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2490
		    !DEVNAME_DEVFSADM_HAS_RUN(devfsadm_state) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2491
		    !DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state) &&
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2492
		    !sdev_reconfig_disable) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2493
			/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2494
			 * invoking "devfsadm" to do system device reconfig
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2495
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2496
			mutex_enter(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2497
			SDEV_BLOCK_OTHERS(ddv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2498
			    (SDEV_READDIR|SDEV_LGWAITING));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2499
			mutex_exit(&ddv->sdev_lookup_lock);
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
			sdcmn_err8(("readdir of %s by %s: reconfig\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2502
			    ddv->sdev_path, curproc->p_user.u_comm));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2503
			if (sdev_reconfig_verbose) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2504
				cmn_err(CE_CONT,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2505
				    "?readdir of %s by %s: reconfig\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2506
				    ddv->sdev_path, curproc->p_user.u_comm);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2507
			}
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
			sdev_devfsadmd_thread(ddv, NULL, kcred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2510
		} else if (DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2511
			/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2512
			 * compensate the "ls" started later than "devfsadm"
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2513
			 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2514
			mutex_enter(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2515
			SDEV_BLOCK_OTHERS(ddv, (SDEV_READDIR|SDEV_LGWAITING));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2516
			mutex_exit(&ddv->sdev_lookup_lock);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2519
		/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2520
		 * release the contents lock so that
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  2521
		 * the cache may be updated by devfsadmd
2621
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
		rw_exit(&ddv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2524
		mutex_enter(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2525
		if (SDEV_IS_READDIR(ddv))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2526
			(void) sdev_wait4lookup(ddv, SDEV_READDIR);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2527
		mutex_exit(&ddv->sdev_lookup_lock);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2528
		rw_enter(&ddv->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2529
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2530
		sdcmn_err4(("readdir of directory %s by %s\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2531
		    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
  2532
		if (ddv->sdev_flags & SDEV_BUILD) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2533
			if (SDEV_IS_PERSIST(ddv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2534
				error = sdev_filldir_from_store(ddv,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2535
				    alloc_count, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2536
			}
3843
6501a40c8d2a 6502778 devnames has some problems with node creation and deletion
jg
parents: 3133
diff changeset
  2537
			ddv->sdev_flags &= ~SDEV_BUILD;
2621
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
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2540
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2541
get_cache:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2542
	/* handle "." and ".." */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2543
	diroff = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2544
	if (soff == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2545
		/* first time */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2546
		this_reclen = DIRENT64_RECLEN(1);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2547
		if (alloc_count < this_reclen) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2548
			error = EINVAL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2549
			goto done;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2550
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2551
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2552
		dp->d_ino = (ino64_t)ddv->sdev_ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2553
		dp->d_off = (off64_t)1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2554
		dp->d_reclen = (ushort_t)this_reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2555
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2556
		(void) strncpy(dp->d_name, ".",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2557
		    DIRENT64_NAMELEN(this_reclen));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2558
		outcount += dp->d_reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2559
		dp = nextdp(dp);
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
	diroff++;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2563
	if (soff <= 1) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2564
		this_reclen = DIRENT64_RECLEN(2);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2565
		if (alloc_count < outcount + this_reclen) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2566
			error = EINVAL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2567
			goto done;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2568
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2569
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2570
		dp->d_reclen = (ushort_t)this_reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2571
		dp->d_ino = (ino64_t)ddv->sdev_dotdot->sdev_ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2572
		dp->d_off = (off64_t)2;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2573
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2574
		(void) strncpy(dp->d_name, "..",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2575
		    DIRENT64_NAMELEN(this_reclen));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2576
		outcount += dp->d_reclen;
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
		dp = nextdp(dp);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2581
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2582
	/* gets the cache */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2583
	diroff++;
6260
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  2584
	for (dv = SDEV_FIRST_ENTRY(ddv); dv;
0ca1934af628 6503650 dv_findbyname doesn't scale well in the presence of an extremely large number of devices
jg
parents: 6065
diff changeset
  2585
	    dv = SDEV_NEXT_ENTRY(ddv, dv), diroff++) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2586
		sdcmn_err3(("sdev_readdir: diroff %lld soff %lld for '%s' \n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2587
		    diroff, soff, dv->sdev_name));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2588
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2589
		/* bypassing pre-matured nodes */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2590
		if (diroff < soff || (dv->sdev_state != SDEV_READY)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2591
			sdcmn_err3(("sdev_readdir: pre-mature node  "
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10097
diff changeset
  2592
			    "%s %d\n", dv->sdev_name, dv->sdev_state));
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2593
			continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2594
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2595
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
		 * Check validity of node
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2598
		 * Drop invalid and nodes to be skipped.
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2599
		 * A node the validator indicates as stale needs
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2600
		 * to be returned as presumably the node name itself
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2601
		 * is valid and the node data itself will be refreshed
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2602
		 * on lookup.  An application performing a readdir then
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2603
		 * stat on each entry should thus always see consistent
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2604
		 * data.  In any case, it is not possible to synchronize
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2605
		 * with dynamic kernel state, and any view we return can
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2606
		 * never be anything more than a snapshot at a point in time.
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2607
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2608
		if (vtor) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2609
			switch (vtor(dv)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2610
			case SDEV_VTOR_VALID:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2611
				break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2612
			case SDEV_VTOR_INVALID:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2613
			case SDEV_VTOR_SKIP:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2614
				continue;
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2615
			case SDEV_VTOR_STALE:
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2616
				sdcmn_err3(("sdev_readir: %s stale\n",
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2617
				    dv->sdev_name));
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12633
diff changeset
  2618
				break;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2619
			default:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2620
				cmn_err(CE_PANIC,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2621
				    "dev fs: validator failed: %s(%p)\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2622
				    dv->sdev_name, (void *)dv);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2623
				break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2624
			/*NOTREACHED*/
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2625
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2626
		}
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
		namelen = strlen(dv->sdev_name);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2629
		reclen = DIRENT64_RECLEN(namelen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2630
		if (outcount + reclen > alloc_count) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2631
			goto full;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2632
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2633
		dp->d_reclen = (ushort_t)reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2634
		dp->d_ino = (ino64_t)dv->sdev_ino;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2635
		dp->d_off = (off64_t)diroff + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2636
		(void) strncpy(dp->d_name, dv->sdev_name,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2637
		    DIRENT64_NAMELEN(reclen));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2638
		outcount += reclen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2639
		dp = nextdp(dp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2640
	}
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
full:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2643
	sdcmn_err4(("sdev_readdir: moving %lu bytes: "
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2644
	    "diroff %lld, soff %lld, dv %p\n", outcount, diroff, soff,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2645
	    (void *)dv));
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 (outcount)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2648
		error = uiomove(outbuf, outcount, UIO_READ, uiop);
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) {
3133
63b5e3581eee 6491034 dev: lint cleanup
jg
parents: 2742
diff changeset
  2651
		uiop->uio_loffset = diroff;
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2652
		if (eofp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2653
			*eofp = dv ? 0 : 1;
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2657
	if (ddv->sdev_attrvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2658
		gethrestime(&now);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2659
		attr.va_ctime = now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2660
		attr.va_atime = now;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2661
		attr.va_mask = AT_CTIME|AT_ATIME;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2662
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2663
		(void) VOP_SETATTR(ddv->sdev_attrvp, &attr, 0, kcred, NULL);
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
done:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2666
	kmem_free(outbuf, alloc_count);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2667
	return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2668
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2669
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2670
static int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2671
sdev_modctl_lookup(const char *path, vnode_t **r_vp)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2672
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2673
	vnode_t *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2674
	vnode_t *cvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2675
	struct sdev_node *svp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2676
	char *nm;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2677
	struct pathname pn;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2678
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2679
	int persisted = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2680
7988
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2681
	ASSERT(INGLOBALZONE(curproc));
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2682
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2683
	if (error = pn_get((char *)path, UIO_SYSSPACE, &pn))
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2684
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2685
	nm = kmem_alloc(MAXNAMELEN, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2686
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2687
	vp = rootdir;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2688
	VN_HOLD(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2689
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2690
	while (pn_pathleft(&pn)) {
7988
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2691
		ASSERT(vp->v_type == VDIR || vp->v_type == VLNK);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2692
		(void) pn_getcomponent(&pn, nm);
7988
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2693
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2694
		/*
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2695
		 * Deal with the .. special case where we may be
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2696
		 * traversing up across a mount point, to the
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2697
		 * root of this filesystem or global root.
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2698
		 */
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2699
		if (nm[0] == '.' && nm[1] == '.' && nm[2] == 0) {
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2700
checkforroot:
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2701
			if (VN_CMP(vp, rootdir)) {
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2702
				nm[1] = 0;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2703
			} else if (vp->v_flag & VROOT) {
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2704
				vfs_t *vfsp;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2705
				cvp = vp;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2706
				vfsp = cvp->v_vfsp;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2707
				vfs_rlock_wait(vfsp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2708
				vp = cvp->v_vfsp->vfs_vnodecovered;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2709
				if (vp == NULL ||
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2710
				    (cvp->v_vfsp->vfs_flag & VFS_UNMOUNTED)) {
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2711
					vfs_unlock(vfsp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2712
					VN_RELE(cvp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2713
					error = EIO;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2714
					break;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2715
				}
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2716
				VN_HOLD(vp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2717
				vfs_unlock(vfsp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2718
				VN_RELE(cvp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2719
				cvp = NULL;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2720
				goto checkforroot;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2721
			}
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2722
		}
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2723
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  2724
		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
  2725
		    NULL, NULL);
7988
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2726
		if (error) {
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2727
			VN_RELE(vp);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2728
			break;
7988
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2729
		}
2621
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
		/* traverse mount points encountered on our journey */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2732
		if (vn_ismntpt(cvp) && (error = traverse(&cvp)) != 0) {
7988
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2733
			VN_RELE(vp);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2734
			VN_RELE(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2735
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2736
		}
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
		/*
7988
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2739
		 * symbolic link, can be either relative and absolute
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2740
		 */
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2741
		if ((cvp->v_type == VLNK) && pn_pathleft(&pn)) {
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2742
			struct pathname linkpath;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2743
			pn_alloc(&linkpath);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2744
			if (error = pn_getsymlink(cvp, &linkpath, kcred)) {
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2745
				pn_free(&linkpath);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2746
				break;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2747
			}
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2748
			if (pn_pathleft(&linkpath) == 0)
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2749
				(void) pn_set(&linkpath, ".");
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2750
			error = pn_insert(&pn, &linkpath, strlen(nm));
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2751
			pn_free(&linkpath);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2752
			if (pn.pn_pathlen == 0) {
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2753
				VN_RELE(vp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2754
				return (ENOENT);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2755
			}
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2756
			if (pn.pn_path[0] == '/') {
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2757
				pn_skipslash(&pn);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2758
				VN_RELE(vp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2759
				VN_RELE(cvp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2760
				vp = rootdir;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2761
				VN_HOLD(vp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2762
			} else {
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2763
				VN_RELE(cvp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2764
			}
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2765
			continue;
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2766
		}
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2767
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2768
		VN_RELE(vp);
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2769
b4f90df3107b 6751491 devfsadm check causes panic on clustered systems
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7688
diff changeset
  2770
		/*
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2771
		 * Direct the operation to the persisting filesystem
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2772
		 * underlying /dev.  Bail if we encounter a
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2773
		 * non-persistent dev entity here.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2774
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2775
		if (cvp->v_vfsp->vfs_fstype == devtype) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2776
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2777
			if ((VTOSDEV(cvp)->sdev_flags & SDEV_PERSIST) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2778
				error = ENOENT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2779
				VN_RELE(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2780
				break;
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
			if (VTOSDEV(cvp) == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2784
				error = ENOENT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2785
				VN_RELE(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2786
				break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2787
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2788
			svp = VTOSDEV(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2789
			if ((vp = svp->sdev_attrvp) == NULL) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2790
				error = ENOENT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2791
				VN_RELE(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2792
				break;
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
			persisted = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2795
			VN_HOLD(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2796
			VN_RELE(cvp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2797
			cvp = vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2798
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2799
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2800
		vp = cvp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2801
		pn_skipslash(&pn);
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
	kmem_free(nm, MAXNAMELEN);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2805
	pn_free(&pn);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2806
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2807
	if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2808
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2809
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2810
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2811
	 * Only return persisted nodes in the filesystem underlying /dev.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2812
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2813
	if (!persisted) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2814
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2815
		return (ENOENT);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2816
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2817
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2818
	*r_vp = vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2819
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2820
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2821
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2822
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2823
sdev_modctl_readdir(const char *dir, char ***dirlistp,
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  2824
	int *npathsp, int *npathsp_alloc, int checking_empty)
2621
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
	char	**pathlist = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2827
	char	**newlist = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2828
	int	npaths = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2829
	int	npaths_alloc = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2830
	dirent64_t *dbuf = NULL;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2831
	int	n;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2832
	char	*s;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2833
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2834
	vnode_t *vp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2835
	int eof;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2836
	struct iovec iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2837
	struct uio uio;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2838
	struct dirent64 *dp;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2839
	size_t dlen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2840
	size_t dbuflen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2841
	int ndirents = 64;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2842
	char *nm;
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
	error = sdev_modctl_lookup(dir, &vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2845
	sdcmn_err11(("modctl readdir: %s by %s: %s\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2846
	    dir, curproc->p_user.u_comm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2847
	    (error == 0) ? "ok" : "failed"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2848
	if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2849
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2850
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2851
	dlen = ndirents * (sizeof (*dbuf));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2852
	dbuf = kmem_alloc(dlen, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2853
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2854
	uio.uio_iov = &iov;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2855
	uio.uio_iovcnt = 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2856
	uio.uio_segflg = UIO_SYSSPACE;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2857
	uio.uio_fmode = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2858
	uio.uio_extflg = UIO_COPY_CACHED;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2859
	uio.uio_loffset = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2860
	uio.uio_llimit = MAXOFFSET_T;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2861
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2862
	eof = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2863
	error = 0;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2864
	while (!error && !eof) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2865
		uio.uio_resid = dlen;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2866
		iov.iov_base = (char *)dbuf;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2867
		iov.iov_len = dlen;
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
		(void) VOP_RWLOCK(vp, V_WRITELOCK_FALSE, NULL);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  2870
		error = VOP_READDIR(vp, &uio, kcred, &eof, NULL, 0);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2871
		VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2872
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2873
		dbuflen = dlen - uio.uio_resid;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2874
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2875
		if (error || dbuflen == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2876
			break;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2877
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2878
		for (dp = dbuf; ((intptr_t)dp < (intptr_t)dbuf + dbuflen);
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  2879
		    dp = (dirent64_t *)((intptr_t)dp + dp->d_reclen)) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2880
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2881
			nm = dp->d_name;
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
			if (strcmp(nm, ".") == 0 || strcmp(nm, "..") == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2884
				continue;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2885
			if (npaths == npaths_alloc) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2886
				npaths_alloc += 64;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2887
				newlist = (char **)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2888
				    kmem_zalloc((npaths_alloc + 1) *
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  2889
				    sizeof (char *), KM_SLEEP);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2890
				if (pathlist) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2891
					bcopy(pathlist, newlist,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2892
					    npaths * sizeof (char *));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2893
					kmem_free(pathlist,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2894
					    (npaths + 1) * sizeof (char *));
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
				pathlist = newlist;
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
			n = strlen(nm) + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2899
			s = kmem_alloc(n, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2900
			bcopy(nm, s, n);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2901
			pathlist[npaths++] = s;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2902
			sdcmn_err11(("  %s/%s\n", dir, s));
6065
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  2903
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  2904
			/* if checking empty, one entry is as good as many */
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  2905
			if (checking_empty) {
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  2906
				eof = 1;
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  2907
				break;
b05c5c670963 6453345 devfs_getattr violates devfs locking rules
cth
parents: 5895
diff changeset
  2908
			}
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2909
		}
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
exit:
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2913
	VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2914
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2915
	if (dbuf)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2916
		kmem_free(dbuf, dlen);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2917
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2918
	if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2919
		return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2920
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2921
	*dirlistp = pathlist;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2922
	*npathsp = npaths;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2923
	*npathsp_alloc = npaths_alloc;
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
	return (0);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2928
void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2929
sdev_modctl_readdir_free(char **pathlist, int npaths, int npaths_alloc)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2930
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2931
	int	i, n;
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
	for (i = 0; i < npaths; i++) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2934
		n = strlen(pathlist[i]) + 1;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2935
		kmem_free(pathlist[i], n);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2936
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2937
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2938
	kmem_free(pathlist, (npaths_alloc + 1) * sizeof (char *));
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
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2942
sdev_modctl_devexists(const char *path)
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
	int error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2946
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2947
	error = sdev_modctl_lookup(path, &vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2948
	sdcmn_err11(("modctl dev exists: %s by %s: %s\n",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2949
	    path, curproc->p_user.u_comm,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2950
	    (error == 0) ? "ok" : "failed"));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2951
	if (error == 0)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2952
		VN_RELE(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2953
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2954
	return (error);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2957
extern int sdev_vnodeops_tbl_size;
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
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2960
 * construct a new template with overrides from vtab
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2961
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2962
static fs_operation_def_t *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2963
sdev_merge_vtab(const fs_operation_def_t tab[])
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2964
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2965
	fs_operation_def_t *new;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2966
	const fs_operation_def_t *tab_entry;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2967
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2968
	/* make a copy of standard vnode ops table */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2969
	new = kmem_alloc(sdev_vnodeops_tbl_size, KM_SLEEP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2970
	bcopy((void *)sdev_vnodeops_tbl, new, sdev_vnodeops_tbl_size);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2971
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2972
	/* replace the overrides from tab */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2973
	for (tab_entry = tab; tab_entry->name != NULL; tab_entry++) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2974
		fs_operation_def_t *std_entry = new;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2975
		while (std_entry->name) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2976
			if (strcmp(tab_entry->name, std_entry->name) == 0) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2977
				std_entry->func = tab_entry->func;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2978
				break;
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
			std_entry++;
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 (std_entry->name == NULL)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2983
			cmn_err(CE_NOTE, "sdev_merge_vtab: entry %s unused.",
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2984
			    tab_entry->name);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2985
	}
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
	return (new);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2988
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2989
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2990
/* free memory allocated by sdev_merge_vtab */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2991
static void
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2992
sdev_free_vtab(fs_operation_def_t *new)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2993
{
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2994
	kmem_free(new, sdev_vnodeops_tbl_size);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2995
}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2996
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2997
/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2998
 * a generic setattr() function
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  2999
 *
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3000
 * note: flags only supports AT_UID and AT_GID.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3001
 *	 Future enhancements can be done for other types, e.g. AT_MODE
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3002
 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3003
int
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3004
devname_setattr_func(struct vnode *vp, struct vattr *vap, int flags,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3005
    struct cred *cred, int (*callback)(struct sdev_node *, struct vattr *,
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3006
    int), int protocol)
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
	struct sdev_node	*dv = VTOSDEV(vp);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3009
	struct sdev_node	*parent = dv->sdev_dotdot;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3010
	struct vattr		*get;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3011
	uint_t			mask = vap->va_mask;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3012
	int 			error;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3013
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3014
	/* some sanity checks */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3015
	if (vap->va_mask & AT_NOSET)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3016
		return (EINVAL);
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 (vap->va_mask & AT_SIZE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3019
		if (vp->v_type == VDIR) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3020
			return (EISDIR);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3024
	/* no need to set attribute, but do not fail either */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3025
	ASSERT(parent);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3026
	rw_enter(&parent->sdev_contents, RW_READER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3027
	if (dv->sdev_state == SDEV_ZOMBIE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3028
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3029
		return (0);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3032
	/* If backing store exists, just set it. */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3033
	if (dv->sdev_attrvp) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3034
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3035
		return (VOP_SETATTR(dv->sdev_attrvp, vap, flags, cred, NULL));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3036
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3037
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3038
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3039
	 * Otherwise, for nodes with the persistence attribute, create it.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3040
	 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3041
	ASSERT(dv->sdev_attr);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3042
	if (SDEV_IS_PERSIST(dv) ||
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3043
	    ((vap->va_mask & ~AT_TIMES) != 0 && !SDEV_IS_DYNAMIC(dv))) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3044
		sdev_vattr_merge(dv, vap);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3045
		rw_enter(&dv->sdev_contents, RW_WRITER);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3046
		error = sdev_shadow_node(dv, cred);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3047
		rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3048
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3049
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3050
		if (error)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3051
			return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3052
		return (VOP_SETATTR(dv->sdev_attrvp, vap, flags, cred, NULL));
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3053
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3054
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
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3057
	 * sdev_attr was allocated in sdev_mknode
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
	rw_enter(&dv->sdev_contents, RW_WRITER);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  3060
	error = secpolicy_vnode_setattr(cred, vp, vap,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 3843
diff changeset
  3061
	    dv->sdev_attr, flags, sdev_unlocked_access, dv);
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3062
	if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3063
		rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3064
		rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3065
		return (error);
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
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3068
	get = dv->sdev_attr;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3069
	if (mask & AT_MODE) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3070
		get->va_mode &= S_IFMT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3071
		get->va_mode |= vap->va_mode & ~S_IFMT;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3072
	}
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
	if ((mask & AT_UID) || (mask & AT_GID)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3075
		if (mask & AT_UID)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3076
			get->va_uid = vap->va_uid;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3077
		if (mask & AT_GID)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3078
			get->va_gid = vap->va_gid;
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
		 * a callback must be provided if the protocol is set
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3081
		 */
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3082
		if ((protocol & AT_UID) || (protocol & AT_GID)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3083
			ASSERT(callback);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3084
			error = callback(dv, get, protocol);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3085
			if (error) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3086
				rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3087
				rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3088
				return (error);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3089
			}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3090
		}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3091
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3092
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3093
	if (mask & AT_ATIME)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3094
		get->va_atime = vap->va_atime;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3095
	if (mask & AT_MTIME)
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3096
		get->va_mtime = vap->va_mtime;
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3097
	if (mask & (AT_MODE | AT_UID | AT_GID | AT_CTIME)) {
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3098
		gethrestime(&get->va_ctime);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3099
	}
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
	sdev_vattr_merge(dv, get);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3102
	rw_exit(&dv->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3103
	rw_exit(&parent->sdev_contents);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3104
	return (0);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents:
diff changeset
  3105
}
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3106
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3107
/*
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3108
 * a generic inactive() function
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3109
 */
10097
e33d224110c9 6851199 unused /dev nameservices code can be removed
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 8023
diff changeset
  3110
/*ARGSUSED*/
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3111
void
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3112
devname_inactive_func(struct vnode *vp, struct cred *cred,
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3113
    void (*callback)(struct vnode *))
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3114
{
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3115
	int clean;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3116
	struct sdev_node *dv = VTOSDEV(vp);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3117
	struct sdev_node *ddv = dv->sdev_dotdot;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3118
	int state;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3119
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3120
	rw_enter(&ddv->sdev_contents, RW_WRITER);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3121
	state = dv->sdev_state;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3122
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3123
	mutex_enter(&vp->v_lock);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3124
	ASSERT(vp->v_count >= 1);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3125
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3126
	if (vp->v_count == 1 && callback != NULL)
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3127
		callback(vp);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3128
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3129
	clean = (vp->v_count == 1) && (state == SDEV_ZOMBIE);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3130
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3131
	/*
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3132
	 * last ref count on the ZOMBIE node is released.
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3133
	 * clean up the sdev_node, and
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3134
	 * 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
  3135
	 * the ZOMBIE backing stores also cleaned out.
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3136
	 */
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3137
	if (clean) {
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3138
		ASSERT(ddv);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3139
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3140
		ddv->sdev_nlink--;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3141
		if (vp->v_type == VDIR) {
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3142
			dv->sdev_nlink--;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3143
		}
6347
4a8f3222f5f2 6683580 remount during install causes panic in subsequent lookup
jg
parents: 6335
diff changeset
  3144
		if ((dv->sdev_flags & SDEV_STALE) == 0)
4a8f3222f5f2 6683580 remount during install causes panic in subsequent lookup
jg
parents: 6335
diff changeset
  3145
			avl_remove(&ddv->sdev_entries, dv);
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3146
		dv->sdev_nlink--;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3147
		--vp->v_count;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3148
		mutex_exit(&vp->v_lock);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3149
		sdev_nodedestroy(dv, 0);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3150
	} else {
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3151
		--vp->v_count;
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3152
		mutex_exit(&vp->v_lock);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3153
	}
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3154
	rw_exit(&ddv->sdev_contents);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5331
diff changeset
  3155
}