usr/src/uts/common/fs/zfs/vdev_file.c
author Chris Kirby <Chris.Kirby@oracle.com>
Thu, 10 Jun 2010 15:46:47 -0600
changeset 12605 6790e683d5a5
parent 12247 5bcd281629f8
child 13570 3411fd5f1589
permissions -rw-r--r--
6959846 DMU traverse prefetch size should be a global tunable
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
12247
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11958
diff changeset
    22
 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
#include <sys/zfs_context.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#include <sys/spa.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
#include <sys/vdev_file.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <sys/vdev_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#include <sys/zio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <sys/fs/zfs.h>
6976
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6523
diff changeset
    31
#include <sys/fm/fs/zfs.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
 * Virtual device vector for files.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
11958
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    37
static void
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    38
vdev_file_hold(vdev_t *vd)
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    39
{
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    40
	ASSERT(vd->vdev_path != NULL);
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    41
}
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    42
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    43
static void
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    44
vdev_file_rele(vdev_t *vd)
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    45
{
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    46
	ASSERT(vd->vdev_path != NULL);
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    47
}
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
    48
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
static int
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 6976
diff changeset
    50
vdev_file_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
	vdev_file_t *vf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
	vnode_t *vp;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 6976
diff changeset
    54
	vattr_t vattr;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
	 * We must have a pathname, and it must be absolute.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
	if (vd->vdev_path == NULL || vd->vdev_path[0] != '/') {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
		vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
		return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
10850
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
    65
	/*
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
    66
	 * Reopen the device if it's not currently open.  Otherwise,
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
    67
	 * just update the physical size of the device.
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
    68
	 */
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
    69
	if (vd->vdev_tsd != NULL) {
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
    70
		ASSERT(vd->vdev_reopening);
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
    71
		vf = vd->vdev_tsd;
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
    72
		goto skip_open;
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
    73
	}
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
    74
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
	vf = vd->vdev_tsd = kmem_zalloc(sizeof (vdev_file_t), KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
	 * We always open the files from the root of the global zone, even if
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
	 * we're in a local zone.  If the user has gotten to this point, the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
	 * administrator has already decided that the pool should be available
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    81
	 * to local zone users, so the underlying devices should be as well.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    82
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    83
	ASSERT(vd->vdev_path != NULL && vd->vdev_path[0] == '/');
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 3059
diff changeset
    84
	error = vn_openat(vd->vdev_path + 1, UIO_SYSSPACE,
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
    85
	    spa_mode(vd->vdev_spa) | FOFFMAX, 0, &vp, 0, 0, rootdir, -1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    86
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
	if (error) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    88
		vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    89
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
	vf->vf_vnode = vp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
#ifdef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
	 * Make sure it's a regular file.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
	if (vp->v_type != VREG) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
		vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   100
		return (ENODEV);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   101
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   102
#endif
10850
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
   103
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
   104
skip_open:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   106
	 * Determine the physical size of the file.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   107
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
	vattr.va_mask = AT_SIZE;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5329
diff changeset
   109
	error = VOP_GETATTR(vf->vf_vnode, &vattr, 0, kcred, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   110
	if (error) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
		vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
	*psize = vattr.va_size;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   116
	*ashift = SPA_MINBLOCKSHIFT;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   121
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
vdev_file_close(vdev_t *vd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
	vdev_file_t *vf = vd->vdev_tsd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
10850
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 8241
diff changeset
   126
	if (vd->vdev_reopening || vf == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   127
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
	if (vf->vf_vnode != NULL) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5329
diff changeset
   130
		(void) VOP_PUTPAGE(vf->vf_vnode, 0, 0, B_INVAL, kcred, NULL);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   131
		(void) VOP_CLOSE(vf->vf_vnode, spa_mode(vd->vdev_spa), 1, 0,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   132
		    kcred, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
		VN_RELE(vf->vf_vnode);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   134
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
12247
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11958
diff changeset
   136
	vd->vdev_delayed_close = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
	kmem_free(vf, sizeof (vdev_file_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
	vd->vdev_tsd = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 3059
diff changeset
   141
static int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
vdev_file_io_start(zio_t *zio)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
	vdev_t *vd = zio->io_vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
	vdev_file_t *vf = vd->vdev_tsd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
	ssize_t resid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   147
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
	if (zio->io_type == ZIO_TYPE_IOCTL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
		/* XXPOLICY */
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 3059
diff changeset
   150
		if (!vdev_readable(vd)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
			zio->io_error = ENXIO;
5530
4ed96167d864 6354519 stack overflow in zfs due to zio pipeline
bonwick
parents: 5369
diff changeset
   152
			return (ZIO_PIPELINE_CONTINUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
		switch (zio->io_cmd) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
		case DKIOCFLUSHWRITECACHE:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
			zio->io_error = VOP_FSYNC(vf->vf_vnode, FSYNC | FDSYNC,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5329
diff changeset
   158
			    kcred, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
			zio->io_error = ENOTSUP;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
5530
4ed96167d864 6354519 stack overflow in zfs due to zio pipeline
bonwick
parents: 5369
diff changeset
   164
		return (ZIO_PIPELINE_CONTINUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   165
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
	zio->io_error = vn_rdwr(zio->io_type == ZIO_TYPE_READ ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
	    UIO_READ : UIO_WRITE, vf->vf_vnode, zio->io_data,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
	    zio->io_size, zio->io_offset, UIO_SYSSPACE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
	    0, RLIM64_INFINITY, kcred, &resid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   171
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   172
	if (resid != 0 && zio->io_error == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   173
		zio->io_error = ENOSPC;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
5530
4ed96167d864 6354519 stack overflow in zfs due to zio pipeline
bonwick
parents: 5369
diff changeset
   175
	zio_interrupt(zio);
4ed96167d864 6354519 stack overflow in zfs due to zio pipeline
bonwick
parents: 5369
diff changeset
   176
4ed96167d864 6354519 stack overflow in zfs due to zio pipeline
bonwick
parents: 5369
diff changeset
   177
	return (ZIO_PIPELINE_STOP);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   178
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   179
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 6976
diff changeset
   180
/* ARGSUSED */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 6976
diff changeset
   181
static void
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   182
vdev_file_io_done(zio_t *zio)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   184
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   185
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   186
vdev_ops_t vdev_file_ops = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
	vdev_file_open,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   188
	vdev_file_close,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   189
	vdev_default_asize,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   190
	vdev_file_io_start,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   191
	vdev_file_io_done,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   192
	NULL,
11958
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
   193
	vdev_file_hold,
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
   194
	vdev_file_rele,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   195
	VDEV_TYPE_FILE,		/* name of this vdev type */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   196
	B_TRUE			/* leaf vdev */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   197
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   198
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   199
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   200
 * From userland we access disks just like files.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   201
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   202
#ifndef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   203
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   204
vdev_ops_t vdev_disk_ops = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   205
	vdev_file_open,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
	vdev_file_close,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   207
	vdev_default_asize,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   208
	vdev_file_io_start,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   209
	vdev_file_io_done,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   210
	NULL,
11958
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
   211
	vdev_file_hold,
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 10850
diff changeset
   212
	vdev_file_rele,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   213
	VDEV_TYPE_DISK,		/* name of this vdev type */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   214
	B_TRUE			/* leaf vdev */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   215
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
#endif