usr/src/uts/common/fs/zfs/zio_checksum.c
author eschrock
Tue, 05 Sep 2006 11:37:36 -0700
changeset 2676 5cee47eddab6
parent 1775 e51e26b432c0
child 2856 6f4d5ee1906a
permissions -rw-r--r--
PSARC 2006/486 ZFS canmount property PSARC 2006/497 ZFS create time properties PSARC 2006/502 ZFS get all datasets PSARC 2006/504 ZFS user properties 6269805 properties should be set via an nvlist. 6281585 user defined properties 6349494 'zfs list' output annoying for even moderately long dataset names 6366244 'canmount' option for container-like functionality 6367103 create-time properties 6416639 RFE: provide zfs get -a 6437808 ZFS module version should match on-disk version 6454551 'zfs create -b blocksize filesystem' should fail. 6457478 unrecognized character in error message with 'zpool create -R' command 6457865 missing device name in the error message of 'zpool clear' command 6458571 zfs_ioc_set_prop() doesn't validate input 6458614 zfs ACL #defines should use prefix 6458638 get_configs() accesses bogus memory 6458678 zvol functions should be moved out of zfs_ioctl.h 6458683 zfs_cmd_t could use more cleanup 6458691 common routines to manage zfs_cmd_t nvlists 6460398 zpool import cores on zfs_prop_get 6461029 zpool status -x noexisting-pool has incorrect error message. 6461223 index translations should live with property definitions 6461424 zpool_unmount_datasets() has some busted logic 6461427 zfs_realloc() would be useful 6461757 'zpool status' can report the wrong number of persistent errors 6461784 recursive zfs_snapshot() leaks memory
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/zio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/zio_checksum.h>
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
 * Checksum vectors.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
 * In the SPA, everything is checksummed.  We support checksum vectors
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
 * for three distinct reasons:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
 *   1. Different kinds of data need different levels of protection.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
 *	For SPA metadata, we always want a very strong checksum.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
 *	For user data, we let users make the trade-off between speed
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
 *	and checksum strength.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
 *   2. Cryptographic hash and MAC algorithms are an area of active research.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
 *	It is likely that in future hash functions will be at least as strong
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
 *	as current best-of-breed, and may be substantially faster as well.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
 *	We want the ability to take advantage of these new hashes as soon as
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
 *	they become available.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
 *   3. If someone develops hardware that can compute a strong hash quickly,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
 *	we want the ability to take advantage of that hardware.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
 * Of course, we don't want a checksum upgrade to invalidate existing
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
 * data, so we store the checksum *function* in five bits of the DVA.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
 * This gives us room for up to 32 different checksum functions.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
 * When writing a block, we always checksum it with the latest-and-greatest
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
 * checksum function of the appropriate strength.  When reading a block,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
 * we compare the expected checksum against the actual checksum, which we
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
 * compute via the checksum function specified in the DVA encoding.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
