usr/src/uts/common/fs/zfs/dmu.c
author Matthew Ahrens <mahrens@delphix.com>
Tue, 20 Aug 2013 20:11:52 -0800
changeset 14234 189ec27885ae
parent 14121 9475b3fef59d
child 14242 dc75c925d8aa
permissions -rw-r--r--
4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive Reviewed by: Adam Leventhal <[email protected]> Reviewed by: George Wilson <[email protected]> Approved by: Dan McDonald <[email protected]>
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
/*
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
    22
 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
    23
 * Copyright (c) 2013 by Delphix. All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
14115
6cfd5a5778b9 3137 L2ARC compression
Saso Kiselkov <skiselkov@gmail.com>
parents: 14054
diff changeset
    26
/* Copyright (c) 2013 by Saso Kiselkov. All rights reserved. */
6cfd5a5778b9 3137 L2ARC compression
Saso Kiselkov <skiselkov@gmail.com>
parents: 14054
diff changeset
    27
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#include <sys/dmu_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <sys/dmu_tx.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/dbuf.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/dnode.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/zfs_context.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
#include <sys/dmu_objset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/dmu_traverse.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <sys/dsl_dataset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <sys/dsl_dir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#include <sys/dsl_pool.h>
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
    39
#include <sys/dsl_synctask.h>
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
    40
#include <sys/dsl_prop.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
#include <sys/dmu_zfetch.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
#include <sys/zfs_ioctl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
#include <sys/zap.h>
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
    44
#include <sys/zio_checksum.h>
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
    45
#include <sys/zio_compress.h>
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
    46
#include <sys/sa.h>
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
    47
#ifdef _KERNEL
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
    48
#include <sys/vmsystm.h>
7315
cdba25672122 6735592 "zio" vmem arenas are confusing, not reported separately
Jonathan W Adams <Jonathan.Adams@Sun.COM>
parents: 7237
diff changeset
    49
#include <sys/zfs_znode.h>
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
    50
#endif
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
    52
/*
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
    53
 * Enable/disable nopwrite feature.
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
    54
 */
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
    55
