usr/src/uts/common/fs/zfs/vdev_file.c
author ahrens
Fri, 10 Mar 2006 16:27:46 -0800
changeset 1596 2e2377ccbf85
parent 1544 938876158511
child 3059 7d69dbccfcbb
permissions -rw-r--r--
6395371 ASSERT in dmu_tx_count_free: blkid + i < dn->dn_phys->dn_nblkptr 6396359 infinite loop due to dangling dbufs (hang on unmount)
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
/*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <sys/zfs_context.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#include <sys/spa.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <sys/vdev_file.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/vdev_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/zio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/fs/zfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
 * Virtual device vector for files.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
vdev_file_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
	vdev_file_t *vf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
	vnode_t *vp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
	vattr_t vattr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
	 * We must have a pathname, and it must be absolute.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
	if (vd->vdev_path == NULL || vd->vdev_path[0] != '/') {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
		vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
		return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
	vf = vd->vdev_tsd = kmem_zalloc(sizeof (vdev_file_t), KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
#ifdef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
	 * When using a file vdev in kernel context, the underlying filesystem
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
	 * will already be caching the data.  Don't cache it again here.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
	vd->vdev_cache.vc_size = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
	 * We always open the files from the root of the global zone, even if
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
	 * we're in a local zone.  If the user has gotten to this point, the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
	 * administrator has already decided that the pool should be available
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
	 * to local zone users, so the underlying devices should be as well.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
	ASSERT(vd->vdev_path != NULL && vd->vdev_path[0] == '/');
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
	error = vn_openat(vd->vdev_path + 1, UIO_SYSSPACE, spa_mode | FOFFMAX,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
	    0, &vp, 0, 0, rootdir);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    74
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
	if (error) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
		vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
	vf->vf_vnode = vp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    81
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    82
#ifdef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    83
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    84
	 * Make sure it's a regular file.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    85
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    86
	if (vp->v_type != VREG) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
		vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    88
		return (ENODEV);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    89
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
	 * Determine the physical size of the file.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
	vattr.va_mask = AT_SIZE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
	error = VOP_GETATTR(vp, &vattr, 0, kcred);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
	if (error) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
		vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   100
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   101
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   102
	*psize = vattr.va_size;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
	*ashift = SPA_MINBLOCKSHIFT;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   106
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   107
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   109
vdev_file_close(vdev_t *vd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   110
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
	vdev_file_t *vf = vd->vdev_tsd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
	if (vf == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   116
	if (vf->vf_vnode != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
		(void) VOP_PUTPAGE(vf->vf_vnode, 0, 0, B_INVAL, kcred);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
		(void) VOP_CLOSE(vf->vf_vnode, spa_mode, 1, 0, kcred);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
		VN_RELE(vf->vf_vnode);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   121
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
	kmem_free(vf, sizeof (vdev_file_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
	vd->vdev_tsd = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   127
vdev_file_io_start(zio_t *zio)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
	vdev_t *vd = zio->io_vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
	vdev_file_t *vf = vd->vdev_tsd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
	ssize_t resid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   134
	if (zio->io_type == ZIO_TYPE_IOCTL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
		zio_vdev_io_bypass(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
		/* XXPOLICY */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
		if (vdev_is_dead(vd)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
			zio->io_error = ENXIO;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
			zio_next_stage_async(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
			return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
		switch (zio->io_cmd) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
		case DKIOCFLUSHWRITECACHE:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
			zio->io_error = VOP_FSYNC(vf->vf_vnode, FSYNC | FDSYNC,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   147
			    kcred);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
			dprintf("fsync(%s) = %d\n", vdev_description(vd),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
			    zio->io_error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   150
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
			zio->io_error = ENOTSUP;
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
		zio_next_stage_async(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
	if (zio->io_type == ZIO_TYPE_READ && vdev_cache_read(zio) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
	if ((zio = vdev_queue_io(zio)) == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   164
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   165
	/* XXPOLICY */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
	error = vdev_is_dead(vd) ? ENXIO : vdev_error_inject(vd, zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
	if (error) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
		zio->io_error = error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
		zio_next_stage_async(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   171
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   172
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   173
	zio->io_error = vn_rdwr(zio->io_type == ZIO_TYPE_READ ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
	    UIO_READ : UIO_WRITE, vf->vf_vnode, zio->io_data,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   175
	    zio->io_size, zio->io_offset, UIO_SYSSPACE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   176
	    0, RLIM64_INFINITY, kcred, &resid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   177
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   178
	if (resid != 0 && zio->io_error == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   179
		zio->io_error = ENOSPC;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   180
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   181
	zio_next_stage_async(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   182
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   184
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   185
vdev_file_io_done(zio_t *zio)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   186
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
	vdev_queue_io_done(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   188
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   189
	if (zio->io_type == ZIO_TYPE_WRITE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   190
		vdev_cache_write(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   191
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   192
	if (zio_injection_enabled && zio->io_error == 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   193
		zio->io_error = zio_handle_device_injection(zio->io_vd, EIO);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   194
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   195
	zio_next_stage(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   196
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   197
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   198
vdev_ops_t vdev_file_ops = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   199
	vdev_file_open,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   200
	vdev_file_close,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   201
	vdev_default_asize,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   202
	vdev_file_io_start,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   203
	vdev_file_io_done,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   204
	NULL,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   205
	VDEV_TYPE_FILE,		/* name of this vdev type */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
	B_TRUE			/* leaf vdev */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   207
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   208
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   209
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   210
 * From userland we access disks just like files.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   211
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   212
#ifndef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   213
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   214
vdev_ops_t vdev_disk_ops = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   215
	vdev_file_open,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
	vdev_file_close,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
	vdev_default_asize,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
	vdev_file_io_start,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
	vdev_file_io_done,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
	NULL,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   221
	VDEV_TYPE_DISK,		/* name of this vdev type */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
	B_TRUE			/* leaf vdev */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   223
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   225
#endif