usr/src/uts/common/fs/zfs/dmu.c
author Matthew Ahrens <mahrens@delphix.com>
Tue, 21 Aug 2012 04:36:41 -0700
changeset 13776 cd512c80fd75
parent 13700 2889e2596bd6
child 13887 196932ec9e6a
permissions -rw-r--r--
3086 unnecessarily setting DS_FLAG_INCONSISTENT on async destroyed datasets Reviewed by: Christopher Siden <[email protected]> Approved by: Eric Schrock <[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.
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    23
 * Copyright (c) 2012 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
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
#include <sys/dmu_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <sys/dmu_tx.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#include <sys/dbuf.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <sys/dnode.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/zfs_context.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/dmu_objset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/dmu_traverse.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
#include <sys/dsl_dataset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/dsl_dir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <sys/dsl_pool.h>
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
    37
#include <sys/dsl_synctask.h>
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
    38
#include <sys/dsl_prop.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
#include <sys/dmu_zfetch.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
#include <sys/zfs_ioctl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
#include <sys/zap.h>
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
    42
#include <sys/zio_checksum.h>
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
    43
#include <sys/sa.h>
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
    44
#ifdef _KERNEL
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
    45
#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
    46
#include <sys/zfs_znode.h>
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
    47
#endif
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    50
	{	DMU_BSWAP_UINT8,	TRUE,	"unallocated"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    51
	{	DMU_BSWAP_ZAP,		TRUE,	"object directory"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    52
	{	DMU_BSWAP_UINT64,	TRUE,	"object array"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    53
	{	DMU_BSWAP_UINT8,	TRUE,	"packed nvlist"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    54
	{	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
    55
	{	DMU_BSWAP_UINT64,	TRUE,	"bpobj"			},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    56
	{	DMU_BSWAP_UINT64,	TRUE,	"bpobj header"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    57
	{	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
    58
	{	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
    59
	{	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
    60
	{	DMU_BSWAP_DNODE,	TRUE,	"DMU dnode"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    61
	{	DMU_BSWAP_OBJSET,	TRUE,	"DMU objset"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    62
	{	DMU_BSWAP_UINT64,	TRUE,	"DSL directory"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    63
	{	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
    64
	{	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
    65
	{	DMU_BSWAP_ZAP,		TRUE,	"DSL props"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    66
	{	DMU_BSWAP_UINT64,	TRUE,	"DSL dataset"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    67
	{	DMU_BSWAP_ZNODE,	TRUE,	"ZFS znode"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    68
	{	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
    69
	{	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
    70
	{	DMU_BSWAP_ZAP,		TRUE,	"ZFS directory"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    71
	{	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
    72
	{	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
    73
	{	DMU_BSWAP_UINT8,	FALSE,	"zvol object"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    74
	{	DMU_BSWAP_ZAP,		TRUE,	"zvol prop"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    75
	{	DMU_BSWAP_UINT8,	FALSE,	"other uint8[]"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    76
	{	DMU_BSWAP_UINT64,	FALSE,	"other uint64[]"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    77
	{	DMU_BSWAP_ZAP,		TRUE,	"other ZAP"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    78
	{	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
    79
	{	DMU_BSWAP_UINT8,	TRUE,	"SPA history"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    80
	{	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
    81
	{	DMU_BSWAP_ZAP,		TRUE,	"Pool properties"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    82
	{	DMU_BSWAP_ZAP,		TRUE,	"DSL permissions"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    83
	{	DMU_BSWAP_ACL,		TRUE,	"ZFS ACL"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    84
	{	DMU_BSWAP_UINT8,	TRUE,	"ZFS SYSACL"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    85
	{	DMU_BSWAP_UINT8,	TRUE,	"FUID table"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    86
	{	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
    87
	{	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
    88
	{	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
    89
	{	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
    90
	{	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
    91
	{	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
    92
	{	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
    93
	{	DMU_BSWAP_ZAP,		TRUE,	"DDT statistics"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    94
	{	DMU_BSWAP_UINT8,	TRUE,	"System attributes"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    95
	{	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
    96
	{	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
    97
	{	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
    98
	{	DMU_BSWAP_ZAP,		TRUE,	"scan translations"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
    99
	{	DMU_BSWAP_UINT8,	FALSE,	"deduplicated block"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   100
	{	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
   101
	{	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
   102
	{	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
   103
	{	DMU_BSWAP_UINT64,	TRUE,	"bpobj subobj"		}
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   104
};
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   105
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   106
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
   107
	{	byteswap_uint8_array,	"uint8"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   108
	{	byteswap_uint16_array,	"uint16"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   109
	{	byteswap_uint32_array,	"uint32"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   110
	{	byteswap_uint64_array,	"uint64"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   111
	{	zap_byteswap,		"zap"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   112
	{	dnode_buf_byteswap,	"dnode"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   113
	{	dmu_objset_byteswap,	"objset"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   114
	{	zfs_znode_byteswap,	"znode"		},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   115
	{	zfs_oldacl_byteswap,	"oldacl"	},
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   116
	{	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
   117
};
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   120
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
   121
    void *tag, dmu_buf_t **dbp, int flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
	dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
	uint64_t blkid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
	dmu_buf_impl_t *db;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   126
	int err;
12285
d736d62dcca2 6944833 Avoid prefetching dbufs in dmu_sync() path
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 12178
diff changeset
   127
	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
   128
d736d62dcca2 6944833 Avoid prefetching dbufs in dmu_sync() path
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 12178
diff changeset
   129
	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
   130
		db_flags |= DB_RF_NOPREFETCH;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   132
	err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   133
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   134
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
	blkid = dbuf_whichblock(dn, offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
	rw_enter(&dn->dn_struct_rwlock, RW_READER);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   137
	db = dbuf_hold(dn, blkid, tag);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
	rw_exit(&dn->dn_struct_rwlock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   139
	if (db == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   140
		err = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   141
	} else {
12285
d736d62dcca2 6944833 Avoid prefetching dbufs in dmu_sync() path
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 12178
diff changeset
   142
		err = dbuf_read(db, NULL, db_flags);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   143
		if (err) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   144
			dbuf_rele(db, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   145
			db = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   146
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   147
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   148
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
	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
   150
	*dbp = &db->db; /* NULL db plus first field offset is NULL */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   151
	return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
dmu_bonus_max(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
	return (DN_MAX_BONUSLEN);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   160
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
   161
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
   162
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   163
	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
   164
	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
   165
	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
   166
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   167
	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
   168
	dn = DB_DNODE(db);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   169
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   170
	if (dn->dn_bonus != db) {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   171
		error = EINVAL;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   172
	} else if (newsize < 0 || newsize > db_fake->db_size) {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   173
		error = EINVAL;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   174
	} else {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   175
		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
   176
		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
   177
	}
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   178
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   179
	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
   180
	return (error);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   181
}
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   182
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   183
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
   184
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
   185
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   186
	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
   187
	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
   188
	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
   189
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   190
	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
   191
	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
   192
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
   193
	if (!DMU_OT_IS_VALID(type)) {
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
		error = EINVAL;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   195
	} else if (dn->dn_bonus != db) {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   196
		error = EINVAL;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   197
	} else {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   198
		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
   199
		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
   200
	}
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   201
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   202
	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
   203
	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
   204
}
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   205
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   206
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
   207
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
   208
{
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   209
	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
   210
	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
   211
	dmu_object_type_t type;
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   212
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   213
	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
   214
	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
   215
	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
   216
	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
   217
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   218
	return (type);
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   219
}
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   220
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   221
int
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   222
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
   223
{
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   224
	dnode_t *dn;
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   225
	int error;
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   226
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   227
	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
   228
	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
   229
	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
   230
	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
   231
	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
   232
	dnode_rele(dn, FTAG);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   233
	return (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
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
/*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   237
 * returns ENOENT, EIO, or 0.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   239
int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   240
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
   241
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   242
	dnode_t *dn;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   243
	dmu_buf_impl_t *db;
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   244
	int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   246
	error = dnode_hold(os, object, FTAG, &dn);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   247
	if (error)
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   248
		return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   250
	rw_enter(&dn->dn_struct_rwlock, RW_READER);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   251
	if (dn->dn_bonus == NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
		rw_exit(&dn->dn_struct_rwlock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   253
		rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   254
		if (dn->dn_bonus == NULL)
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   255
			dbuf_create_bonus(dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   256
	}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   257
	db = dn->dn_bonus;
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   258
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   259
	/* 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
   260
	if (refcount_add(&db->db_holds, tag) == 1) {
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   261
		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
   262
		(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
   263
	}
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   264
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   265
	/*
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   266
	 * 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
   267
	 * 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
   268
	 * 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
   269
	 */
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   270
	rw_exit(&dn->dn_struct_rwlock);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   271
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   272
	dnode_rele(dn, FTAG);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   273
12285
d736d62dcca2 6944833 Avoid prefetching dbufs in dmu_sync() path
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 12178
diff changeset
   274
	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
   275
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   276
	*dbp = &db->db;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   277
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   279
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   280
/*
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   281
 * returns ENOENT, EIO, or 0.
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   282
 *
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   283
 * 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
   284
 * 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
   285
 *
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   286
 * 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
   287
 * 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
   288
 */
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   289
int
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   290
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
   291
{
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   292
	dmu_buf_impl_t *db = NULL;
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   293
	int err;
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   294
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   295
	if ((flags & DB_RF_HAVESTRUCT) == 0)
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   296
		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
   297
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   298
	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
   299
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   300
	if ((flags & DB_RF_HAVESTRUCT) == 0)
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   301
		rw_exit(&dn->dn_struct_rwlock);
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
	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
   304
	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
   305
	if (err == 0)
89ce40422cea 6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents: 12470
diff changeset
   306
		*dbp = &db->db;
89ce40422cea 6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents: 12470
diff changeset
   307
	else
89ce40422cea 6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents: 12470
diff changeset
   308
		dbuf_rele(db, tag);
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   309
	return (err);
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
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   312
int
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   313
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
   314
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   315
	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
   316
	dnode_t *dn;
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   317
	int err;
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   318
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   319
	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
   320
	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
   321
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   322
	if (spa_version(dn->dn_objset->os_spa) < SPA_VERSION_SA) {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   323
		err = EINVAL;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   324
	} else {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   325
		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
   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
		if (!dn->dn_have_spill) {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   328
			err = ENOENT;
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   329
		} else {
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   330
			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
   331
			    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
   332
		}
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   333
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   334
		rw_exit(&dn->dn_struct_rwlock);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   335
	}
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   336
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   337
	DB_DNODE_EXIT(db);
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   338
	return (err);
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   339
}
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   340
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   341
int
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   342
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
   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
	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
   345
	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
   346
	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
   347
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   348
	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
   349
	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
   350
	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
   351
	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
   352
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   353
	return (err);
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   354
}
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   355
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
   356
/*
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   357
 * Note: longer-term, we should modify all of the dmu_buf_*() interfaces
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   358
 * to take a held dnode rather than <os, object> -- the lookup is wasteful,
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   359
 * and can induce severe lock contention when writing to several files
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   360
 * whose dnodes are in the same block.
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   361
 */
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   362
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
   363
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
   364
    int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp, uint32_t flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   365
{
7468
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   366
	dsl_pool_t *dp = NULL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   367
	dmu_buf_t **dbp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   368
	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
   369
	uint32_t dbuf_flags;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   370
	int err;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   371
	zio_t *zio;
7468
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   372
	hrtime_t start;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   373
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   374
	ASSERT(length <= DMU_MAX_ACCESS);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   375
10209
91f47f0e7728 6830541 zfs_get_data trips on a verify
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9951
diff changeset
   376
	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
   377
	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
   378
		dbuf_flags |= DB_RF_NOPREFETCH;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   379
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   380
	rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   381
	if (dn->dn_datablkshift) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   382
		int blkshift = dn->dn_datablkshift;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   383
		nblks = (P2ROUNDUP(offset+length, 1ULL<<blkshift) -
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3835
diff changeset
   384
		    P2ALIGN(offset, 1ULL<<blkshift)) >> blkshift;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   385
	} else {
3713
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   386
		if (offset + length > dn->dn_datablksz) {
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   387
			zfs_panic_recover("zfs: accessing past end of object "
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   388
			    "%llx/%llx (size=%u access=%llu+%llu)",
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   389
			    (longlong_t)dn->dn_objset->
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   390
			    os_dsl_dataset->ds_object,
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   391
			    (longlong_t)dn->dn_object, dn->dn_datablksz,
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   392
			    (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
   393
			rw_exit(&dn->dn_struct_rwlock);
3713
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   394
			return (EIO);
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3689
diff changeset
   395
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   396
		nblks = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   397
	}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   398
	dbp = kmem_zalloc(sizeof (dmu_buf_t *) * nblks, KM_SLEEP);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   399
7468
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   400
	if (dn->dn_objset->os_dsl_dataset)
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   401
		dp = dn->dn_objset->os_dsl_dataset->ds_dir->dd_pool;
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   402
	if (dp && dsl_pool_sync_context(dp))
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   403
		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
   404
	zio = zio_root(dn->dn_objset->os_spa, NULL, NULL, ZIO_FLAG_CANFAIL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   405
	blkid = dbuf_whichblock(dn, offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   406
	for (i = 0; i < nblks; i++) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   407
		dmu_buf_impl_t *db = dbuf_hold(dn, blkid+i, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   408
		if (db == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   409
			rw_exit(&dn->dn_struct_rwlock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   410
			dmu_buf_rele_array(dbp, nblks, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   411
			zio_nowait(zio);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   412
			return (EIO);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   413
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   414
		/* initiate async i/o */
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   415
		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
   416
			(void) dbuf_read(db, zio, dbuf_flags);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   417
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   418
		dbp[i] = &db->db;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   419
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   420
	rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   421
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   422
	/* wait for async i/o */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   423
	err = zio_wait(zio);
7468
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   424
	/* 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
   425
	if (dp && dsl_pool_sync_context(dp))
23915842aa09 6687412 zfs stuck issuing small txg
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7385
diff changeset
   426
		dp->dp_read_overhead += gethrtime() - start;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   427
	if (err) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   428
		dmu_buf_rele_array(dbp, nblks, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   429
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   430
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   431
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   432
	/* wait for other io to complete */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   433
	if (read) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   434
		for (i = 0; i < nblks; i++) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   435
			dmu_buf_impl_t *db = (dmu_buf_impl_t *)dbp[i];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   436
			mutex_enter(&db->db_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   437
			while (db->db_state == DB_READ ||
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   438
			    db->db_state == DB_FILL)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   439
				cv_wait(&db->db_changed, &db->db_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   440
			if (db->db_state == DB_UNCACHED)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   441
				err = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   442
			mutex_exit(&db->db_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   443
			if (err) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   444
				dmu_buf_rele_array(dbp, nblks, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   445
				return (err);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   446
			}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   447
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   448
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   449
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   450
	*numbufsp = nblks;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   451
	*dbpp = dbp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   452
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   453
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   454
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
   455
static int
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   456
dmu_buf_hold_array(objset_t *os, uint64_t object, uint64_t offset,
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   457
    uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   458
{
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   459
	dnode_t *dn;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   460
	int err;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   461
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   462
	err = dnode_hold(os, object, FTAG, &dn);
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   463
	if (err)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   464
		return (err);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   465
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   466
	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
   467
	    numbufsp, dbpp, DMU_READ_PREFETCH);
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   468
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   469
	dnode_rele(dn, FTAG);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   470
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
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   474
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
   475
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
   476
    uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   477
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
   478
	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
   479
	dnode_t *dn;
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   480
	int err;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   481
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
	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
   483
	dn = DB_DNODE(db);
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   484
	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
   485
	    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
   486
	DB_DNODE_EXIT(db);
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   487
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   488
	return (err);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   489
}
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   490
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   491
void
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   492
dmu_buf_rele_array(dmu_buf_t **dbp_fake, int numbufs, void *tag)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   493
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   494
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   495
	dmu_buf_impl_t **dbp = (dmu_buf_impl_t **)dbp_fake;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   496
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   497
	if (numbufs == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   498
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   499
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   500
	for (i = 0; i < numbufs; i++) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   501
		if (dbp[i])
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   502
			dbuf_rele(dbp[i], tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   503
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   504
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   505
	kmem_free(dbp, sizeof (dmu_buf_t *) * numbufs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   506
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   507
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   508
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   509
dmu_prefetch(objset_t *os, uint64_t object, uint64_t offset, uint64_t len)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   510
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   511
	dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   512
	uint64_t blkid;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   513
	int nblks, i, err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   514
2986
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
   515
	if (zfs_prefetch_disable)
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
   516
		return;
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
   517
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   518
	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
   519
		dn = DMU_META_DNODE(os);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   520
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   521
		if (object == 0 || object >= DN_MAX_OBJECT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   522
			return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   523
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   524
		rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   525
		blkid = dbuf_whichblock(dn, object * sizeof (dnode_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   526
		dbuf_prefetch(dn, blkid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   527
		rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   528
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   529
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   530
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   531
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   532
	 * XXX - Note, if the dnode for the requested object is not
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   533
	 * already cached, we will do a *synchronous* read in the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   534
	 * dnode_hold() call.  The same is true for any indirects.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   535
	 */
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   536
	err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   537
	if (err != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   538
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   539
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   540
	rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   541
	if (dn->dn_datablkshift) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   542
		int blkshift = dn->dn_datablkshift;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   543
		nblks = (P2ROUNDUP(offset+len, 1<<blkshift) -
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3835
diff changeset
   544
		    P2ALIGN(offset, 1<<blkshift)) >> blkshift;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   545
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   546
		nblks = (offset < dn->dn_datablksz);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   547
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   548
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   549
	if (nblks != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   550
		blkid = dbuf_whichblock(dn, offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   551
		for (i = 0; i < nblks; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   552
			dbuf_prefetch(dn, blkid+i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   553
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   554
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   555
	rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   556
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   557
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   558
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   559
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   560
/*
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   561
 * 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
   562
 * 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
   563
 * 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
   564
 * data by simply searching the allocated level 1 indirects.
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   565
 */
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   566
static int
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   567
get_next_chunk(dnode_t *dn, uint64_t *start, uint64_t limit)
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   568
{
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   569
	uint64_t len = *start - limit;
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   570
	uint64_t blkcnt = 0;
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   571
	uint64_t maxblks = DMU_MAX_ACCESS / (1ULL << (dn->dn_indblkshift + 1));
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   572
	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
   573
	    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
   574
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   575
	ASSERT(limit <= *start);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   576
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   577
	if (len <= iblkrange * maxblks) {
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   578
		*start = limit;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   579
		return (0);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   580
	}
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   581
	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
   582
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   583
	while (*start > limit && blkcnt < maxblks) {
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
   584
		int err;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   585
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   586
		/* find next allocated L1 indirect */
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   587
		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
   588
		    DNODE_FIND_BACKWARDS, start, 2, 1, 0);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   589
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   590
		/* if there are no more, then we are done */
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   591
		if (err == ESRCH) {
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   592
			*start = limit;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   593
			return (0);
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   594
		} else if (err) {
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   595
			return (err);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   596
		}
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   597
		blkcnt += 1;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   598
9950
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   599
		/* reset offset to end of "next" block back */
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   600
		*start = P2ALIGN(*start, iblkrange);
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   601
		if (*start <= limit)
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   602
			*start = limit;
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   603
		else
78fc41aa9bc5 6792701 Removing large holey file does not free space
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 9512
diff changeset
   604
			*start -= 1;
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   605
	}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   606
	return (0);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   607
}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   608
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   609
static int
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   610
dmu_free_long_range_impl(objset_t *os, dnode_t *dn, uint64_t offset,
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   611
    uint64_t length, boolean_t free_dnode)
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
	dmu_tx_t *tx;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   614
	uint64_t object_size, start, end, len;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   615
	boolean_t trunc = (length == DMU_OBJECT_END);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   616
	int align, err;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   617
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   618
	align = 1 << dn->dn_datablkshift;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   619
	ASSERT(align > 0);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   620
	object_size = align == 1 ? dn->dn_datablksz :
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   621
	    (dn->dn_maxblkid + 1) << dn->dn_datablkshift;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   622
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7872
diff changeset
   623
	end = offset + length;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7872
diff changeset
   624
	if (trunc || end > object_size)
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   625
		end = object_size;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   626
	if (end <= offset)
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   627
		return (0);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   628
	length = end - offset;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   629
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   630
	while (length) {
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   631
		start = end;
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7872
diff changeset
   632
		/* assert(offset <= start) */
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   633
		err = get_next_chunk(dn, &start, offset);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   634
		if (err)
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   635
			return (err);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   636
		len = trunc ? DMU_OBJECT_END : end - start;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   637
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   638
		tx = dmu_tx_create(os);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   639
		dmu_tx_hold_free(tx, dn->dn_object, start, len);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   640
		err = dmu_tx_assign(tx, TXG_WAIT);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   641
		if (err) {
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   642
			dmu_tx_abort(tx);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   643
			return (err);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   644
		}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   645
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   646
		dnode_free_range(dn, start, trunc ? -1 : len, tx);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   647
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
   648
		if (start == 0 && free_dnode) {
f69ff8507427 6727817 ZFS assertion failure (zero length arc_buf_alloc) during NFS I/O
Mark Maybee <Mark.Maybee@Sun.COM>
parents: 7315
diff changeset
   649
			ASSERT(trunc);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   650
			dnode_free(dn, tx);
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
   651
		}
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   652
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   653
		length -= end - start;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   654
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   655
		dmu_tx_commit(tx);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   656
		end = start;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   657
	}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   658
	return (0);
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
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   661
int
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   662
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
   663
    uint64_t offset, uint64_t length)
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   664
{
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   665
	dnode_t *dn;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   666
	int err;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   667
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   668
	err = dnode_hold(os, object, FTAG, &dn);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   669
	if (err != 0)
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   670
		return (err);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   671
	err = dmu_free_long_range_impl(os, dn, offset, length, FALSE);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   672
	dnode_rele(dn, FTAG);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   673
	return (err);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   674
}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   675
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   676
int
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   677
dmu_free_object(objset_t *os, uint64_t object)
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   678
{
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   679
	dnode_t *dn;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   680
	dmu_tx_t *tx;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   681
	int err;
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   682
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   683
	err = dnode_hold_impl(os, object, DNODE_MUST_BE_ALLOCATED,
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   684
	    FTAG, &dn);
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);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   687
	if (dn->dn_nlevels == 1) {
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   688
		tx = dmu_tx_create(os);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   689
		dmu_tx_hold_bonus(tx, object);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   690
		dmu_tx_hold_free(tx, dn->dn_object, 0, DMU_OBJECT_END);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   691
		err = dmu_tx_assign(tx, TXG_WAIT);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   692
		if (err == 0) {
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   693
			dnode_free_range(dn, 0, DMU_OBJECT_END, tx);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   694
			dnode_free(dn, tx);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   695
			dmu_tx_commit(tx);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   696
		} else {
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   697
			dmu_tx_abort(tx);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   698
		}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   699
	} else {
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   700
		err = dmu_free_long_range_impl(os, dn, 0, DMU_OBJECT_END, TRUE);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   701
	}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   702
	dnode_rele(dn, FTAG);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   703
	return (err);
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   704
}
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
   705
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   706
int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   707
dmu_free_range(objset_t *os, uint64_t object, uint64_t offset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   708
    uint64_t size, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   709
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   710
	dnode_t *dn;
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   711
	int err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   712
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   713
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   714
	ASSERT(offset < UINT64_MAX);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   715
	ASSERT(size == -1ULL || size <= UINT64_MAX - offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   716
	dnode_free_range(dn, offset, size, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   717
	dnode_rele(dn, FTAG);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   718
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   719
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   720
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   721
int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   722
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
   723
    void *buf, uint32_t flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   724
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   725
	dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   726
	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
   727
	int numbufs, err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   728
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
   729
	err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   730
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   731
		return (err);
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   732
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   733
	/*
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   734
	 * 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
   735
	 * 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
   736
	 * handle that here as well.
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   737
	 */
10209
91f47f0e7728 6830541 zfs_get_data trips on a verify
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9951
diff changeset
   738
	if (dn->dn_maxblkid == 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   739
		int newsz = offset > dn->dn_datablksz ? 0 :
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   740
		    MIN(size, dn->dn_datablksz - offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   741
		bzero((char *)buf + newsz, size - newsz);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   742
		size = newsz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   743
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   744
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   745
	while (size > 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   746
		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
   747
		int i;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   748
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   749
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   750
		 * NB: we could do this block-at-a-time, but it's nice
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   751
		 * to be reading in parallel.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   752
		 */
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
   753
		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
   754
		    TRUE, FTAG, &numbufs, &dbp, flags);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   755
		if (err)
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   756
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   757
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   758
		for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   759
			int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   760
			int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   761
			dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   762
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   763
			ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   764
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   765
			bufoff = offset - db->db_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   766
			tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   767
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   768
			bcopy((char *)db->db_data + bufoff, buf, tocpy);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   769
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   770
			offset += tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   771
			size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   772
			buf = (char *)buf + tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   773
		}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   774
		dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   775
	}
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
   776
	dnode_rele(dn, FTAG);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4543
diff changeset
   777
	return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   778
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   779
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   780
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   781
dmu_write(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   782
    const void *buf, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   783
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   784
	dmu_buf_t **dbp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   785
	int numbufs, i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   786
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   787
	if (size == 0)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   788
		return;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
   789
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   790
	VERIFY(0 == dmu_buf_hold_array(os, object, offset, size,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   791
	    FALSE, FTAG, &numbufs, &dbp));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   792
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   793
	for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   794
		int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   795
		int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   796
		dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   797
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   798
		ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   799
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   800
		bufoff = offset - db->db_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   801
		tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   802
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   803
		ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   804
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   805
		if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   806
			dmu_buf_will_fill(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   807
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   808
			dmu_buf_will_dirty(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   809
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   810
		bcopy(buf, (char *)db->db_data + bufoff, tocpy);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   811
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   812
		if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   813
			dmu_buf_fill_done(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   814
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   815
		offset += tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   816
		size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   817
		buf = (char *)buf + tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   818
	}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   819
	dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   820
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   821
7872
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   822
void
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   823
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
   824
    dmu_tx_t *tx)
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   825
{
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   826
	dmu_buf_t **dbp;
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   827
	int numbufs, i;
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   828
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   829
	if (size == 0)
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   830
		return;
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   831
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   832
	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
   833
	    FALSE, FTAG, &numbufs, &dbp));
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   834
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   835
	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
   836
		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
   837
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   838
		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
   839
	}
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   840
	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
   841
}
40a9434212f6 6646775 Speed up the dumpifying process for zvols
Tim Haley <Tim.Haley@Sun.COM>
parents: 7754
diff changeset
   842
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
   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
 * 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
   845
 */
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
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
   847
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
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
   849
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
   850
{
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
	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
   852
	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
   853
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
	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
   855
	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
   856
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
	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
   858
	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
   859
	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
   860
	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
   861
	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
   862
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
	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
   864
		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
   865
	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
   866
		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
   867
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
	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
   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
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
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
   872
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
   873
{
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
	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
   875
	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
   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
	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
   878
	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
   879
	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
   880
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
	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
   882
		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
   883
	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
   884
		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
   885
}
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
/*
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
 * 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
   889
 * 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
   890
 */
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
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
   892
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
   893
{
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
	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
   895
	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
   896
	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
   897
	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
   898
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
	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
   900
	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
   901
	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
   902
	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
   903
	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
   904
	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
   905
	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
   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
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
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
   909
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
   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
	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
   912
	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
   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
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
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
   916
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
   917
{
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
	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
   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
	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
   921
	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
   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
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
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
   925
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
   926
{
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
	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
   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
	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
   930
	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
   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
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
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
   934
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
   935
{
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 = 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
   937
	    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
   938
	    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
   939
	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
   940
		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
   941
		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
   942
	}
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
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
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
   946
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
   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
	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
   949
		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
   950
		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
   951
	}
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
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
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
   955
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
   956
{
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
	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
   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
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
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
   961
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
   962
{
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
   963
	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
   964
}
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
   965
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   966
#ifdef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   967
int
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   968
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
   969
{
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   970
	dmu_buf_t **dbp;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   971
	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
   972
	xuio_t *xuio = NULL;
3638
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
	/*
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   975
	 * 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
   976
	 * to be reading in parallel.
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   977
	 */
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   978
	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
   979
	    &numbufs, &dbp);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   980
	if (err)
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   981
		return (err);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   982
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
   983
	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
   984
		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
   985
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   986
	for (i = 0; i < numbufs; i++) {
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   987
		int tocpy;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   988
		int bufoff;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   989
		dmu_buf_t *db = dbp[i];
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   990
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   991
		ASSERT(size > 0);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   992
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   993
		bufoff = uio->uio_loffset - db->db_offset;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
   994
		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
   995
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
   996
		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
   997
			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
   998
			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
   999
			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
  1000
			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
  1001
			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
  1002
				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
  1003
				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
  1004
			}
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
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
			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
  1007
				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
  1008
			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
  1009
				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
  1010
		} 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
  1011
			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
  1012
			    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
  1013
		}
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1014
		if (err)
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1015
			break;
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
		size -= tocpy;
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
	dmu_buf_rele_array(dbp, numbufs, FTAG);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1020
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1021
	return (err);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1022
}
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1023
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1024
static int
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1025
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
  1026
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1027
	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
  1028
	int numbufs;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1029
	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
  1030
	int i;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1031
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1032
	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
  1033
	    FALSE, FTAG, &numbufs, &dbp, DMU_READ_PREFETCH);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1034
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1035
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1036
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1037
	for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1038
		int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1039
		int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1040
		dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1041
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1042
		ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1043
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
  1044
		bufoff = uio->uio_loffset - db->db_offset;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1045
		tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1046
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1047
		ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1048
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1049
		if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1050
			dmu_buf_will_fill(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1051
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1052
			dmu_buf_will_dirty(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1053
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1054
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1055
		 * XXX uiomove could block forever (eg. nfs-backed
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1056
		 * pages).  There needs to be a uiolockdown() function
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1057
		 * to lock the pages in memory, so that uiomove won't
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1058
		 * block.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1059
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1060
		err = uiomove((char *)db->db_data + bufoff, tocpy,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1061
		    UIO_WRITE, uio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1062
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1063
		if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1064
			dmu_buf_fill_done(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1065
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1066
		if (err)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1067
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1068
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1069
		size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1070
	}
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1071
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1072
	dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1073
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1074
}
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1075
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1076
int
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1077
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
  1078
    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
  1079
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1080
	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
  1081
	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
  1082
	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
  1083
12123
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1084
	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
  1085
		return (0);
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1086
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1087
	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
  1088
	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
  1089
	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
  1090
	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
  1091
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1092
	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
  1093
}
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
int
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1096
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
  1097
    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
  1098
{
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1099
	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
  1100
	int err;
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1101
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1102
	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
  1103
		return (0);
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 = 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
  1106
	if (err)
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1107
		return (err);
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
	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
  1110
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1111
	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
  1112
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1113
	return (err);
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1114
}
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1115
bb40732a982e 6572591 meta dnode lookup causes bucket lock contention in dbuf hash
Tim Haley <Tim.Haley@Sun.COM>
parents: 11935
diff changeset
  1116
int
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1117
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
  1118
    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
  1119
{
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1120
	dmu_buf_t **dbp;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1121
	int numbufs, i;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1122
	int err;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1123
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1124
	if (size == 0)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1125
		return (0);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1126
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1127
	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
  1128
	    FALSE, FTAG, &numbufs, &dbp);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1129
	if (err)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1130
		return (err);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1131
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1132
	for (i = 0; i < numbufs; i++) {
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1133
		int tocpy, copied, thiscpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1134
		int bufoff;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1135
		dmu_buf_t *db = dbp[i];
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1136
		caddr_t va;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1137
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1138
		ASSERT(size > 0);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1139
		ASSERT3U(db->db_size, >=, PAGESIZE);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1140
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1141
		bufoff = offset - db->db_offset;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1142
		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
  1143
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1144
		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
  1145
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1146
		if (tocpy == db->db_size)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1147
			dmu_buf_will_fill(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1148
		else
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1149
			dmu_buf_will_dirty(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1150
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1151
		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
  1152
			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
  1153
			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
  1154
			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
  1155
			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
  1156
			zfs_unmap_page(pp, va);
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1157
			pp = pp->p_next;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1158
			bufoff += PAGESIZE;
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
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1161
		if (tocpy == db->db_size)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1162
			dmu_buf_fill_done(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1163
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1164
		offset += tocpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1165
		size -= tocpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1166
	}
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1167
	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
  1168
	return (err);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
  1169
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1170
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1171
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1172
/*
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1173
 * Allocate a loaned anonymous arc buffer.
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1174
 */
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1175
arc_buf_t *
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1176
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
  1177
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1178
	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
  1179
	spa_t *spa;
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1180
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1181
	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
  1182
	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
  1183
}
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1184
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1185
/*
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1186
 * Free a loaned arc buffer.
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1187
 */
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1188
void
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1189
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
  1190
{
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1191
	arc_return_buf(buf, FTAG);
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1192
	VERIFY(arc_buf_remove_ref(buf, FTAG) == 1);
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1193
}
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1194
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
 * 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
  1197
 * 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
  1198
 * dmu_write().
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1199
 */
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1200
void
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1201
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
  1202
    dmu_tx_t *tx)
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1203
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1204
	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
  1205
	dnode_t *dn;
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1206
	dmu_buf_impl_t *db;
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1207
	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
  1208
	uint64_t blkid;
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1209
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1210
	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
  1211
	dn = DB_DNODE(dbuf);
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1212
	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
  1213
	blkid = dbuf_whichblock(dn, offset);
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1214
	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
  1215
	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
  1216
	DB_DNODE_EXIT(dbuf);
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1217
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1218
	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
  1219
		dbuf_assign_arcbuf(db, buf, tx);
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1220
		dbuf_rele(db, FTAG);
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1221
	} 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
  1222
		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
  1223
		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
  1224
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_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
  1226
		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
  1227
		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
  1228
		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
  1229
		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
  1230
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1231
		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
  1232
		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
  1233
		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
  1234
		XUIOSTAT_BUMP(xuiostat_wbuf_copied);
9412
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1235
	}
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1236
}
4aefd8704ce0 6717022 ZFS DMU needs zero-copy support
Aleksandr Guzovskiy <Aleksandr.Guzovskiy@Sun.COM>
parents: 9396
diff changeset
  1237
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1238
typedef struct {
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1239
	dbuf_dirty_record_t	*dsa_dr;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1240
	dmu_sync_cb_t		*dsa_done;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1241
	zgd_t			*dsa_zgd;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1242
	dmu_tx_t		*dsa_tx;
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1243
} dmu_sync_arg_t;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1244
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1245
/* ARGSUSED */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1246
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
  1247
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
  1248
{
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1249
	dmu_sync_arg_t *dsa = varg;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1250
	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
  1251
	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
  1252
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1253
	if (zio->io_error == 0) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1254
		if (BP_IS_HOLE(bp)) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1255
			/*
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1256
			 * 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
  1257
			 * 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
  1258
			 */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1259
			BP_SET_LSIZE(bp, db->db_size);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1260
		} else {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1261
			ASSERT(BP_GET_LEVEL(bp) == 0);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1262
			bp->blk_fill = 1;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1263
		}
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
  1264
	}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1265
}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7468
diff changeset
  1266
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1267
static void
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1268
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
  1269
{
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1270
	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
  1271
}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1272
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
  1273
/* 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
  1274
static void
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1275
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
  1276
{
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1277
	dmu_sync_arg_t *dsa = varg;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1278
	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
  1279
	dmu_buf_impl_t *db = dr->dr_dbuf;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1280
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
  1281
	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
  1282
	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
  1283
	if (zio->io_error == 0) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1284
		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
  1285
		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
  1286
		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
  1287
		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
  1288
			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
  1289
	} else {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1290
		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
  1291
	}
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1292
	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
  1293
	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
  1294
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1295
	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
  1296
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1297
	kmem_free(dsa, sizeof (*dsa));
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1298
}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1299
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1300
static void
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1301
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
  1302
{
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1303
	blkptr_t *bp = zio->io_bp;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1304
	dmu_sync_arg_t *dsa = zio->io_private;
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
	if (zio->io_error == 0 && !BP_IS_HOLE(bp)) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1307
		ASSERT(zio->io_bp->blk_birth == zio->io_txg);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1308
		ASSERT(zio->io_txg > spa_syncing_txg(zio->io_spa));
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1309
		zio_free(zio->io_spa, zio->io_txg, zio->io_bp);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1310
	}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1311
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1312
	dmu_tx_commit(dsa->dsa_tx);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1313
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1314
	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
  1315
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1316
	kmem_free(dsa, sizeof (*dsa));
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1317
}
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1318
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1319
static int
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1320
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
  1321
    zio_prop_t *zp, zbookmark_t *zb)
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1322
{
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1323
	dmu_sync_arg_t *dsa;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1324
	dmu_tx_t *tx;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1325
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1326
	tx = dmu_tx_create(os);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1327
	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
  1328
	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
  1329
		dmu_tx_abort(tx);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1330
		return (EIO);	/* Make zl_get_data do txg_waited_synced() */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1331
	}
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
	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
  1334
	dsa->dsa_dr = NULL;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1335
	dsa->dsa_done = done;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1336
	dsa->dsa_zgd = zgd;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1337
	dsa->dsa_tx = tx;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1338
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1339
	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
  1340
	    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
  1341
	    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
  1342
	    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
  1343
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1344
	return (0);
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1345
}
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1346
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1347
/*
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1348
 * Intent log support: sync the block associated with db to disk.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1349
 * 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
  1350
 * data isn't changing while dmu_sync() is writing it.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1351
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1352
 * Return values:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1353
 *
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1354
 *	EEXIST: this txg has already been synced, so there's nothing to to.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1355
 *		The caller should not log the write.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1356
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1357
 *	ENOENT: the block was dbuf_free_range()'d, so there's nothing to do.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1358
 *		The caller should not log the write.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1359
 *
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1360
 *	EALREADY: this block is already in the process of being synced.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1361
 *		The caller should track its progress (somehow).
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1362
 *
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1363
 *	EIO: could not do the I/O.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1364
 *		The caller should do a txg_wait_synced().
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1365
 *
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1366
 *	0: the I/O has been initiated.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1367
 *		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
  1368
 *		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
  1369
 *		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
  1370
 *		propagated to pio from zio_done().
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1371
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1372
int
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1373
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
  1374
{
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1375
	blkptr_t *bp = zgd->zgd_bp;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1376
	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
  1377
	objset_t *os = db->db_objset;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1378
	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
  1379
	dbuf_dirty_record_t *dr;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1380
	dmu_sync_arg_t *dsa;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1381
	zbookmark_t zb;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1382
	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
  1383
	dnode_t *dn;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1384
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1385
	ASSERT(pio != NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1386
	ASSERT(BP_IS_HOLE(bp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1387
	ASSERT(txg != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1388
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1389
	SET_BOOKMARK(&zb, ds->ds_object,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1390
	    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
  1391
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1392
	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
  1393
	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
  1394
	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
  1395
	DB_DNODE_EXIT(db);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1396
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1397
	/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1398
	 * 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
  1399
	 */
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1400
	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
  1401
		return (dmu_sync_late_arrival(pio, os, done, zgd, &zp, &zb));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1402
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1403
	/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1404
	 * 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
  1405
	 * 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
  1406
	 * 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
  1407
	 * sync thread will block in dbuf_sync_leaf() until we drop db_mtx.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1408
	 */
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1409
	mutex_enter(&db->db_mtx);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1410
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1411
	if (txg <= spa_last_synced_txg(os->os_spa)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1412
		/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1413
		 * This txg has already synced.  There's nothing to do.
789
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
		mutex_exit(&db->db_mtx);
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1416
		return (EEXIST);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1417
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1418
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1419
	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
  1420
		/*
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1421
		 * 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
  1422
		 * 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
  1423
		 */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1424
		mutex_exit(&db->db_mtx);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1425
		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
  1426
	}
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1427
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1428
	dr = db->db_last_dirty;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1429
	while (dr && dr->dr_txg != txg)
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1430
		dr = dr->dr_next;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1431
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1432
	if (dr == NULL) {
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1433
		/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1434
		 * 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
  1435
		 * 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
  1436
		 */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1437
		mutex_exit(&db->db_mtx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1438
		return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1439
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1440
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1441
	ASSERT(dr->dr_txg == txg);
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1442
	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
  1443
	    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
  1444
		/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1445
		 * 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
  1446
		 * 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
  1447
		 * 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
  1448
		 */
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1449
		mutex_exit(&db->db_mtx);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1450
		return (EALREADY);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1451
	}
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1452
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1453
	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
  1454
	dr->dt.dl.dr_override_state = DR_IN_DMU_SYNC;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
  1455
	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
  1456
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1457
	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
  1458
	dsa->dsa_dr = dr;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1459
	dsa->dsa_done = done;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1460
	dsa->dsa_zgd = zgd;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1461
	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
  1462
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1463
	zio_nowait(arc_write(pio, os->os_spa, txg,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1464
	    bp, dr->dt.dl.dr_data, DBUF_IS_L2CACHEABLE(db), &zp,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1465
	    dmu_sync_ready, dmu_sync_done, dsa,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1466
	    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
  1467
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1468
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1469
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1470
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1471
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1472
dmu_object_set_blocksize(objset_t *os, uint64_t object, uint64_t size, int ibs,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1473
	dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1474
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1475
	dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1476
	int err;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1477
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
  1478
	err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1479
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1480
		return (err);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1481
	err = dnode_set_blksz(dn, size, ibs, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1482
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1483
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1484
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1485
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1486
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1487
dmu_object_set_checksum(objset_t *os, uint64_t object, uint8_t checksum,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1488
	dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1489
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1490
	dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1491
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1492
	/* 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
  1493
	(void) dnode_hold(os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1494
	ASSERT(checksum < ZIO_CHECKSUM_FUNCTIONS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1495
	dn->dn_checksum = checksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1496
	dnode_setdirty(dn, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1497
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1498
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1499
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1500
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1501
dmu_object_set_compress(objset_t *os, uint64_t object, uint8_t compress,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1502
	dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1503
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1504
	dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1505
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1506
	/* 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
  1507
	(void) dnode_hold(os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1508
	ASSERT(compress < ZIO_COMPRESS_FUNCTIONS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1509
	dn->dn_compress = compress;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1510
	dnode_setdirty(dn, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1511
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1512
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1513
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1514
int zfs_mdcomp_disable = 0;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1515
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1516
void
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1517
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
  1518
{
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1519
	dmu_object_type_t type = dn ? dn->dn_type : DMU_OT_OBJSET;
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 12684
diff changeset
  1520
	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
  1521
	    (wp & WP_SPILL));
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1522
	enum zio_checksum checksum = os->os_checksum;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1523
	enum zio_compress compress = os->os_compress;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1524
	enum zio_checksum dedup_checksum = os->os_dedup_checksum;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1525
	boolean_t dedup;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1526
	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
  1527
	int copies = os->os_copies;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1528
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1529
	/*
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1530
	 * Determine checksum setting.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1531
	 */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1532
	if (ismd) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1533
		/*
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1534
		 * Metadata always gets checksummed.  If the data
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1535
		 * 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
  1536
		 * 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
  1537
		 * as well.  Otherwise, the metadata checksum defaults
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1538
		 * to fletcher4.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1539
		 */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1540
		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
  1541
		    zio_checksum_table[checksum].ci_eck)
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1542
			checksum = ZIO_CHECKSUM_FLETCHER_4;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1543
	} else {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1544
		checksum = zio_checksum_select(dn->dn_checksum, checksum);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1545
	}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1546
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1547
	/*
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1548
	 * Determine compression setting.
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
	if (ismd) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1551
		/*
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1552
		 * XXX -- we should design a compression algorithm
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1553
		 * that specializes in arrays of bps.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1554
		 */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1555
		compress = zfs_mdcomp_disable ? ZIO_COMPRESS_EMPTY :
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1556
		    ZIO_COMPRESS_LZJB;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1557
	} else {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1558
		compress = zio_compress_select(dn->dn_compress, compress);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1559
	}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1560
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1561
	/*
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1562
	 * Determine dedup setting.  If we are in dmu_sync(), we won't
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1563
	 * actually dedup now because that's all done in syncing context;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1564
	 * but we do want to use the dedup checkum.  If the checksum is not
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1565
	 * strong enough to ensure unique signatures, force dedup_verify.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1566
	 */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1567
	dedup = (!ismd && dedup_checksum != ZIO_CHECKSUM_OFF);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1568
	if (dedup) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1569
		checksum = dedup_checksum;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1570
		if (!zio_checksum_table[checksum].ci_dedup)
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1571
			dedup_verify = 1;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1572
	}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1573
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1574
	if (wp & WP_DMU_SYNC)
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1575
		dedup = 0;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1576
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1577
	if (wp & WP_NOFILL) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1578
		ASSERT(!ismd && level == 0);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1579
		checksum = ZIO_CHECKSUM_OFF;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1580
		compress = ZIO_COMPRESS_OFF;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1581
		dedup = B_FALSE;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1582
	}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1583
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1584
	zp->zp_checksum = checksum;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1585
	zp->zp_compress = compress;
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
  1586
	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
  1587
	zp->zp_level = level;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1588
	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
  1589
	zp->zp_dedup = dedup;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1590
	zp->zp_dedup_verify = dedup && dedup_verify;
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
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
  1593
int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1594
dmu_offset_next(objset_t *os, uint64_t object, boolean_t hole, uint64_t *off)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1595
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1596
	dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1597
	int i, err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1598
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
  1599
	err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1600
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1601
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1602
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1603
	 * Sync any current changes before
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1604
	 * we go trundling through the block pointers.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1605
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1606
	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
  1607
		if (list_link_active(&dn->dn_dirty_link[i]))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1608
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1609
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1610
	if (i != TXG_SIZE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1611
		dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1612
		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
  1613
		err = dnode_hold(os, object, FTAG, &dn);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1614
		if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1615
			return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1616
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1617
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 5450
diff changeset
  1618
	err = dnode_next_offset(dn, (hole ? DNODE_FIND_HOLE : 0), off, 1, 1, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1619
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1620
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1621
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1622
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1623
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1624
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1625
dmu_object_info_from_dnode(dnode_t *dn, dmu_object_info_t *doi)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1626
{
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1627
	dnode_phys_t *dnp;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1628
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1629
	rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1630
	mutex_enter(&dn->dn_mtx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1631
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1632
	dnp = dn->dn_phys;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1633
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1634
	doi->doi_data_block_size = dn->dn_datablksz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1635
	doi->doi_metadata_block_size = dn->dn_indblkshift ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1636
	    1ULL << dn->dn_indblkshift : 0;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1637
	doi->doi_type = dn->dn_type;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1638
	doi->doi_bonus_type = dn->dn_bonustype;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1639
	doi->doi_bonus_size = dn->dn_bonuslen;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1640
	doi->doi_indirection = dn->dn_nlevels;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1641
	doi->doi_checksum = dn->dn_checksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1642
	doi->doi_compress = dn->dn_compress;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1643
	doi->doi_physical_blocks_512 = (DN_USED_BYTES(dnp) + 256) >> 9;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1644
	doi->doi_max_offset = (dnp->dn_maxblkid + 1) * dn->dn_datablksz;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1645
	doi->doi_fill_count = 0;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10810
diff changeset
  1646
	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
  1647
		doi->doi_fill_count += dnp->dn_blkptr[i].blk_fill;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1648
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1649
	mutex_exit(&dn->dn_mtx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1650
	rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1651
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1652
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1653
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1654
 * Get information on a DMU object.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1655
 * If doi is NULL, just indicates whether the object exists.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1656
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1657
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1658
dmu_object_info(objset_t *os, uint64_t object, dmu_object_info_t *doi)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1659
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
  1660
	dnode_t *dn;
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10242
diff changeset
  1661
	int err = dnode_hold(os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1662
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
	if (doi != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1667
		dmu_object_info_from_dnode(dn, doi);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1668
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1669
	dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1670
	return (0);
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
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1674
 * As above, but faster; can be used when you have a held dbuf in hand.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1675
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1676
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
  1677
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
  1678
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1679
	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
  1680
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1681
	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
  1682
	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
  1683
	DB_DNODE_EXIT(db);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1684
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1685
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1686
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1687
 * Faster still when you only care about the size.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1688
 * This is specifically optimized for zfs_getattr().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1689
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1690
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
  1691
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
  1692
    u_longlong_t *nblk512)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1693
{
12684
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1694
	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
  1695
	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
  1696
397e44ebb8a9 6710343 dnode cache should register a dnode_move() callback to limit fragmentation
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 12493
diff changeset
  1697
	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
  1698
	dn = DB_DNODE(db);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1699
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1700
	*blksize = dn->dn_datablksz;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1701
	/* add 1 for dnode space */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1702
	*nblk512 = ((DN_USED_BYTES(dn->dn_phys) + SPA_MINBLOCKSIZE/2) >>
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1703
	    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
  1704
	DB_DNODE_EXIT(db);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1705
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1706
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1707
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1708
byteswap_uint64_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1709
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1710
	uint64_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1711
	size_t count = size >> 3;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1712
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1713
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1714
	ASSERT((size & 7) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1715
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1716
	for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1717
		buf[i] = BSWAP_64(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1718
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1719
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1720
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1721
byteswap_uint32_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1722
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1723
	uint32_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1724
	size_t count = size >> 2;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1725
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1726
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1727
	ASSERT((size & 3) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1728
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1729
	for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1730
		buf[i] = BSWAP_32(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1731
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1732
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1733
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1734
byteswap_uint16_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1735
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1736
	uint16_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1737
	size_t count = size >> 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1738
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1739
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1740
	ASSERT((size & 1) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1741
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1742
	for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1743
		buf[i] = BSWAP_16(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1744
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1745
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1746
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1747
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1748
byteswap_uint8_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1749
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1750
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1751
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1752
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1753
dmu_init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1754
{
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12285
diff changeset
  1755
	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
  1756
	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
  1757
	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
  1758
	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
  1759
	dnode_init();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1760
	dbuf_init();
10474
0e96dd3b905a 6859997 zfs caching performance problem
Rich Morris <Richard.Morris@Sun.COM>
parents: 10298
diff changeset
  1761
	zfetch_init();
13776
cd512c80fd75 3086 unnecessarily setting DS_FLAG_INCONSISTENT on async destroyed datasets
Matthew Ahrens <mahrens@delphix.com>
parents: 13700
diff changeset
  1762
	l2arc_init();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1763
	arc_init();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1764
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1765
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1766
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1767
dmu_fini(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1768
{
13776
cd512c80fd75 3086 unnecessarily setting DS_FLAG_INCONSISTENT on async destroyed datasets
Matthew Ahrens <mahrens@delphix.com>
parents: 13700
diff changeset
  1769
	arc_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
  1770
	l2arc_fini();
10474
0e96dd3b905a 6859997 zfs caching performance problem
Rich Morris <Richard.Morris@Sun.COM>
parents: 10298
diff changeset
  1771
	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
  1772
	dbuf_fini();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1773
	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
  1774
	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
  1775
	xuio_stat_fini();
11935
538c866aaac6 6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11670
diff changeset
  1776
	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
  1777
	zfs_dbgmsg_fini();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1778
}