int zfs_nopwrite_enabled = 1;
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
    56
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {
13750
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    58
	{	DMU_BSWAP_UINT8,	TRUE,	"unallocated"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    59
	{	DMU_BSWAP_ZAP,		TRUE,	"object directory"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    60
	{	DMU_BSWAP_UINT64,	TRUE,	"object array"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    61
	{	DMU_BSWAP_UINT8,	TRUE,	"packed nvlist"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    62
	{	DMU_BSWAP_UINT64,	TRUE,	"packed nvlist size"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    63
	{	DMU_BSWAP_UINT64,	TRUE,	"bpobj"			},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    64
	{	DMU_BSWAP_UINT64,	TRUE,	"bpobj header"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    65
	{	DMU_BSWAP_UINT64,	TRUE,	"SPA space map header"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    66
	{	DMU_BSWAP_UINT64,	TRUE,	"SPA space map"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    67
	{	DMU_BSWAP_UINT64,	TRUE,	"ZIL intent log"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    68
	{	DMU_BSWAP_DNODE,	TRUE,	"DMU dnode"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    69
	{	DMU_BSWAP_OBJSET,	TRUE,	"DMU objset"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    70
	{	DMU_BSWAP_UINT64,	TRUE,	"DSL directory"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    71
	{	DMU_BSWAP_ZAP,		TRUE,	"DSL directory child map"},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    72
	{	DMU_BSWAP_ZAP,		TRUE,	"DSL dataset snap map"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    73
	{	DMU_BSWAP_ZAP,		TRUE,	"DSL props"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    74
	{	DMU_BSWAP_UINT64,	TRUE,	"DSL dataset"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    75
	{	DMU_BSWAP_ZNODE,	TRUE,	"ZFS znode"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    76
	{	DMU_BSWAP_OLDACL,	TRUE,	"ZFS V0 ACL"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    77
	{	DMU_BSWAP_UINT8,	FALSE,	"ZFS plain file"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    78
	{	DMU_BSWAP_ZAP,		TRUE,	"ZFS directory"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    79
	{	DMU_BSWAP_ZAP,		TRUE,	"ZFS master node"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    80
	{	DMU_BSWAP_ZAP,		TRUE,	"ZFS delete queue"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    81
	{	DMU_BSWAP_UINT8,	FALSE,	"zvol object"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    82
	{	DMU_BSWAP_ZAP,		TRUE,	"zvol prop"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    83
	{	DMU_BSWAP_UINT8,	FALSE,	"other uint8[]"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    84
	{	DMU_BSWAP_UINT64,	FALSE,	"other uint64[]"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    85
	{	DMU_BSWAP_ZAP,		TRUE,	"other ZAP"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    86
	{	DMU_BSWAP_ZAP,		TRUE,	"persistent error log"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    87
	{	DMU_BSWAP_UINT8,	TRUE,	"SPA history"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    88
	{	DMU_BSWAP_UINT64,	TRUE,	"SPA history offsets"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    89
	{	DMU_BSWAP_ZAP,		TRUE,	"Pool properties"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    90
	{	DMU_BSWAP_ZAP,		TRUE,	"DSL permissions"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    91
	{	DMU_BSWAP_ACL,		TRUE,	"ZFS ACL"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    92
	{	DMU_BSWAP_UINT8,	TRUE,	"ZFS SYSACL"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    93
	{	DMU_BSWAP_UINT8,	TRUE,	"FUID table"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    94
	{	DMU_BSWAP_UINT64,	TRUE,	"FUID table size"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    95
	{	DMU_BSWAP_ZAP,		TRUE,	"DSL dataset next clones"},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    96
	{	DMU_BSWAP_ZAP,		TRUE,	"scan work queue"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    97
	{	DMU_BSWAP_ZAP,		TRUE,	"ZFS user/group used"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    98
	{	DMU_BSWAP_ZAP,		TRUE,	"ZFS user/group quota"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    99
	{	DMU_BSWAP_ZAP,		TRUE,	"snapshot refcount tags"},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   100
	{	DMU_BSWAP_ZAP,		TRUE,	"DDT ZAP algorithm"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   101
	{	DMU_BSWAP_ZAP,		TRUE,	"DDT statistics"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   102
	{	DMU_BSWAP_UINT8,	TRUE,	"System attributes"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   103
	{	DMU_BSWAP_ZAP,		TRUE,	"SA master node"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   104
	{	DMU_BSWAP_ZAP,		TRUE,	"SA attr registration"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   105
	{	DMU_BSWAP_ZAP,		TRUE,	"SA attr layouts"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   106
	{	DMU_BSWAP_ZAP,		TRUE,	"scan translations"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   107
	{	DMU_BSWAP_UINT8,	FALSE,	"deduplicated block"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   108
	{	DMU_BSWAP_ZAP,		TRUE,	"DSL deadlist map"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   109
	{	DMU_BSWAP_UINT64,	TRUE,	"DSL deadlist map hdr"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   110
	{	DMU_BSWAP_ZAP,		TRUE,	"DSL dir clones"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   111
	{	DMU_BSWAP_UINT64,	TRUE,	"bpobj subobj"		}
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   112
};
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   113
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   114
const dmu_object_byteswap_info_t dmu_ot_byteswap[DMU_BSWAP_NUMFUNCS] = {
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   115
	{	byteswap_uint8_array,	"uint8"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   116
	{	byteswap_uint16_array,	"uint16"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   117
	{	byteswap_uint32_array,	"uint32"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   118
	{	byteswap_uint64_array,	"uint64"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   119
	{	zap_byteswap,		"zap"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   120
	{	dnode_buf_byteswap,	"dnode"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   121
	{	dmu_objset_byteswap,	"objset"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   122
	{	zfs_znode_byteswap,	"znode"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   123
	{	zfs_oldacl_byteswap,	"oldacl"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   124
	{	zfs_acl_byteswap,	"acl"		}
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12285
diff changeset
   125
};
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   127
int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   128
dmu_buf_hold(objset_t *os, uint64_t object, uint64_t offset,
12285
d736d62dcca2 6944833 Avoid prefetching dbufs in dmu_sync() path
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 12178
diff changeset
   129
    void *tag, dmu_buf_t **dbp, int flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
	dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
	uint64_t blkid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
	dmu_buf_impl_t *db;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   134
	int err;
12285
d736d62dcca2 6944833 Avoid prefetching dbufs in dmu_sync() path
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 12178
diff changeset
   135
	int db_flags = DB_RF_CANFAIL;
d736d62dcca2 6944833 Avoid prefetching dbufs in dmu_sync() path
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 12178
diff changeset
   136
d736d62dcca2 6944833 Avoid prefetching dbufs in dmu_sync() path
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 12178
diff changeset
   137
	if (flags & DMU_READ_NO_PREFETCH)
d736d62dcca2 6944833 Avoid prefetching dbufs in dmu_sync() path
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 12178
diff changeset
   138
		db_flags |= DB_RF_NOPREFETCH;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   140
	err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   141
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   142
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
	blkid = dbuf_whichblock(dn, offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
	rw_enter(&dn->dn_struct_rwlock, RW_READER);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   145
	db = dbuf_hold(dn, blkid, tag);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
	rw_exit(&dn->dn_struct_rwlock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   147
	if (db == NULL) {
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
   148
		err = SET_ERROR(EIO);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   149
	} else {
12285
d736d62dcca2 6944833 Avoid prefetching dbufs in dmu_sync() path
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 12178
diff changeset
   150
		err = dbuf_read(db, NULL, db_flags);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   151
		if (err) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   152
			dbuf_rele(db, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   153
			db = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   154
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   155
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   156
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
	dnode_rele(dn, FTAG);
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   158
	*dbp = &db->db; /* NULL db plus first field offset is NULL */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   159
	return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
dmu_bonus_max(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   164
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   165
	return (DN_MAX_BONUSLEN);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   168
int
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   169
dmu_set_bonus(dmu_buf_t *db_fake, int newsize, dmu_tx_t *tx)
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   170
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   171
	dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   172
	dnode_t *dn;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   173
	int error;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   174
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   175
	DB_DNODE_ENTER(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   176
	dn = DB_DNODE(db);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   177
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   178
	if (dn->dn_bonus != db) {
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
   179
		error = SET_ERROR(EINVAL);
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   180
	} else if (newsize < 0 || newsize > db_fake->db_size) {
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
   181
		error = SET_ERROR(EINVAL);
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   182
	} else {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   183
		dnode_setbonuslen(dn, newsize, tx);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   184
		error = 0;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   185
	}
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   186
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   187
	DB_DNODE_EXIT(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   188
	return (error);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   189
}
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   190
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   191
int
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   192
dmu_set_bonustype(dmu_buf_t *db_fake, dmu_object_type_t type, dmu_tx_t *tx)
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   193
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   194
	dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   195
	dnode_t *dn;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   196
	int error;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   197
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   198
	DB_DNODE_ENTER(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   199
	dn = DB_DNODE(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   200
13750
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   201
	if (!DMU_OT_IS_VALID(type)) {
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
   202
		error = SET_ERROR(EINVAL);
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   203
	} else if (dn->dn_bonus != db) {
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
   204
		error = SET_ERROR(EINVAL);
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   205
	} else {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   206
		dnode_setbonus_type(dn, type, tx);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   207
		error = 0;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   208
	}
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   209
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   210
	DB_DNODE_EXIT(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   211
	return (error);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   212
}
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   213
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   214
dmu_object_type_t
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   215
dmu_get_bonustype(dmu_buf_t *db_fake)
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   216
{
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   217
	dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   218
	dnode_t *dn;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   219
	dmu_object_type_t type;
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   220
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   221
	DB_DNODE_ENTER(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   222
	dn = DB_DNODE(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   223
	type = dn->dn_bonustype;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   224
	DB_DNODE_EXIT(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   225
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   226
	return (type);
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   227
}
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   228
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   229
int
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   230
dmu_rm_spill(objset_t *os, uint64_t object, dmu_tx_t *tx)
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   231
{
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   232
	dnode_t *dn;
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   233
	int error;
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   234
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   235
	error = dnode_hold(os, object, FTAG, &dn);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   236
	dbuf_rm_spill(dn, tx);
12178
93ec1371f750 6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 12123
diff changeset
   237
	rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
93ec1371f750 6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 12123
diff changeset
   238
	dnode_rm_spill(dn, tx);
93ec1371f750 6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 12123
diff changeset
   239
	rw_exit(&dn->dn_struct_rwlock);
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   240
	dnode_rele(dn, FTAG);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   241
	return (error);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   242
}
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   243
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
/*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   245
 * returns ENOENT, EIO, or 0.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   247
int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   248
dmu_bonus_hold(objset_t *os, uint64_t object, void *tag, dmu_buf_t **dbp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   250
	dnode_t *dn;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   251
	dmu_buf_impl_t *db;
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   252
	int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   254
	error = dnode_hold(os, object, FTAG, &dn);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   255
	if (error)
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   256
		return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   257
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   258
	rw_enter(&dn->dn_struct_rwlock, RW_READER);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   259
	if (dn->dn_bonus == NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   260
		rw_exit(&dn->dn_struct_rwlock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   261
		rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   262
		if (dn->dn_bonus == NULL)
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   263
			dbuf_create_bonus(dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   264
	}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   265
	db = dn->dn_bonus;
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   266
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   267
	/* as long as the bonus buf is held, the dnode will be held */
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   268
	if (refcount_add(&db->db_holds, tag) == 1) {
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   269
		VERIFY(dnode_add_ref(dn, db));
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   270
		(void) atomic_inc_32_nv(&dn->dn_dbufs_count);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   271
	}
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   272
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   273
	/*
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   274
	 * Wait to drop dn_struct_rwlock until after adding the bonus dbuf's
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   275
	 * hold and incrementing the dbuf count to ensure that dnode_move() sees
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   276
	 * a dnode hold for every dbuf.
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   277
	 */
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   278
	rw_exit(&dn->dn_struct_rwlock);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   279
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
	dnode_rele(dn, FTAG);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   281
12285
d736d62dcca2 6944833 Avoid prefetching dbufs in dmu_sync() path
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 12178
diff changeset
   282
	VERIFY(0 == dbuf_read(db, NULL, DB_RF_MUST_SUCCEED | DB_RF_NOPREFETCH));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   283
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   284
	*dbp = &db->db;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   285
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   286
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   287
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   288
/*
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   289
 * returns ENOENT, EIO, or 0.
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   290
 *
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   291
 * This interface will allocate a blank spill dbuf when a spill blk
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   292
 * doesn't already exist on the dnode.
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   293
 *
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   294
 * if you only want to find an already existing spill db, then
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   295
 * dmu_spill_hold_existing() should be used.
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   296
 */
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   297
int
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   298
dmu_spill_hold_by_dnode(dnode_t *dn, uint32_t flags, void *tag, dmu_buf_t **dbp)
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   299
{
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   300
	dmu_buf_impl_t *db = NULL;
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   301
	int err;
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   302
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   303
	if ((flags & DB_RF_HAVESTRUCT) == 0)
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   304
		rw_enter(&dn->dn_struct_rwlock, RW_READER);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   305
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   306
	db = dbuf_hold(dn, DMU_SPILL_BLKID, tag);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   307
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   308
	if ((flags & DB_RF_HAVESTRUCT) == 0)
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   309
		rw_exit(&dn->dn_struct_rwlock);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   310
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   311
	ASSERT(db != NULL);
12493
89ce40422cea 6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents: 12470
diff changeset
   312
	err = dbuf_read(db, NULL, flags);
89ce40422cea 6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents: 12470
diff changeset
   313
	if (err == 0)
89ce40422cea 6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents: 12470
diff changeset
   314
		*dbp = &db->db;
89ce40422cea 6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents: 12470
diff changeset
   315
	else
89ce40422cea 6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents: 12470
diff changeset
   316
		dbuf_rele(db, tag);
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   317
	return (err);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   318
}
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   319
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   320
int
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   321
dmu_spill_hold_existing(dmu_buf_t *bonus, void *tag, dmu_buf_t **dbp)
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   322
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   323
	dmu_buf_impl_t *db = (dmu_buf_impl_t *)bonus;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   324
	dnode_t *dn;
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   325
	int err;
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   326
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   327
	DB_DNODE_ENTER(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   328
	dn = DB_DNODE(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   329
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   330
	if (spa_version(dn->dn_objset->os_spa) < SPA_VERSION_SA) {
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
   331
		err = SET_ERROR(EINVAL);
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   332
	} else {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   333
		rw_enter(&dn->dn_struct_rwlock, RW_READER);
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   334
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   335
		if (!dn->dn_have_spill) {
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
   336
			err = SET_ERROR(ENOENT);
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   337
		} else {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   338
			err = dmu_spill_hold_by_dnode(dn,
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   339
			    DB_RF_HAVESTRUCT | DB_RF_CANFAIL, tag, dbp);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   340
		}
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   341
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   342
		rw_exit(&dn->dn_struct_rwlock);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   343
	}
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   344
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   345
	DB_DNODE_EXIT(db);
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   346
	return (err);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   347
}
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   348
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   349
int
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   350
dmu_spill_hold_by_bonus(dmu_buf_t *bonus, void *tag, dmu_buf_t **dbp)
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   351
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   352
	dmu_buf_impl_t *db = (dmu_buf_impl_t *)bonus;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   353
	dnode_t *dn;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   354
	int err;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   355
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   356
	DB_DNODE_ENTER(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   357
	dn = DB_DNODE(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   358
	err = dmu_spill_hold_by_dnode(dn, DB_RF_CANFAIL, tag, dbp);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   359
	DB_DNODE_EXIT(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   360
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   361
	return (err);
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   362
}
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   363
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   364
/*
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   365
 * Note: longer-term, we should modify all of the dmu_buf_*() interfaces
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   366
 * to take a held dnode rather than <os, object> -- the lookup is wasteful,
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   367
 * and can induce severe lock contention when writing to several files
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   368
 * whose dnodes are in the same block.
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   369
 */
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   370
static int
9512
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9412
diff changeset
   371
dmu_buf_hold_array_by_dnode(dnode_t *dn, uint64_t offset, uint64_t length,
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9412
diff changeset
   372
    int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp, uint32_t flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   373
{
7468
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   374
	dsl_pool_t *dp = NULL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   375
	dmu_buf_t **dbp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   376
	uint64_t blkid, nblks, i;
9512
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9412
diff changeset
   377
	uint32_t dbuf_flags;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   378
	int err;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   379
	zio_t *zio;
7468
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   380
	hrtime_t start;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   381
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   382
	ASSERT(length <= DMU_MAX_ACCESS);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   383
10209
91f47f0e7728 6830541 zfs_get_data trips on a verify
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9951
diff changeset
   384
	dbuf_flags = DB_RF_CANFAIL | DB_RF_NEVERWAIT | DB_RF_HAVESTRUCT;
9512
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9412
diff changeset
   385
	if (flags & DMU_READ_NO_PREFETCH || length > zfetch_array_rd_sz)
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9412
diff changeset
   386
		dbuf_flags |= DB_RF_NOPREFETCH;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   387
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   388
	rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   389
	if (dn->dn_datablkshift) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   390
		int blkshift = dn->dn_datablkshift;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   391
		nblks = (P2ROUNDUP(offset+length, 1ULL<<blkshift) -
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3835
diff changeset
   392
		    P2ALIGN(offset, 1ULL<<blkshift)) >> blkshift;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   393
	} else {
3713
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   394
		if (offset + length > dn->dn_datablksz) {
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   395
			zfs_panic_recover("zfs: accessing past end of object "
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   396
			    "%llx/%llx (size=%u access=%llu+%llu)",
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   397
			    (longlong_t)dn->dn_objset->
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   398
			    os_dsl_dataset->ds_object,
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   399
			    (longlong_t)dn->dn_object, dn->dn_datablksz,
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   400
			    (longlong_t)offset, (longlong_t)length);
10209
91f47f0e7728 6830541 zfs_get_data trips on a verify
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9951
diff changeset
   401
			rw_exit(&dn->dn_struct_rwlock);
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
   402
			return (SET_ERROR(EIO));
3713
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   403
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   404
		nblks = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   405
	}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   406
	dbp = kmem_zalloc(sizeof (dmu_buf_t *) * nblks, KM_SLEEP);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   407
7468
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   408
	if (dn->dn_objset->os_dsl_dataset)
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   409
		dp = dn->dn_objset->os_dsl_dataset->ds_dir->dd_pool;
14024
7a22d0770fc8 3522 zfs module should not allow uninitialized variables
George Wilson <george.wilson@delphix.com>
parents: 13952
diff changeset
   410
	start = gethrtime();
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
   411
	zio = zio_root(dn->dn_objset->os_spa, NULL, NULL, ZIO_FLAG_CANFAIL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   412
	blkid = dbuf_whichblock(dn, offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   413
	for (i = 0; i < nblks; i++) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   414
		dmu_buf_impl_t *db = dbuf_hold(dn, blkid+i, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   415
		if (db == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   416
			rw_exit(&dn->dn_struct_rwlock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   417
			dmu_buf_rele_array(dbp, nblks, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   418
			zio_nowait(zio);
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
   419
			return (SET_ERROR(EIO));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   420
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   421
		/* initiate async i/o */
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   422
		if (read) {
9512
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9412
diff changeset
   423
			(void) dbuf_read(db, zio, dbuf_flags);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   424
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   425
		dbp[i] = &db->db;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   426
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   427
	rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   428
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   429
	/* wait for async i/o */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   430
	err = zio_wait(zio);
7468
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   431
	/* track read overhead when we are in sync context */
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   432
	if (dp && dsl_pool_sync_context(dp))
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   433
		dp->dp_read_overhead += gethrtime() - start;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   434
	if (err) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   435
		dmu_buf_rele_array(dbp, nblks, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   436
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   437
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   438
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   439
	/* wait for other io to complete */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   440
	if (read) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   441
		for (i = 0; i < nblks; i++) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   442
			dmu_buf_impl_t *db = (dmu_buf_impl_t *)dbp[i];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   443
			mutex_enter(&db->db_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   444
			while (db->db_state == DB_READ ||
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   445
			    db->db_state == DB_FILL)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   446
				cv_wait(&db->db_changed, &db->db_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   447
			if (db->db_state == DB_UNCACHED)
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
   448
				err = SET_ERROR(EIO);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   449
			mutex_exit(&db->db_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   450
			if (err) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   451
				dmu_buf_rele_array(dbp, nblks, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   452
				return (err);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   453
			}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   454
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   455
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   456
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   457
	*numbufsp = nblks;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   458
	*dbpp = dbp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   459
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   460
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   461
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
   462
static int
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   463
dmu_buf_hold_array(objset_t *os, uint64_t object, uint64_t offset,
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   464
    uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   465
{
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   466
	dnode_t *dn;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   467
	int err;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   468
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   469
	err = dnode_hold(os, object, FTAG, &dn);
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   470
	if (err)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   471
		return (err);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   472
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   473
	err = dmu_buf_hold_array_by_dnode(dn, offset, length, read, tag,
9512
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9412
diff changeset
   474
	    numbufsp, dbpp, DMU_READ_PREFETCH);
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   475
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   476
	dnode_rele(dn, FTAG);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   477
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   478
	return (err);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   479
}
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   480
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   481
int
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   482
dmu_buf_hold_array_by_bonus(dmu_buf_t *db_fake, uint64_t offset,
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   483
    uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   484
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   485
	dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   486
	dnode_t *dn;
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   487
	int err;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   488
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   489
	DB_DNODE_ENTER(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   490
	dn = DB_DNODE(db);
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   491
	err = dmu_buf_hold_array_by_dnode(dn, offset, length, read, tag,
9512
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9412
diff changeset
   492
	    numbufsp, dbpp, DMU_READ_PREFETCH);
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   493
	DB_DNODE_EXIT(db);
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   494
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   495
	return (err);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   496
}
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   497
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   498
void
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   499
dmu_buf_rele_array(dmu_buf_t **dbp_fake, int numbufs, void *tag)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   500
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   501
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   502
	dmu_buf_impl_t **dbp = (dmu_buf_impl_t **)dbp_fake;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   503
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   504
	if (numbufs == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   505
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   506
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   507
	for (i = 0; i < numbufs; i++) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   508
		if (dbp[i])
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   509
			dbuf_rele(dbp[i], tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   510
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   511
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   512
	kmem_free(dbp, sizeof (dmu_buf_t *) * numbufs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   513
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   514
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   515
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   516
dmu_prefetch(objset_t *os, uint64_t object, uint64_t offset, uint64_t len)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   517
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   518
	dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   519
	uint64_t blkid;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   520
	int nblks, i, err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   521
2986
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
   522
	if (zfs_prefetch_disable)
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
   523
		return;
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
   524
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   525
	if (len == 0) {  /* they're interested in the bonus buffer */
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   526
		dn = DMU_META_DNODE(os);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   527
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   528
		if (object == 0 || object >= DN_MAX_OBJECT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   529
			return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   530
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   531
		rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   532
		blkid = dbuf_whichblock(dn, object * sizeof (dnode_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   533
		dbuf_prefetch(dn, blkid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   534
		rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   535
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   536
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   537
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   538
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   539
	 * XXX - Note, if the dnode for the requested object is not
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   540
	 * already cached, we will do a *synchronous* read in the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   541
	 * dnode_hold() call.  The same is true for any indirects.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   542
	 */
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   543
	err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   544
	if (err != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   545
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   546
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   547
	rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   548
	if (dn->dn_datablkshift) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   549
		int blkshift = dn->dn_datablkshift;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   550
		nblks = (P2ROUNDUP(offset+len, 1<<blkshift) -
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3835
diff changeset
   551
		    P2ALIGN(offset, 1<<blkshift)) >> blkshift;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   552
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   553
		nblks = (offset < dn->dn_datablksz);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   554
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   555
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   556
	if (nblks != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   557
		blkid = dbuf_whichblock(dn, offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   558
		for (i = 0; i < nblks; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   559
			dbuf_prefetch(dn, blkid+i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   560
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   561
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   562
	rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   563
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   564
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   565
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   566
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   567
/*
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   568
 * Get the next "chunk" of file data to free.  We traverse the file from
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   569
 * the end so that the file gets shorter over time (if we crashes in the
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   570
 * middle, this will leave us in a better state).  We find allocated file
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   571
 * data by simply searching the allocated level 1 indirects.
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   572
 *
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   573
 * On input, *start should be the first offset that does not need to be
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   574
 * freed (e.g. "offset + length").  On return, *start will be the first
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   575
 * offset that should be freed.
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   576
 */
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   577
static int
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   578
get_next_chunk(dnode_t *dn, uint64_t *start, uint64_t minimum)
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   579
{
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   580
	uint64_t maxblks = DMU_MAX_ACCESS >> (dn->dn_indblkshift + 1);
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   581
	/* bytes of data covered by a level-1 indirect block */
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   582
	uint64_t iblkrange =
7385
f69ff8507427 6727817 ZFS assertion failure (zero length arc_buf_alloc) during NFS I/O
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7315
diff changeset
   583
	    dn->dn_datablksz * EPB(dn->dn_indblkshift, SPA_BLKPTRSHIFT);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   584
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   585
	ASSERT3U(minimum, <=, *start);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   586
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   587
	if (*start - minimum <= iblkrange * maxblks) {
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   588
		*start = minimum;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   589
		return (0);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   590
	}
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   591
	ASSERT(ISP2(iblkrange));
7385
f69ff8507427 6727817 ZFS assertion failure (zero length arc_buf_alloc) during NFS I/O
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7315
diff changeset
   592
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   593
	for (uint64_t blks = 0; *start > minimum && blks < maxblks; blks++) {
7385
f69ff8507427 6727817 ZFS assertion failure (zero length arc_buf_alloc) during NFS I/O
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7315
diff changeset
   594
		int err;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   595
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   596
		/*
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   597
		 * dnode_next_offset(BACKWARDS) will find an allocated L1
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   598
		 * indirect block at or before the input offset.  We must
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   599
		 * decrement *start so that it is at the end of the region
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   600
		 * to search.
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   601
		 */
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   602
		(*start)--;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   603
		err = dnode_next_offset(dn,
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   604
		    DNODE_FIND_BACKWARDS, start, 2, 1, 0);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   605
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   606
		/* if there are no indirect blocks before start, we are done */
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   607
		if (err == ESRCH) {
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   608
			*start = minimum;
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   609
			break;
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   610
		} else if (err != 0) {
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   611
			return (err);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   612
		}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   613
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   614
		/* set start to the beginning of this L1 indirect */
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   615
		*start = P2ALIGN(*start, iblkrange);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   616
	}
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   617
	if (*start < minimum)
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   618
		*start = minimum;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   619
	return (0);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   620
}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   621
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   622
static int
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   623
dmu_free_long_range_impl(objset_t *os, dnode_t *dn, uint64_t offset,
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   624
    uint64_t length)
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   625
{
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   626
	uint64_t object_size = (dn->dn_maxblkid + 1) * dn->dn_datablksz;
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   627
	int err;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   628
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   629
	if (offset >= object_size)
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   630
		return (0);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   631
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   632
	if (length == DMU_OBJECT_END || offset + length > object_size)
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   633
		length = object_size - offset;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   634
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   635
	while (length != 0) {
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   636
		uint64_t chunk_end, chunk_begin;
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   637
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   638
		chunk_end = chunk_begin = offset + length;
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   639
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   640
		/* move chunk_begin backwards to the beginning of this chunk */
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   641
		err = get_next_chunk(dn, &chunk_begin, offset);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   642
		if (err)
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   643
			return (err);
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   644
		ASSERT3U(chunk_begin, >=, offset);
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   645
		ASSERT3U(chunk_begin, <=, chunk_end);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   646
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   647
		dmu_tx_t *tx = dmu_tx_create(os);
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   648
		dmu_tx_hold_free(tx, dn->dn_object,
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   649
		    chunk_begin, chunk_end - chunk_begin);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   650
		err = dmu_tx_assign(tx, TXG_WAIT);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   651
		if (err) {
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   652
			dmu_tx_abort(tx);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   653
			return (err);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   654
		}
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   655
		dnode_free_range(dn, chunk_begin, chunk_end - chunk_begin, tx);
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   656
		dmu_tx_commit(tx);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   657
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   658
		length -= chunk_end - chunk_begin;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   659
	}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   660
	return (0);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   661
}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   662
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   663
int
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   664
dmu_free_long_range(objset_t *os, uint64_t object,
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   665
    uint64_t offset, uint64_t length)
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   666
{
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   667
	dnode_t *dn;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   668
	int err;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   669
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   670
	err = dnode_hold(os, object, FTAG, &dn);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   671
	if (err != 0)
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   672
		return (err);
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   673
	err = dmu_free_long_range_impl(os, dn, offset, length);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   674
	dnode_rele(dn, FTAG);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   675
	return (err);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   676
}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   677
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   678
int
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   679
dmu_free_long_object(objset_t *os, uint64_t object)
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   680
{
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   681
	dmu_tx_t *tx;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   682
	int err;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   683
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   684
	err = dmu_free_long_range(os, object, 0, DMU_OBJECT_END);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   685
	if (err != 0)
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   686
		return (err);
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   687
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   688
	tx = dmu_tx_create(os);
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   689
	dmu_tx_hold_bonus(tx, object);
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   690
	dmu_tx_hold_free(tx, object, 0, DMU_OBJECT_END);
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   691
	err = dmu_tx_assign(tx, TXG_WAIT);
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   692
	if (err == 0) {
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   693
		err = dmu_object_free(os, object, tx);
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   694
		dmu_tx_commit(tx);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   695
	} else {
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   696
		dmu_tx_abort(tx);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   697
	}
14234
189ec27885ae 4047 panic from dbuf_free_range() from dmu_free_object() while doing zfs receive
Matthew Ahrens <mahrens@delphix.com>
parents: 14121
diff changeset
   698
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   699
	return (err);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   700
}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   701
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   702
int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   703
dmu_free_range(objset_t *os, uint64_t object, uint64_t offset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   704
    uint64_t size, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   705
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   706
	dnode_t *dn;
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   707
	int err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   708
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   709
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   710
	ASSERT(offset < UINT64_MAX);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   711
	ASSERT(size == -1ULL || size <= UINT64_MAX - offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   712
	dnode_free_range(dn, offset, size, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   713
	dnode_rele(dn, FTAG);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   714
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   715
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   716
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   717
int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   718
dmu_read(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
9512
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9412
diff changeset
   719
    void *buf, uint32_t flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   720
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   721
	dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   722
	dmu_buf_t **dbp;
10209
91f47f0e7728 6830541 zfs_get_data trips on a verify
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9951
diff changeset
   723
	int numbufs, err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   724
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   725
	err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   726
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   727
		return (err);
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   728
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   729
	/*
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   730
	 * Deal with odd block sizes, where there can't be data past the first
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   731
	 * block.  If we ever do the tail block optimization, we will need to
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   732
	 * handle that here as well.
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   733
	 */
10209
91f47f0e7728 6830541 zfs_get_data trips on a verify
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9951
diff changeset
   734
	if (dn->dn_maxblkid == 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   735
		int newsz = offset > dn->dn_datablksz ? 0 :
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   736
		    MIN(size, dn->dn_datablksz - offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   737
		bzero((char *)buf + newsz, size - newsz);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   738
		size = newsz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   739
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   740
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   741
	while (size > 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   742
		uint64_t mylen = MIN(size, DMU_MAX_ACCESS / 2);
10209
91f47f0e7728 6830541 zfs_get_data trips on a verify
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9951
diff changeset
   743
		int i;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   744
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   745
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   746
		 * NB: we could do this block-at-a-time, but it's nice
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   747
		 * to be reading in parallel.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   748
		 */
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
   749
		err = dmu_buf_hold_array_by_dnode(dn, offset, mylen,
9512
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9412
diff changeset
   750
		    TRUE, FTAG, &numbufs, &dbp, flags);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   751
		if (err)
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   752
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   753
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   754
		for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   755
			int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   756
			int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   757
			dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   758
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   759
			ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   760
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   761
			bufoff = offset - db->db_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   762
			tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   763
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   764
			bcopy((char *)db->db_data + bufoff, buf, tocpy);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   765
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   766
			offset += tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   767
			size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   768
			buf = (char *)buf + tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   769
		}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   770
		dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   771
	}
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
   772
	dnode_rele(dn, FTAG);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   773
	return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   774
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   775
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   776
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   777
dmu_write(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   778
    const void *buf, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   779
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   780
	dmu_buf_t **dbp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   781
	int numbufs, i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   782
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   783
	if (size == 0)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   784
		return;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   785
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   786
	VERIFY(0 == dmu_buf_hold_array(os, object, offset, size,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   787
	    FALSE, FTAG, &numbufs, &dbp));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   788
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   789
	for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   790
		int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   791
		int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   792
		dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   793
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   794
		ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   795
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   796
		bufoff = offset - db->db_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   797
		tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   798
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   799
		ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   800
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   801
		if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   802
			dmu_buf_will_fill(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   803
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   804
			dmu_buf_will_dirty(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   805
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   806
		bcopy(buf, (char *)db->db_data + bufoff, tocpy);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   807
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   808
		if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   809
			dmu_buf_fill_done(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   810
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   811
		offset += tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   812
		size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   813
		buf = (char *)buf + tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   814
	}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   815
	dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   816
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   817
7872
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   818
void
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   819
dmu_prealloc(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   820
    dmu_tx_t *tx)
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   821
{
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   822
	dmu_buf_t **dbp;
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   823
	int numbufs, i;
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   824
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   825
	if (size == 0)
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   826
		return;
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   827
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   828
	VERIFY(0 == dmu_buf_hold_array(os, object, offset, size,
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   829
	    FALSE, FTAG, &numbufs, &dbp));
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   830
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   831
	for (i = 0; i < numbufs; i++) {
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   832
		dmu_buf_t *db = dbp[i];
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   833
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   834
		dmu_buf_will_not_fill(db, tx);
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   835
	}
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   836
	dmu_buf_rele_array(dbp, numbufs, FTAG);
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   837
}
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   838
11539
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   839
/*
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   840
 * DMU support for xuio
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   841
 */
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   842
kstat_t *xuio_ksp = NULL;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   843
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   844
int
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   845
dmu_xuio_init(xuio_t *xuio, int nblk)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   846
{
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   847
	dmu_xuio_t *priv;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   848
	uio_t *uio = &xuio->xu_uio;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   849
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   850
	uio->uio_iovcnt = nblk;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   851
	uio->uio_iov = kmem_zalloc(nblk * sizeof (iovec_t), KM_SLEEP);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   852
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   853
	priv = kmem_zalloc(sizeof (dmu_xuio_t), KM_SLEEP);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   854
	priv->cnt = nblk;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   855
	priv->bufs = kmem_zalloc(nblk * sizeof (arc_buf_t *), KM_SLEEP);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   856
	priv->iovp = uio->uio_iov;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   857
	XUIO_XUZC_PRIV(xuio) = priv;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   858
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   859
	if (XUIO_XUZC_RW(xuio) == UIO_READ)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   860
		XUIOSTAT_INCR(xuiostat_onloan_rbuf, nblk);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   861
	else
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   862
		XUIOSTAT_INCR(xuiostat_onloan_wbuf, nblk);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   863
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   864
	return (0);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   865
}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   866
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   867
void
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   868
dmu_xuio_fini(xuio_t *xuio)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   869
{
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   870
	dmu_xuio_t *priv = XUIO_XUZC_PRIV(xuio);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   871
	int nblk = priv->cnt;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   872
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   873
	kmem_free(priv->iovp, nblk * sizeof (iovec_t));
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   874
	kmem_free(priv->bufs, nblk * sizeof (arc_buf_t *));
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   875
	kmem_free(priv, sizeof (dmu_xuio_t));
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   876
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   877
	if (XUIO_XUZC_RW(xuio) == UIO_READ)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   878
		XUIOSTAT_INCR(xuiostat_onloan_rbuf, -nblk);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   879
	else
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   880
		XUIOSTAT_INCR(xuiostat_onloan_wbuf, -nblk);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   881
}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   882
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   883
/*
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   884
 * Initialize iov[priv->next] and priv->bufs[priv->next] with { off, n, abuf }
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   885
 * and increase priv->next by 1.
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   886
 */
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   887
int
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   888
dmu_xuio_add(xuio_t *xuio, arc_buf_t *abuf, offset_t off, size_t n)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   889
{
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   890
	struct iovec *iov;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   891
	uio_t *uio = &xuio->xu_uio;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   892
	dmu_xuio_t *priv = XUIO_XUZC_PRIV(xuio);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   893
	int i = priv->next++;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   894
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   895
	ASSERT(i < priv->cnt);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   896
	ASSERT(off + n <= arc_buf_size(abuf));
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   897
	iov = uio->uio_iov + i;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   898
	iov->iov_base = (char *)abuf->b_data + off;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   899
	iov->iov_len = n;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   900
	priv->bufs[i] = abuf;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   901
	return (0);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   902
}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   903
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   904
int
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   905
dmu_xuio_cnt(xuio_t *xuio)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   906
{
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   907
	dmu_xuio_t *priv = XUIO_XUZC_PRIV(xuio);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   908
	return (priv->cnt);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   909
}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   910
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   911
arc_buf_t *
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   912
dmu_xuio_arcbuf(xuio_t *xuio, int i)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   913
{
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   914
	dmu_xuio_t *priv = XUIO_XUZC_PRIV(xuio);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   915
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   916
	ASSERT(i < priv->cnt);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   917
	return (priv->bufs[i]);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   918
}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   919
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   920
void
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   921
dmu_xuio_clear(xuio_t *xuio, int i)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   922
{
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   923
	dmu_xuio_t *priv = XUIO_XUZC_PRIV(xuio);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   924
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   925
	ASSERT(i < priv->cnt);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   926
	priv->bufs[i] = NULL;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   927
}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   928
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   929
static void
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   930
xuio_stat_init(void)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   931
{
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   932
	xuio_ksp = kstat_create("zfs", 0, "xuio_stats", "misc",
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   933
	    KSTAT_TYPE_NAMED, sizeof (xuio_stats) / sizeof (kstat_named_t),
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   934
	    KSTAT_FLAG_VIRTUAL);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   935
	if (xuio_ksp != NULL) {
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   936
		xuio_ksp->ks_data = &xuio_stats;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   937
		kstat_install(xuio_ksp);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   938
	}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   939
}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   940
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   941
static void
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   942
xuio_stat_fini(void)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   943
{
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   944
	if (xuio_ksp != NULL) {
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   945
		kstat_delete(xuio_ksp);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   946
		xuio_ksp = NULL;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   947
	}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   948
}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   949
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   950
void
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   951
xuio_stat_wbuf_copied()
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   952
{
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   953
	XUIOSTAT_BUMP(xuiostat_wbuf_copied);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   954
}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   955
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   956
void
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   957
xuio_stat_wbuf_nocopy()
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   958
{
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   959
	XUIOSTAT_BUMP(xuiostat_wbuf_nocopy);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   960
}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   961
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   962
#ifdef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   963
int
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   964
dmu_read_uio(objset_t *os, uint64_t object, uio_t *uio, uint64_t size)
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   965
{
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   966
	dmu_buf_t **dbp;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   967
	int numbufs, i, err;
11539
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   968
	xuio_t *xuio = NULL;
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   969
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   970
	/*
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   971
	 * NB: we could do this block-at-a-time, but it's nice
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   972
	 * to be reading in parallel.
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   973
	 */
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   974
	err = dmu_buf_hold_array(os, object, uio->uio_loffset, size, TRUE, FTAG,
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   975
	    &numbufs, &dbp);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   976
	if (err)
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   977
		return (err);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   978
11539
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   979
	if (uio->uio_extflg == UIO_XUIO)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   980
		xuio = (xuio_t *)uio;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   981
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   982
	for (i = 0; i < numbufs; i++) {
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   983
		int tocpy;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   984
		int bufoff;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   985
		dmu_buf_t *db = dbp[i];
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   986
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   987
		ASSERT(size > 0);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   988
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   989
		bufoff = uio->uio_loffset - db->db_offset;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   990
		tocpy = (int)MIN(db->db_size - bufoff, size);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   991
11539
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   992
		if (xuio) {
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   993
			dmu_buf_impl_t *dbi = (dmu_buf_impl_t *)db;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   994
			arc_buf_t *dbuf_abuf = dbi->db_buf;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   995
			arc_buf_t *abuf = dbuf_loan_arcbuf(dbi);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   996
			err = dmu_xuio_add(xuio, abuf, bufoff, tocpy);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   997
			if (!err) {
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   998
				uio->uio_resid -= tocpy;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
   999
				uio->uio_loffset += tocpy;
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1000
			}
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1001
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1002
			if (abuf == dbuf_abuf)
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1003
				XUIOSTAT_BUMP(xuiostat_rbuf_nocopy);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1004
			else
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1005
				XUIOSTAT_BUMP(xuiostat_rbuf_copied);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1006
		} else {
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1007
			err = uiomove((char *)db->db_data + bufoff, tocpy,
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1008
			    UIO_READ, uio);
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1009
		}
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1010
		if (err)
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1011
			break;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1012
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1013
		size -= tocpy;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1014
	}
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1015
	dmu_buf_rele_array(dbp, numbufs, FTAG);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1016
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1017
	return (err);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1018
}
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1019
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1020
static int
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1021
dmu_write_uio_dnode(dnode_t *dn, uio_t *uio, uint64_t size, dmu_tx_t *tx)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1022
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1023
	dmu_buf_t **dbp;
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1024
	int numbufs;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1025
	int err = 0;
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1026
	int i;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1027
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1028
	err = dmu_buf_hold_array_by_dnode(dn, uio->uio_loffset, size,
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1029
	    FALSE, FTAG, &numbufs, &dbp, DMU_READ_PREFETCH);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1030
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1031
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1032
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1033
	for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1034
		int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1035
		int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1036
		dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1037
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1038
		ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1039
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1040
		bufoff = uio->uio_loffset - db->db_offset;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1041
		tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1042
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1043
		ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1044
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1045
		if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1046
			dmu_buf_will_fill(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1047
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1048
			dmu_buf_will_dirty(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1049
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1050
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1051
		 * XXX uiomove could block forever (eg. nfs-backed
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1052
		 * pages).  There needs to be a uiolockdown() function
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1053
		 * to lock the pages in memory, so that uiomove won't
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1054
		 * block.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1055
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1056
		err = uiomove((char *)db->db_data + bufoff, tocpy,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1057
		    UIO_WRITE, uio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1058
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1059
		if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1060
			dmu_buf_fill_done(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1061
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1062
		if (err)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1063
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1064
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1065
		size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1066
	}
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1067
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1068
	dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1069
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1070
}
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1071
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1072
int
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1073
dmu_write_uio_dbuf(dmu_buf_t *zdb, uio_t *uio, uint64_t size,
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1074
    dmu_tx_t *tx)
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1075
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1076
	dmu_buf_impl_t *db = (dmu_buf_impl_t *)zdb;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1077
	dnode_t *dn;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1078
	int err;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1079
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1080
	if (size == 0)
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1081
		return (0);
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1082
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1083
	DB_DNODE_ENTER(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1084
	dn = DB_DNODE(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1085
	err = dmu_write_uio_dnode(dn, uio, size, tx);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1086
	DB_DNODE_EXIT(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1087
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1088
	return (err);
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1089
}
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1090
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1091
int
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1092
dmu_write_uio(objset_t *os, uint64_t object, uio_t *uio, uint64_t size,
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1093
    dmu_tx_t *tx)
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1094
{
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1095
	dnode_t *dn;
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1096
	int err;
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1097
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1098
	if (size == 0)
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1099
		return (0);
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1100
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1101
	err = dnode_hold(os, object, FTAG, &dn);
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1102
	if (err)
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1103
		return (err);
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1104
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1105
	err = dmu_write_uio_dnode(dn, uio, size, tx);
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1106
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1107
	dnode_rele(dn, FTAG);
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1108
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1109
	return (err);
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1110
}
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1111
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1112
int
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1113
dmu_write_pages(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1114
    page_t *pp, dmu_tx_t *tx)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1115
{
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1116
	dmu_buf_t **dbp;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1117
	int numbufs, i;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1118
	int err;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1119
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1120
	if (size == 0)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1121
		return (0);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1122
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1123
	err = dmu_buf_hold_array(os, object, offset, size,
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1124
	    FALSE, FTAG, &numbufs, &dbp);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1125
	if (err)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1126
		return (err);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1127
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1128
	for (i = 0; i < numbufs; i++) {
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1129
		int tocpy, copied, thiscpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1130
		int bufoff;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1131
		dmu_buf_t *db = dbp[i];
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1132
		caddr_t va;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1133
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1134
		ASSERT(size > 0);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1135
		ASSERT3U(db->db_size, >=, PAGESIZE);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1136
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1137
		bufoff = offset - db->db_offset;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1138
		tocpy = (int)MIN(db->db_size - bufoff, size);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1139
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1140
		ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1141
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1142
		if (tocpy == db->db_size)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1143
			dmu_buf_will_fill(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1144
		else
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1145
			dmu_buf_will_dirty(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1146
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1147
		for (copied = 0; copied < tocpy; copied += PAGESIZE) {
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1148
			ASSERT3U(pp->p_offset, ==, db->db_offset + bufoff);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1149
			thiscpy = MIN(PAGESIZE, tocpy - copied);
7315
cdba25672122 6735592 "zio" vmem arenas are confusing, not reported separately
Jonathan W Adams <Jonathan.Adams@Sun.COM>
parents: 7237
diff changeset
  1150
			va = zfs_map_page(pp, S_READ);
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1151
			bcopy(va, (char *)db->db_data + bufoff, thiscpy);
7315
cdba25672122 6735592 "zio" vmem arenas are confusing, not reported separately
Jonathan W Adams <Jonathan.Adams@Sun.COM>
parents: 7237
diff changeset
  1152
			zfs_unmap_page(pp, va);
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1153
			pp = pp->p_next;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1154
			bufoff += PAGESIZE;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1155
		}
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1156
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1157
		if (tocpy == db->db_size)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1158
			dmu_buf_fill_done(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1159
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1160
		offset += tocpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1161
		size -= tocpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1162
	}
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1163
	dmu_buf_rele_array(dbp, numbufs, FTAG);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1164
	return (err);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1165
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1166
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1167
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1168
/*
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1169
 * Allocate a loaned anonymous arc buffer.
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1170
 */
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1171
arc_buf_t *
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1172
dmu_request_arcbuf(dmu_buf_t *handle, int size)
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1173
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1174
	dmu_buf_impl_t *db = (dmu_buf_impl_t *)handle;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1175
	spa_t *spa;
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1176
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1177
	DB_GET_SPA(&spa, db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1178
	return (arc_loan_buf(spa, size));
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1179
}
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1180
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1181
/*
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1182
 * Free a loaned arc buffer.
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1183
 */
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1184
void
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1185
dmu_return_arcbuf(arc_buf_t *buf)
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1186
{
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1187
	arc_return_buf(buf, FTAG);
14046
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents: 14024
diff changeset
  1188
	VERIFY(arc_buf_remove_ref(buf, FTAG));
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1189
}
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1190
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1191
/*
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1192
 * When possible directly assign passed loaned arc buffer to a dbuf.
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1193
 * If this is not possible copy the contents of passed arc buf via
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1194
 * dmu_write().
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1195
 */
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1196
void
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1197
dmu_assign_arcbuf(dmu_buf_t *handle, uint64_t offset, arc_buf_t *buf,
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1198
    dmu_tx_t *tx)
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1199
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1200
	dmu_buf_impl_t *dbuf = (dmu_buf_impl_t *)handle;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1201
	dnode_t *dn;
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1202
	dmu_buf_impl_t *db;
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1203
	uint32_t blksz = (uint32_t)arc_buf_size(buf);
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1204
	uint64_t blkid;
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1205
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1206
	DB_DNODE_ENTER(dbuf);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1207
	dn = DB_DNODE(dbuf);
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1208
	rw_enter(&dn->dn_struct_rwlock, RW_READER);
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1209
	blkid = dbuf_whichblock(dn, offset);
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1210
	VERIFY((db = dbuf_hold(dn, blkid, FTAG)) != NULL);
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1211
	rw_exit(&dn->dn_struct_rwlock);
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1212
	DB_DNODE_EXIT(dbuf);
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1213
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1214
	if (offset == db->db.db_offset && blksz == db->db.db_size) {
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1215
		dbuf_assign_arcbuf(db, buf, tx);
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1216
		dbuf_rele(db, FTAG);
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1217
	} else {
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1218
		objset_t *os;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1219
		uint64_t object;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1220
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1221
		DB_DNODE_ENTER(dbuf);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1222
		dn = DB_DNODE(dbuf);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1223
		os = dn->dn_objset;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1224
		object = dn->dn_object;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1225
		DB_DNODE_EXIT(dbuf);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1226
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1227
		dbuf_rele(db, FTAG);
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1228
		dmu_write(os, object, offset, blksz, buf->b_data, tx);
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1229
		dmu_return_arcbuf(buf);
11539
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1230
		XUIOSTAT_BUMP(xuiostat_wbuf_copied);
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1231
	}
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1232
}
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1233
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1234
typedef struct {
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1235
	dbuf_dirty_record_t	*dsa_dr;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1236
	dmu_sync_cb_t		*dsa_done;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1237
	zgd_t			*dsa_zgd;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1238
	dmu_tx_t		*dsa_tx;
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1239
} dmu_sync_arg_t;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1240
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1241
/* ARGSUSED */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1242
static void
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1243
dmu_sync_ready(zio_t *zio, arc_buf_t *buf, void *varg)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1244
{
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1245
	dmu_sync_arg_t *dsa = varg;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1246
	dmu_buf_t *db = dsa->dsa_zgd->zgd_db;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1247
	blkptr_t *bp = zio->io_bp;
10800
469478b180d9 6880764 fsync on zfs is broken if writes are greater than 32kb on a hard crash and no log attached
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 10474
diff changeset
  1248
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1249
	if (zio->io_error == 0) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1250
		if (BP_IS_HOLE(bp)) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1251
			/*
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1252
			 * A block of zeros may compress to a hole, but the
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1253
			 * block size still needs to be known for replay.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1254
			 */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1255
			BP_SET_LSIZE(bp, db->db_size);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1256
		} else {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1257
			ASSERT(BP_GET_LEVEL(bp) == 0);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1258
			bp->blk_fill = 1;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1259
		}
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1260
	}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1261
}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1262
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1263
static void
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1264
dmu_sync_late_arrival_ready(zio_t *zio)
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1265
{
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1266
	dmu_sync_ready(zio, NULL, zio->io_private);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1267
}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1268
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1269
/* ARGSUSED */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1270
static void
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1271
dmu_sync_done(zio_t *zio, arc_buf_t *buf, void *varg)
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1272
{
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1273
	dmu_sync_arg_t *dsa = varg;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1274
	dbuf_dirty_record_t *dr = dsa->dsa_dr;
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1275
	dmu_buf_impl_t *db = dr->dr_dbuf;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1276
10810
b6b161a6ae4a 6892298 buf->b_hdr->b_state != arc_anon, file: ../../common/fs/zfs/arc.c, line: 2849
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 10800
diff changeset
  1277
	mutex_enter(&db->db_mtx);
b6b161a6ae4a 6892298 buf->b_hdr->b_state != arc_anon, file: ../../common/fs/zfs/arc.c, line: 2849
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 10800
diff changeset
  1278
	ASSERT(dr->dt.dl.dr_override_state == DR_IN_DMU_SYNC);
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1279
	if (zio->io_error == 0) {
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1280
		dr->dt.dl.dr_nopwrite = !!(zio->io_flags & ZIO_FLAG_NOPWRITE);
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1281
		if (dr->dt.dl.dr_nopwrite) {
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1282
			blkptr_t *bp = zio->io_bp;
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1283
			blkptr_t *bp_orig = &zio->io_bp_orig;
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1284
			uint8_t chksum = BP_GET_CHECKSUM(bp_orig);
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1285
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1286
			ASSERT(BP_EQUAL(bp, bp_orig));
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1287
			ASSERT(zio->io_prop.zp_compress != ZIO_COMPRESS_OFF);
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1288
			ASSERT(zio_checksum_table[chksum].ci_dedup);
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1289
		}
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1290
		dr->dt.dl.dr_overridden_by = *zio->io_bp;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1291
		dr->dt.dl.dr_override_state = DR_OVERRIDDEN;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1292
		dr->dt.dl.dr_copies = zio->io_prop.zp_copies;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1293
		if (BP_IS_HOLE(&dr->dt.dl.dr_overridden_by))
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1294
			BP_ZERO(&dr->dt.dl.dr_overridden_by);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1295
	} else {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1296
		dr->dt.dl.dr_override_state = DR_NOT_OVERRIDDEN;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1297
	}
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1298
	cv_broadcast(&db->db_changed);
10810
b6b161a6ae4a 6892298 buf->b_hdr->b_state != arc_anon, file: ../../common/fs/zfs/arc.c, line: 2849
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 10800
diff changeset
  1299
	mutex_exit(&db->db_mtx);
b6b161a6ae4a 6892298 buf->b_hdr->b_state != arc_anon, file: ../../common/fs/zfs/arc.c, line: 2849
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 10800
diff changeset
  1300
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1301
	dsa->dsa_done(dsa->dsa_zgd, zio->io_error);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1302
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1303
	kmem_free(dsa, sizeof (*dsa));
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1304
}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1305
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1306
static void
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1307
dmu_sync_late_arrival_done(zio_t *zio)
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1308
{
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1309
	blkptr_t *bp = zio->io_bp;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1310
	dmu_sync_arg_t *dsa = zio->io_private;
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1311
	blkptr_t *bp_orig = &zio->io_bp_orig;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1312
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1313
	if (zio->io_error == 0 && !BP_IS_HOLE(bp)) {
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1314
		/*
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1315
		 * If we didn't allocate a new block (i.e. ZIO_FLAG_NOPWRITE)
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1316
		 * then there is nothing to do here. Otherwise, free the
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1317
		 * newly allocated block in this txg.
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1318
		 */
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1319
		if (zio->io_flags & ZIO_FLAG_NOPWRITE) {
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1320
			ASSERT(BP_EQUAL(bp, bp_orig));
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1321
		} else {
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1322
			ASSERT(BP_IS_HOLE(bp_orig) || !BP_EQUAL(bp, bp_orig));
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1323
			ASSERT(zio->io_bp->blk_birth == zio->io_txg);
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1324
			ASSERT(zio->io_txg > spa_syncing_txg(zio->io_spa));
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1325
			zio_free(zio->io_spa, zio->io_txg, zio->io_bp);
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1326
		}
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1327
	}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1328
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1329
	dmu_tx_commit(dsa->dsa_tx);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1330
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1331
	dsa->dsa_done(dsa->dsa_zgd, zio->io_error);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1332
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1333
	kmem_free(dsa, sizeof (*dsa));
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1334
}
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1335
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1336
static int
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1337
dmu_sync_late_arrival(zio_t *pio, objset_t *os, dmu_sync_cb_t *done, zgd_t *zgd,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1338
    zio_prop_t *zp, zbookmark_t *zb)
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1339
{
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1340
	dmu_sync_arg_t *dsa;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1341
	dmu_tx_t *tx;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1342
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1343
	tx = dmu_tx_create(os);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1344
	dmu_tx_hold_space(tx, zgd->zgd_db->db_size);
11670
1d964fb5d948 6595532 ZIL is too talkative
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 11539
diff changeset
  1345
	if (dmu_tx_assign(tx, TXG_WAIT) != 0) {
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1346
		dmu_tx_abort(tx);
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
  1347
		/* Make zl_get_data do txg_waited_synced() */
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
  1348
		return (SET_ERROR(EIO));
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1349
	}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1350
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1351
	dsa = kmem_alloc(sizeof (dmu_sync_arg_t), KM_SLEEP);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1352
	dsa->dsa_dr = NULL;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1353
	dsa->dsa_done = done;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1354
	dsa->dsa_zgd = zgd;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1355
	dsa->dsa_tx = tx;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1356
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1357
	zio_nowait(zio_write(pio, os->os_spa, dmu_tx_get_txg(tx), zgd->zgd_bp,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1358
	    zgd->zgd_db->db_data, zgd->zgd_db->db_size, zp,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1359
	    dmu_sync_late_arrival_ready, dmu_sync_late_arrival_done, dsa,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1360
	    ZIO_PRIORITY_SYNC_WRITE, ZIO_FLAG_CANFAIL, zb));
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1361
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1362
	return (0);
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1363
}
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1364
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1365
/*
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1366
 * Intent log support: sync the block associated with db to disk.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1367
 * N.B. and XXX: the caller is responsible for making sure that the
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1368
 * data isn't changing while dmu_sync() is writing it.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1369
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1370
 * Return values:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1371
 *
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1372
 *	EEXIST: this txg has already been synced, so there's nothing to do.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1373
 *		The caller should not log the write.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1374
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1375
 *	ENOENT: the block was dbuf_free_range()'d, so there's nothing to do.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1376
 *		The caller should not log the write.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1377
 *
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1378
 *	EALREADY: this block is already in the process of being synced.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1379
 *		The caller should track its progress (somehow).
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1380
 *
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1381
 *	EIO: could not do the I/O.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1382
 *		The caller should do a txg_wait_synced().
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1383
 *
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1384
 *	0: the I/O has been initiated.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1385
 *		The caller should log this blkptr in the done callback.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1386
 *		It is possible that the I/O will fail, in which case
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1387
 *		the error will be reported to the done callback and
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1388
 *		propagated to pio from zio_done().
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1389
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1390
int
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1391
dmu_sync(zio_t *pio, uint64_t txg, dmu_sync_cb_t *done, zgd_t *zgd)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1392
{
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1393
	blkptr_t *bp = zgd->zgd_bp;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1394
	dmu_buf_impl_t *db = (dmu_buf_impl_t *)zgd->zgd_db;
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
  1395
	objset_t *os = db->db_objset;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1396
	dsl_dataset_t *ds = os->os_dsl_dataset;
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1397
	dbuf_dirty_record_t *dr;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1398
	dmu_sync_arg_t *dsa;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1399
	zbookmark_t zb;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1400
	zio_prop_t zp;
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1401
	dnode_t *dn;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1402
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1403
	ASSERT(pio != NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1404
	ASSERT(txg != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1405
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1406
	SET_BOOKMARK(&zb, ds->ds_object,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1407
	    db->db.db_object, db->db_level, db->db_blkid);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1408
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1409
	DB_DNODE_ENTER(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1410
	dn = DB_DNODE(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1411
	dmu_write_policy(os, dn, db->db_level, WP_DMU_SYNC, &zp);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1412
	DB_DNODE_EXIT(db);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1413
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1414
	/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1415
	 * If we're frozen (running ziltest), we always need to generate a bp.
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1416
	 */
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1417
	if (txg > spa_freeze_txg(os->os_spa))
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1418
		return (dmu_sync_late_arrival(pio, os, done, zgd, &zp, &zb));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1419
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1420
	/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1421
	 * Grabbing db_mtx now provides a barrier between dbuf_sync_leaf()
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1422
	 * and us.  If we determine that this txg is not yet syncing,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1423
	 * but it begins to sync a moment later, that's OK because the
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1424
	 * sync thread will block in dbuf_sync_leaf() until we drop db_mtx.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1425
	 */
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1426
	mutex_enter(&db->db_mtx);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1427
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1428
	if (txg <= spa_last_synced_txg(os->os_spa)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1429
		/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1430
		 * This txg has already synced.  There's nothing to do.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1431
		 */
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1432
		mutex_exit(&db->db_mtx);
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
  1433
		return (SET_ERROR(EEXIST));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1434
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1435
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1436
	if (txg <= spa_syncing_txg(os->os_spa)) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1437
		/*
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1438
		 * This txg is currently syncing, so we can't mess with
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1439
		 * the dirty record anymore; just write a new log block.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1440
		 */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1441
		mutex_exit(&db->db_mtx);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1442
		return (dmu_sync_late_arrival(pio, os, done, zgd, &zp, &zb));
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1443
	}
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1444
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1445
	dr = db->db_last_dirty;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1446
	while (dr && dr->dr_txg != txg)
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1447
		dr = dr->dr_next;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1448
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1449
	if (dr == NULL) {
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1450
		/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1451
		 * There's no dr for this dbuf, so it must have been freed.
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1452
		 * There's no need to log writes to freed blocks, so we're done.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1453
		 */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1454
		mutex_exit(&db->db_mtx);
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
  1455
		return (SET_ERROR(ENOENT));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1456
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1457
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1458
	ASSERT(dr->dr_next == NULL || dr->dr_next->dr_txg < txg);
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1459
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1460
	/*
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1461
	 * Assume the on-disk data is X, the current syncing data is Y,
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1462
	 * and the current in-memory data is Z (currently in dmu_sync).
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1463
	 * X and Z are identical but Y is has been modified. Normally,
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1464
	 * when X and Z are the same we will perform a nopwrite but if Y
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1465
	 * is different we must disable nopwrite since the resulting write
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1466
	 * of Y to disk can free the block containing X. If we allowed a
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1467
	 * nopwrite to occur the block pointing to Z would reference a freed
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1468
	 * block. Since this is a rare case we simplify this by disabling
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1469
	 * nopwrite if the current dmu_sync-ing dbuf has been modified in
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1470
	 * a previous transaction.
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1471
	 */
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1472
	if (dr->dr_next)
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1473
		zp.zp_nopwrite = B_FALSE;
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1474
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1475
	ASSERT(dr->dr_txg == txg);
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1476
	if (dr->dt.dl.dr_override_state == DR_IN_DMU_SYNC ||
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1477
	    dr->dt.dl.dr_override_state == DR_OVERRIDDEN) {
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1478
		/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1479
		 * We have already issued a sync write for this buffer,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1480
		 * or this buffer has already been synced.  It could not
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1481
		 * have been dirtied since, or we would have cleared the state.
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1482
		 */
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1483
		mutex_exit(&db->db_mtx);
14054
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 14050
diff changeset
  1484
		return (SET_ERROR(EALREADY));
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1485
	}
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1486
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1487
	ASSERT(dr->dt.dl.dr_override_state == DR_NOT_OVERRIDDEN);
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1488
	dr->dt.dl.dr_override_state = DR_IN_DMU_SYNC;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1489
	mutex_exit(&db->db_mtx);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1490
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1491
	dsa = kmem_alloc(sizeof (dmu_sync_arg_t), KM_SLEEP);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1492
	dsa->dsa_dr = dr;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1493
	dsa->dsa_done = done;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1494
	dsa->dsa_zgd = zgd;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1495
	dsa->dsa_tx = NULL;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1496
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1497
	zio_nowait(arc_write(pio, os->os_spa, txg,
14115
6cfd5a5778b9 3137 L2ARC compression
Saso Kiselkov <skiselkov@gmail.com>
parents: 14054
diff changeset
  1498
	    bp, dr->dt.dl.dr_data, DBUF_IS_L2CACHEABLE(db),
6cfd5a5778b9 3137 L2ARC compression
Saso Kiselkov <skiselkov@gmail.com>
parents: 14054
diff changeset
  1499
	    DBUF_IS_L2COMPRESSIBLE(db), &zp, dmu_sync_ready, dmu_sync_done,
6cfd5a5778b9 3137 L2ARC compression
Saso Kiselkov <skiselkov@gmail.com>
parents: 14054
diff changeset
  1500
	    dsa, ZIO_PRIORITY_SYNC_WRITE, ZIO_FLAG_CANFAIL, &zb));
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1501
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1502
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1503
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1504
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1505
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1506
dmu_object_set_blocksize(objset_t *os, uint64_t object, uint64_t size, int ibs,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1507
	dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1508
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1509
	dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1510
	int err;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1511
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
  1512
	err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1513
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1514
		return (err);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1515
	err = dnode_set_blksz(dn, size, ibs, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1516
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1517
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1518
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1519
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1520
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1521
dmu_object_set_checksum(objset_t *os, uint64_t object, uint8_t checksum,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1522
	dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1523
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1524
	dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1525
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1526
	/* XXX assumes dnode_hold will not get an i/o error */
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
  1527
	(void) dnode_hold(os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1528
	ASSERT(checksum < ZIO_CHECKSUM_FUNCTIONS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1529
	dn->dn_checksum = checksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1530
	dnode_setdirty(dn, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1531
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1532
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1533
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1534
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1535
dmu_object_set_compress(objset_t *os, uint64_t object, uint8_t compress,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1536
	dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1537
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1538
	dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1539
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1540
	/* XXX assumes dnode_hold will not get an i/o error */
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
  1541
	(void) dnode_hold(os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1542
	ASSERT(compress < ZIO_COMPRESS_FUNCTIONS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1543
	dn->dn_compress = compress;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1544
	dnode_setdirty(dn, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1545
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1546
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1547
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1548
int zfs_mdcomp_disable = 0;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1549
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1550
void
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1551
dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp, zio_prop_t *zp)
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1552
{
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1553
	dmu_object_type_t type = dn ? dn->dn_type : DMU_OT_OBJSET;
13750
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
  1554
	boolean_t ismd = (level > 0 || DMU_OT_IS_METADATA(type) ||
12493
89ce40422cea 6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents: 12470
diff changeset
  1555
	    (wp & WP_SPILL));
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1556
	enum zio_checksum checksum = os->os_checksum;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1557
	enum zio_compress compress = os->os_compress;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1558
	enum zio_checksum dedup_checksum = os->os_dedup_checksum;
13952
7204b3392a58 3236 zio nop-write (fix uninitialized variables)
George Wilson <george.wilson@delphix.com>
parents: 13951
diff changeset
  1559
	boolean_t dedup = B_FALSE;
7204b3392a58 3236 zio nop-write (fix uninitialized variables)
George Wilson <george.wilson@delphix.com>
parents: 13951
diff changeset
  1560
	boolean_t nopwrite = B_FALSE;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1561
	boolean_t dedup_verify = os->os_dedup_verify;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1562
	int copies = os->os_copies;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1563
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1564
	/*
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1565
	 * We maintain different write policies for each of the following
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1566
	 * types of data:
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1567
	 *	 1. metadata
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1568
	 *	 2. preallocated blocks (i.e. level-0 blocks of a dump device)
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1569
	 *	 3. all other level 0 blocks
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1570
	 */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1571
	if (ismd) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1572
		/*
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1573
		 * XXX -- we should design a compression algorithm
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1574
		 * that specializes in arrays of bps.
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1575
		 */
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1576
		compress = zfs_mdcomp_disable ? ZIO_COMPRESS_EMPTY :
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1577
		    ZIO_COMPRESS_LZJB;
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1578
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1579
		/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1580
		 * Metadata always gets checksummed.  If the data
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1581
		 * checksum is multi-bit correctable, and it's not a
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1582
		 * ZBT-style checksum, then it's suitable for metadata
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1583
		 * as well.  Otherwise, the metadata checksum defaults
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1584
		 * to fletcher4.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1585
		 */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1586
		if (zio_checksum_table[checksum].ci_correctable < 1 ||
11670
1d964fb5d948 6595532 ZIL is too talkative
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 11539
diff changeset
  1587
		    zio_checksum_table[checksum].ci_eck)
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1588
			checksum = ZIO_CHECKSUM_FLETCHER_4;
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1589
	} else if (wp & WP_NOFILL) {
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1590
		ASSERT(level == 0);
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1591
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1592
		/*
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1593
		 * If we're writing preallocated blocks, we aren't actually
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1594
		 * writing them so don't set any policy properties.  These
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1595
		 * blocks are currently only used by an external subsystem
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1596
		 * outside of zfs (i.e. dump) and not written by the zio
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1597
		 * pipeline.
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1598
		 */
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1599
		compress = ZIO_COMPRESS_OFF;
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1600
		checksum = ZIO_CHECKSUM_OFF;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1601
	} else {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1602
		compress = zio_compress_select(dn->dn_compress, compress);
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1603
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1604
		checksum = (dedup_checksum == ZIO_CHECKSUM_OFF) ?
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1605
		    zio_checksum_select(dn->dn_checksum, checksum) :
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1606
		    dedup_checksum;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1607
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1608
		/*
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1609
		 * Determine dedup setting.  If we are in dmu_sync(),
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1610
		 * we won't actually dedup now because that's all
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1611
		 * done in syncing context; but we do want to use the
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1612
		 * dedup checkum.  If the checksum is not strong
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1613
		 * enough to ensure unique signatures, force
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1614
		 * dedup_verify.
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1615
		 */
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1616
		if (dedup_checksum != ZIO_CHECKSUM_OFF) {
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1617
			dedup = (wp & WP_DMU_SYNC) ? B_FALSE : B_TRUE;
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1618
			if (!zio_checksum_table[checksum].ci_dedup)
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1619
				dedup_verify = B_TRUE;
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1620
		}
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1621
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1622
		/*
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1623
		 * Enable nopwrite if we have a cryptographically secure
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1624
		 * checksum that has no known collisions (i.e. SHA-256)
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1625
		 * and compression is enabled.  We don't enable nopwrite if
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1626
		 * dedup is enabled as the two features are mutually exclusive.
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1627
		 */
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1628
		nopwrite = (!dedup && zio_checksum_table[checksum].ci_dedup &&
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1629
		    compress != ZIO_COMPRESS_OFF && zfs_nopwrite_enabled);
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1630
	}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1631
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1632
	zp->zp_checksum = checksum;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1633
	zp->zp_compress = compress;
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
  1634
	zp->zp_type = (wp & WP_SPILL) ? dn->dn_bonustype : type;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1635
	zp->zp_level = level;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1636
	zp->zp_copies = MIN(copies + ismd, spa_max_replication(os->os_spa));
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1637
	zp->zp_dedup = dedup;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1638
	zp->zp_dedup_verify = dedup && dedup_verify;
13951
196932ec9e6a 3236 zio nop-write
George Wilson <george.wilson@delphix.com>
parents: 13834
diff changeset
  1639
	zp->zp_nopwrite = nopwrite;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1640
}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1641
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
  1642
int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1643
dmu_offset_next(objset_t *os, uint64_t object, boolean_t hole, uint64_t *off)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1644
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1645
	dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1646
	int i, err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1647
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
  1648
	err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1649
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1650
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1651
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1652
	 * Sync any current changes before
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1653
	 * we go trundling through the block pointers.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1654
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1655
	for (i = 0; i < TXG_SIZE; i++) {
1596
2e2377ccbf85 6395371 ASSERT in dmu_tx_count_free: blkid + i < dn->dn_phys->dn_nblkptr
ahrens
parents: 1544
diff changeset
  1656
		if (list_link_active(&dn->dn_dirty_link[i]))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1657
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1658
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1659
	if (i != TXG_SIZE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1660
		dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1661
		txg_wait_synced(dmu_objset_pool(os), 0);
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
  1662
		err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1663
		if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1664
			return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1665
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1666
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
  1667
	err = dnode_next_offset(dn, (hole ? DNODE_FIND_HOLE : 0), off, 1, 1, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1668
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1669
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1670
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1671
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1672
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1673
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1674
dmu_object_info_from_dnode(dnode_t *dn, dmu_object_info_t *doi)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1675
{
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1676
	dnode_phys_t *dnp;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1677
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1678
	rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1679
	mutex_enter(&dn->dn_mtx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1680
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1681
	dnp = dn->dn_phys;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1682
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1683
	doi->doi_data_block_size = dn->dn_datablksz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1684
	doi->doi_metadata_block_size = dn->dn_indblkshift ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1685
	    1ULL << dn->dn_indblkshift : 0;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1686
	doi->doi_type = dn->dn_type;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1687
	doi->doi_bonus_type = dn->dn_bonustype;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1688
	doi->doi_bonus_size = dn->dn_bonuslen;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1689
	doi->doi_indirection = dn->dn_nlevels;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1690
	doi->doi_checksum = dn->dn_checksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1691
	doi->doi_compress = dn->dn_compress;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1692
	doi->doi_physical_blocks_512 = (DN_USED_BYTES(dnp) + 256) >> 9;
14050
af7f2603d4d7 3603 panic from bpobj_enqueue_subobj()
Matthew Ahrens <mahrens@delphix.com>
parents: 14046
diff changeset
  1693
	doi->doi_max_offset = (dn->dn_maxblkid + 1) * dn->dn_datablksz;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1694
	doi->doi_fill_count = 0;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1695
	for (int i = 0; i < dnp->dn_nblkptr; i++)
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1696
		doi->doi_fill_count += dnp->dn_blkptr[i].blk_fill;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1697
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1698
	mutex_exit(&dn->dn_mtx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1699
	rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1700
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1701
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1702
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1703
 * Get information on a DMU object.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1704
 * If doi is NULL, just indicates whether the object exists.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1705
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1706
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1707
dmu_object_info(objset_t *os, uint64_t object, dmu_object_info_t *doi)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1708
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1709
	dnode_t *dn;
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
  1710
	int err = dnode_hold(os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1711
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1712
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1713
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1714
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1715
	if (doi != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1716
		dmu_object_info_from_dnode(dn, doi);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1717
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1718
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1719
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1720
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1721
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1722
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1723
 * As above, but faster; can be used when you have a held dbuf in hand.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1724
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1725
void
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1726
dmu_object_info_from_db(dmu_buf_t *db_fake, dmu_object_info_t *doi)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1727
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1728
	dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1729
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1730
	DB_DNODE_ENTER(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1731
	dmu_object_info_from_dnode(DB_DNODE(db), doi);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1732
	DB_DNODE_EXIT(db);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1733
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1734
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1735
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1736
 * Faster still when you only care about the size.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1737
 * This is specifically optimized for zfs_getattr().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1738
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1739
void
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1740
dmu_object_size_from_db(dmu_buf_t *db_fake, uint32_t *blksize,
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1741
    u_longlong_t *nblk512)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1742
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1743
	dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1744
	dnode_t *dn;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1745
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1746
	DB_DNODE_ENTER(db);
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1747
	dn = DB_DNODE(db);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1748
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1749
	*blksize = dn->dn_datablksz;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1750
	/* add 1 for dnode space */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1751
	*nblk512 = ((DN_USED_BYTES(dn->dn_phys) + SPA_MINBLOCKSIZE/2) >>
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1752
	    SPA_MINBLOCKSHIFT) + 1;
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1753
	DB_DNODE_EXIT(db);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1754
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1755
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1756
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1757
byteswap_uint64_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1758
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1759
	uint64_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1760
	size_t count = size >> 3;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1761
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1762
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1763
	ASSERT((size & 7) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1764
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1765
	for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1766
		buf[i] = BSWAP_64(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1767
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1768
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1769
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1770
byteswap_uint32_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1771
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1772
	uint32_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1773
	size_t count = size >> 2;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1774
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1775
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1776
	ASSERT((size & 3) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1777
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1778
	for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1779
		buf[i] = BSWAP_32(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1780
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1781
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1782
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1783
byteswap_uint16_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1784
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1785
	uint16_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1786
	size_t count = size >> 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1787
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1788
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1789
	ASSERT((size & 1) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1790
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1791
	for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1792
		buf[i] = BSWAP_16(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1793
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1794
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1795
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1796
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1797
byteswap_uint8_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1798
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1799
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1800
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1801
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1802
dmu_init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1803
{
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12285
diff changeset
  1804
	zfs_dbgmsg_init();
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1805
	sa_cache_init();
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1806
	xuio_stat_init();
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1807
	dmu_objset_init();
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1808
	dnode_init();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1809
	dbuf_init();
10474
0e96dd3b905a 6859997 zfs caching performance problem
Rich Morris <Richard.Morris@Sun.COM>
parents: 10298
diff changeset
  1810
	zfetch_init();
13834
cd512c80fd75 3086 unnecessarily setting DS_FLAG_INCONSISTENT on async destroyed datasets
Matthew Ahrens <mahrens@delphix.com>
parents: 13750
diff changeset
  1811
	l2arc_init();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1812
	arc_init();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1813
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1814
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1815
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1816
dmu_fini(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1817
{
14121
9475b3fef59d 3741 zfs needs better comments
Will Andrews <will@firepipe.net>
parents: 14115
diff changeset
  1818
	arc_fini(); /* arc depends on l2arc, so arc must go first */
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1819
	l2arc_fini();
10474
0e96dd3b905a 6859997 zfs caching performance problem
Rich Morris <Richard.Morris@Sun.COM>
parents: 10298
diff changeset
  1820
	zfetch_fini();
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1821
	dbuf_fini();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1822
	dnode_fini();
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1823
	dmu_objset_fini();
11539
10d35fc3d7fd 6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents: 10922
diff changeset
  1824
	xuio_stat_fini();
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
  1825
	sa_cache_fini();
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12285
diff changeset
  1826
	zfs_dbgmsg_fini();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1827
}