zio_checksum_off(const void *buf, uint64_t size, zio_cksum_t *zcp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
	ZIO_SET_CHECKSUM(zcp, 0, 0, 0, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
zio_checksum_info_t zio_checksum_table[ZIO_CHECKSUM_FUNCTIONS] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
	NULL,			NULL,			0, 0,	"inherit",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
	NULL,			NULL,			0, 0,	"on",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
	zio_checksum_off,	zio_checksum_off,	0, 0,	"off",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    74
	zio_checksum_SHA256,	zio_checksum_SHA256,	1, 1,	"label",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
	zio_checksum_SHA256,	zio_checksum_SHA256,	1, 1,	"gang_header",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
	fletcher_2_native,	fletcher_2_byteswap,	0, 1,	"zilog",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
	fletcher_2_native,	fletcher_2_byteswap,	0, 0,	"fletcher2",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
	fletcher_4_native,	fletcher_4_byteswap,	1, 0,	"fletcher4",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
	zio_checksum_SHA256,	zio_checksum_SHA256,	1, 0,	"SHA256",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    81
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    82
uint8_t
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    83
zio_checksum_select(uint8_t child, uint8_t parent)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    84
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    85
	ASSERT(child < ZIO_CHECKSUM_FUNCTIONS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    86
	ASSERT(parent < ZIO_CHECKSUM_FUNCTIONS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
	ASSERT(parent != ZIO_CHECKSUM_INHERIT && parent != ZIO_CHECKSUM_ON);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    88
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    89
	if (child == ZIO_CHECKSUM_INHERIT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
		return (parent);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
	if (child == ZIO_CHECKSUM_ON)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
		return (ZIO_CHECKSUM_ON_VALUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
	return (child);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
 * Generate the checksum.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   100
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   101
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   102
zio_checksum(uint_t checksum, zio_cksum_t *zcp, void *data, uint64_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
	zio_block_tail_t *zbt = (zio_block_tail_t *)((char *)data + size) - 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
	zio_checksum_info_t *ci = &zio_checksum_table[checksum];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   106
	zio_cksum_t zbt_cksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   107
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
	ASSERT(checksum < ZIO_CHECKSUM_FUNCTIONS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   109
	ASSERT(ci->ci_func[0] != NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   110
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
	if (ci->ci_zbt) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
		*zcp = zbt->zbt_cksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
		zbt->zbt_magic = ZBT_MAGIC;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
		ci->ci_func[0](data, size, &zbt_cksum);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
		zbt->zbt_cksum = zbt_cksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   116
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
		ci->ci_func[0](data, size, zcp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
	}
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
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
zio_checksum_error(zio_t *zio)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
	blkptr_t *bp = zio->io_bp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
	zio_cksum_t zc = bp->blk_cksum;
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   126
	uint_t checksum = BP_IS_GANG(bp) ? ZIO_CHECKSUM_GANG_HEADER :
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   127
	    BP_GET_CHECKSUM(bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
	int byteswap = BP_SHOULD_BYTESWAP(bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
	void *data = zio->io_data;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   130
	uint64_t size = ZIO_GET_IOSIZE(zio);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
	zio_block_tail_t *zbt = (zio_block_tail_t *)((char *)data + size) - 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
	zio_checksum_info_t *ci = &zio_checksum_table[checksum];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
	zio_cksum_t actual_cksum, expected_cksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   134
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
	if (checksum >= ZIO_CHECKSUM_FUNCTIONS || ci->ci_func[0] == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
		return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
	if (ci->ci_zbt) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
		if (checksum == ZIO_CHECKSUM_GANG_HEADER)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
			zio_set_gang_verifier(zio, &zc);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
		if (zbt->zbt_magic == BSWAP_64(ZBT_MAGIC)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
			expected_cksum = zbt->zbt_cksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
			byteswap_uint64_array(&expected_cksum,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
			    sizeof (zio_cksum_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
			zbt->zbt_cksum = zc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   147
			byteswap_uint64_array(&zbt->zbt_cksum,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
			    sizeof (zio_cksum_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
			ci->ci_func[1](data, size, &actual_cksum);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   150
			zbt->zbt_cksum = expected_cksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
			byteswap_uint64_array(&zbt->zbt_cksum,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
			    sizeof (zio_cksum_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
			expected_cksum = zbt->zbt_cksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
			zbt->zbt_cksum = zc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
			ci->ci_func[0](data, size, &actual_cksum);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
			zbt->zbt_cksum = expected_cksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
		zc = expected_cksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
	} else {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   161
		ASSERT(!BP_IS_GANG(bp));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
		ci->ci_func[byteswap](data, size, &actual_cksum);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   164
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   165
	if ((actual_cksum.zc_word[0] - zc.zc_word[0]) |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
	    (actual_cksum.zc_word[1] - zc.zc_word[1]) |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
	    (actual_cksum.zc_word[2] - zc.zc_word[2]) |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
	    (actual_cksum.zc_word[3] - zc.zc_word[3]))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
		return (ECKSUM);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   171
	if (zio_injection_enabled && !zio->io_error)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   172
		return (zio_handle_fault_injection(zio, ECKSUM));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   173
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   175
}