usr/src/uts/common/fs/zfs/zfs_log.c
author perrin
Wed, 09 Apr 2008 19:59:39 -0700
changeset 6396 09c523979832
parent 6101 915df4cedbc9
child 6514 852c82a1989c
permissions -rw-r--r--
6683293 concurrent O_DSYNC writes to a fileset can be much improved over NFS
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
1669
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
     5
 * Common Development and Distribution License (the "License").
3521dbbcb2e8 6343608 ZFS file range locking
perrin
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
/*
6101
915df4cedbc9 6658511 zl_itx_list_sz incorrect for WR_NEED_COPY writes
perrin
parents: 5435
diff changeset
    22
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <sys/types.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#include <sys/param.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <sys/systm.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/sysmacros.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/cmn_err.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/kmem.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
#include <sys/thread.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/file.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <sys/vfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <sys/zfs_znode.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#include <sys/zfs_dir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
#include <sys/zil.h>
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
    40
#include <sys/zil_impl.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
#include <sys/byteorder.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
#include <sys/policy.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
#include <sys/stat.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
#include <sys/mode.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
#include <sys/acl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
#include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
#include <sys/spa.h>
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    48
#include <sys/zfs_fuid.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
#include <sys/ddi.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
 * All the functions in this file are used to construct the log entries
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    53
 * to record transactions. They allocate * an intent log transaction
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
 * structure (itx_t) and save within it all the information necessary to
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
 * possibly replay the transaction. The itx is then assigned a sequence
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
 * number and inserted in the in-memory list anchored in the zilog.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    59
int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    60
zfs_log_create_txtype(zil_create_t type, vsecattr_t *vsecp, vattr_t *vap)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    61
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    62
	int isxvattr = (vap->va_mask & AT_XVATTR);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    63
	switch (type) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    64
	case Z_FILE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    65
		if (vsecp == NULL && !isxvattr)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    66
			return (TX_CREATE);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    67
		if (vsecp && isxvattr)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    68
			return (TX_CREATE_ACL_ATTR);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    69
		if (vsecp)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    70
			return (TX_CREATE_ACL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    71
		else
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    72
			return (TX_CREATE_ATTR);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    73
		/*NOTREACHED*/
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    74
	case Z_DIR:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    75
		if (vsecp == NULL && !isxvattr)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    76
			return (TX_MKDIR);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    77
		if (vsecp && isxvattr)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    78
			return (TX_MKDIR_ACL_ATTR);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    79
		if (vsecp)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    80
			return (TX_MKDIR_ACL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    81
		else
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    82
			return (TX_MKDIR_ATTR);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    83
	case Z_XATTRDIR:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    84
		return (TX_MKXATTR);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    85
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    86
	ASSERT(0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    87
	return (TX_MAX_TYPE);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    88
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    89
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
/*
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    91
 * build up the log data necessary for logging xvattr_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    92
 * First lr_attr_t is initialized.  following the lr_attr_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    93
 * is the mapsize and attribute bitmap copied from the xvattr_t.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    94
 * Following the bitmap and bitmapsize two 64 bit words are reserved
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    95
 * for the create time which may be set.  Following the create time
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    96
 * records a single 64 bit integer which has the bits to set on
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    97
 * replay for the xvattr.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    98
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
    99
static void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   100
zfs_log_xvattr(lr_attr_t *lrattr, xvattr_t *xvap)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   101
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   102
	uint32_t	*bitmap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   103
	uint64_t	*attrs;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   104
	uint64_t	*crtime;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   105
	xoptattr_t	*xoap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   106
	void		*scanstamp;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   107
	int		i;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   108
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   109
	xoap = xva_getxoptattr(xvap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   110
	ASSERT(xoap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   111
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   112
	lrattr->lr_attr_masksize = xvap->xva_mapsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   113
	bitmap = &lrattr->lr_attr_bitmap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   114
	for (i = 0; i != xvap->xva_mapsize; i++, bitmap++) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   115
		*bitmap = xvap->xva_reqattrmap[i];
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   116
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   117
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   118
	/* Now pack the attributes up in a single uint64_t */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   119
	attrs = (uint64_t *)bitmap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   120
	crtime = attrs + 1;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   121
	scanstamp = (caddr_t)(crtime + 2);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   122
	*attrs = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   123
	if (XVA_ISSET_REQ(xvap, XAT_READONLY))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   124
		*attrs |= (xoap->xoa_readonly == 0) ? 0 :
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   125
		    XAT0_READONLY;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   126
	if (XVA_ISSET_REQ(xvap, XAT_HIDDEN))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   127
		*attrs |= (xoap->xoa_hidden == 0) ? 0 :
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   128
		    XAT0_HIDDEN;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   129
	if (XVA_ISSET_REQ(xvap, XAT_SYSTEM))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   130
		*attrs |= (xoap->xoa_system == 0) ? 0 :
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   131
		    XAT0_SYSTEM;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   132
	if (XVA_ISSET_REQ(xvap, XAT_ARCHIVE))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   133
		*attrs |= (xoap->xoa_archive == 0) ? 0 :
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   134
		    XAT0_ARCHIVE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   135
	if (XVA_ISSET_REQ(xvap, XAT_IMMUTABLE))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   136
		*attrs |= (xoap->xoa_immutable == 0) ? 0 :
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   137
		    XAT0_IMMUTABLE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   138
	if (XVA_ISSET_REQ(xvap, XAT_NOUNLINK))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   139
		*attrs |= (xoap->xoa_nounlink == 0) ? 0 :
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   140
		    XAT0_NOUNLINK;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   141
	if (XVA_ISSET_REQ(xvap, XAT_APPENDONLY))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   142
		*attrs |= (xoap->xoa_appendonly == 0) ? 0 :
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   143
		    XAT0_APPENDONLY;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   144
	if (XVA_ISSET_REQ(xvap, XAT_OPAQUE))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   145
		*attrs |= (xoap->xoa_opaque == 0) ? 0 :
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   146
		    XAT0_APPENDONLY;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   147
	if (XVA_ISSET_REQ(xvap, XAT_NODUMP))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   148
		*attrs |= (xoap->xoa_nodump == 0) ? 0 :
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   149
		    XAT0_NODUMP;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   150
	if (XVA_ISSET_REQ(xvap, XAT_AV_QUARANTINED))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   151
		*attrs |= (xoap->xoa_av_quarantined == 0) ? 0 :
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   152
		    XAT0_AV_QUARANTINED;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   153
	if (XVA_ISSET_REQ(xvap, XAT_AV_MODIFIED))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   154
		*attrs |= (xoap->xoa_av_modified == 0) ? 0 :
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   155
		    XAT0_AV_MODIFIED;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   156
	if (XVA_ISSET_REQ(xvap, XAT_CREATETIME))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   157
		ZFS_TIME_ENCODE(&xoap->xoa_createtime, crtime);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   158
	if (XVA_ISSET_REQ(xvap, XAT_AV_SCANSTAMP))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   159
		bcopy(xoap->xoa_av_scanstamp, scanstamp, AV_SCANSTAMP_SZ);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   160
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   161
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   162
static void *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   163
zfs_log_fuid_ids(zfs_fuid_info_t *fuidp, void *start)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   164
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   165
	zfs_fuid_t *zfuid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   166
	uint64_t *fuidloc = start;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   167
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   168
	/* First copy in the ACE FUIDs */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   169
	for (zfuid = list_head(&fuidp->z_fuids); zfuid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   170
	    zfuid = list_next(&fuidp->z_fuids, zfuid)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   171
		*fuidloc++ = zfuid->z_logfuid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   172
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   173
	return (fuidloc);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   174
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   175
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   176
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   177
static void *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   178
zfs_log_fuid_domains(zfs_fuid_info_t *fuidp, void *start)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   179
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   180
	zfs_fuid_domain_t *zdomain;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   181
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   182
	/* now copy in the domain info, if any */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   183
	if (fuidp->z_domain_str_sz != 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   184
		for (zdomain = list_head(&fuidp->z_domains); zdomain;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   185
		    zdomain = list_next(&fuidp->z_domains, zdomain)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   186
			bcopy((void *)zdomain->z_domain, start,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   187
			    strlen(zdomain->z_domain) + 1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   188
			start = (caddr_t)start +
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   189
			    strlen(zdomain->z_domain) + 1;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   190
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   191
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   192
	return (start);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   193
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   194
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   195
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   196
 * zfs_log_create() is used to handle TX_CREATE, TX_CREATE_ATTR, TX_MKDIR,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   197
 * TX_MKDIR_ATTR and TX_MKXATTR
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   198
 * transactions.
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   199
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   200
 * TX_CREATE and TX_MKDIR are standard creates, but they may have FUID
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   201
 * domain information appended prior to the name.  In this case the
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   202
 * uid/gid in the log record will be a log centric FUID.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   203
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   204
 * TX_CREATE_ACL_ATTR and TX_MKDIR_ACL_ATTR handle special creates that
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   205
 * may contain attributes, ACL and optional fuid information.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   206
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   207
 * TX_CREATE_ACL and TX_MKDIR_ACL handle special creates that specify
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   208
 * and ACL and normal users/groups in the ACEs.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   209
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   210
 * There may be an optional xvattr attribute information similar
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   211
 * to zfs_log_setattr.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   212
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   213
 * Also, after the file name "domain" strings may be appended.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   214
 */
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   215
void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   216
zfs_log_create(zilog_t *zilog, dmu_tx_t *tx, uint64_t txtype,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   217
    znode_t *dzp, znode_t *zp, char *name, vsecattr_t *vsecp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   218
    zfs_fuid_info_t *fuidp, vattr_t *vap)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
	itx_t *itx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   221
	uint64_t seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
	lr_create_t *lr;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   223
	lr_acl_create_t *lracl;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   224
	size_t aclsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   225
	size_t xvatsize = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   226
	size_t txsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   227
	xvattr_t *xvap = (xvattr_t *)vap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   228
	void *end;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   229
	size_t lrsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   230
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   231
	size_t namesize = strlen(name) + 1;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   232
	size_t fuidsz = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
	if (zilog == NULL)
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   235
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   237
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   238
	 * If we have FUIDs present then add in space for
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   239
	 * domains and ACE fuid's if any.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   240
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   241
	if (fuidp) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   242
		fuidsz += fuidp->z_domain_str_sz;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   243
		fuidsz += fuidp->z_fuid_cnt * sizeof (uint64_t);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   244
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   245
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   246
	if (vap->va_mask & AT_XVATTR)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   247
		xvatsize = ZIL_XVAT_SIZE(xvap->xva_mapsize);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   248
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   249
	if ((int)txtype == TX_CREATE_ATTR || (int)txtype == TX_MKDIR_ATTR ||
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   250
	    (int)txtype == TX_CREATE || (int)txtype == TX_MKDIR ||
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   251
	    (int)txtype == TX_MKXATTR) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   252
		txsize = sizeof (*lr) + namesize + fuidsz + xvatsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   253
		lrsize = sizeof (*lr);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   254
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   255
		aclsize = (vsecp) ? vsecp->vsa_aclentsz : 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   256
		txsize =
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   257
		    sizeof (lr_acl_create_t) + namesize + fuidsz +
5435
1be0be66916d 6624956 zfs_log_fuid_ids can cause panic on sparc
marks
parents: 5331
diff changeset
   258
		    ZIL_ACE_LENGTH(aclsize) + xvatsize;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   259
		lrsize = sizeof (lr_acl_create_t);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   260
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   261
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   262
	itx = zil_itx_create(txtype, txsize);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   263
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   264
	lr = (lr_create_t *)&itx->itx_lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   265
	lr->lr_doid = dzp->z_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   266
	lr->lr_foid = zp->z_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   267
	lr->lr_mode = zp->z_phys->zp_mode;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   268
	if (!IS_EPHEMERAL(zp->z_phys->zp_uid)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   269
		lr->lr_uid = (uint64_t)zp->z_phys->zp_uid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   270
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   271
		lr->lr_uid = fuidp->z_fuid_owner;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   272
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   273
	if (!IS_EPHEMERAL(zp->z_phys->zp_gid)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   274
		lr->lr_gid = (uint64_t)zp->z_phys->zp_gid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   275
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   276
		lr->lr_gid = fuidp->z_fuid_group;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   277
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
	lr->lr_gen = zp->z_phys->zp_gen;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   279
	lr->lr_crtime[0] = zp->z_phys->zp_crtime[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
	lr->lr_crtime[1] = zp->z_phys->zp_crtime[1];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
	lr->lr_rdev = zp->z_phys->zp_rdev;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   282
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   283
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   284
	 * Fill in xvattr info if any
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   285
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   286
	if (vap->va_mask & AT_XVATTR) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   287
		zfs_log_xvattr((lr_attr_t *)((caddr_t)lr + lrsize), xvap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   288
		end = (caddr_t)lr + lrsize + xvatsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   289
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   290
		end = (caddr_t)lr + lrsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   291
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   292
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   293
	/* Now fill in any ACL info */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   294
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   295
	if (vsecp) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   296
		lracl = (lr_acl_create_t *)&itx->itx_lr;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   297
		lracl->lr_aclcnt = vsecp->vsa_aclcnt;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   298
		lracl->lr_acl_bytes = aclsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   299
		lracl->lr_domcnt = fuidp ? fuidp->z_domain_cnt : 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   300
		lracl->lr_fuidcnt  = fuidp ? fuidp->z_fuid_cnt : 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   301
		if (vsecp->vsa_aclflags & VSA_ACE_ACLFLAGS)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   302
			lracl->lr_acl_flags = (uint64_t)vsecp->vsa_aclflags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   303
		else
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   304
			lracl->lr_acl_flags = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   305
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   306
		bcopy(vsecp->vsa_aclentp, end, aclsize);
5435
1be0be66916d 6624956 zfs_log_fuid_ids can cause panic on sparc
marks
parents: 5331
diff changeset
   307
		end = (caddr_t)end + ZIL_ACE_LENGTH(aclsize);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   308
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   309
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   310
	/* drop in FUID info */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   311
	if (fuidp) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   312
		end = zfs_log_fuid_ids(fuidp, end);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   313
		end = zfs_log_fuid_domains(fuidp, end);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   314
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   315
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   316
	 * Now place file name in log record
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   317
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   318
	bcopy(name, end, namesize);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   319
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   320
	seq = zil_itx_assign(zilog, itx, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   321
	dzp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
	zp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   323
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   324
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
 * zfs_log_remove() handles both TX_REMOVE and TX_RMDIR transactions.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   327
 */
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   328
void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   329
zfs_log_remove(zilog_t *zilog, dmu_tx_t *tx, uint64_t txtype,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
	znode_t *dzp, char *name)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   331
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   332
	itx_t *itx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   333
	uint64_t seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   334
	lr_remove_t *lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   335
	size_t namesize = strlen(name) + 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   336
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   337
	if (zilog == NULL)
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   338
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   339
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   340
	itx = zil_itx_create(txtype, sizeof (*lr) + namesize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   341
	lr = (lr_remove_t *)&itx->itx_lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   342
	lr->lr_doid = dzp->z_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   343
	bcopy(name, (char *)(lr + 1), namesize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   344
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   345
	seq = zil_itx_assign(zilog, itx, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   346
	dzp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   347
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   348
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   349
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   350
 * zfs_log_link() handles TX_LINK transactions.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   351
 */
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   352
void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   353
zfs_log_link(zilog_t *zilog, dmu_tx_t *tx, uint64_t txtype,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   354
	znode_t *dzp, znode_t *zp, char *name)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   355
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   356
	itx_t *itx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   357
	uint64_t seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   358
	lr_link_t *lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   359
	size_t namesize = strlen(name) + 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   360
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   361
	if (zilog == NULL)
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   362
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   363
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   364
	itx = zil_itx_create(txtype, sizeof (*lr) + namesize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   365
	lr = (lr_link_t *)&itx->itx_lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   366
	lr->lr_doid = dzp->z_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   367
	lr->lr_link_obj = zp->z_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   368
	bcopy(name, (char *)(lr + 1), namesize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   369
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   370
	seq = zil_itx_assign(zilog, itx, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   371
	dzp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   372
	zp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   373
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   374
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   375
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   376
 * zfs_log_symlink() handles TX_SYMLINK transactions.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   377
 */
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   378
void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   379
zfs_log_symlink(zilog_t *zilog, dmu_tx_t *tx, uint64_t txtype,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   380
    znode_t *dzp, znode_t *zp, char *name, char *link)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   381
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   382
	itx_t *itx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   383
	uint64_t seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   384
	lr_create_t *lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   385
	size_t namesize = strlen(name) + 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   386
	size_t linksize = strlen(link) + 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   387
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   388
	if (zilog == NULL)
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   389
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   390
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   391
	itx = zil_itx_create(txtype, sizeof (*lr) + namesize + linksize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   392
	lr = (lr_create_t *)&itx->itx_lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   393
	lr->lr_doid = dzp->z_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   394
	lr->lr_foid = zp->z_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   395
	lr->lr_mode = zp->z_phys->zp_mode;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   396
	lr->lr_uid = zp->z_phys->zp_uid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   397
	lr->lr_gid = zp->z_phys->zp_gid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   398
	lr->lr_gen = zp->z_phys->zp_gen;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   399
	lr->lr_crtime[0] = zp->z_phys->zp_crtime[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   400
	lr->lr_crtime[1] = zp->z_phys->zp_crtime[1];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   401
	bcopy(name, (char *)(lr + 1), namesize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   402
	bcopy(link, (char *)(lr + 1) + namesize, linksize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   403
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   404
	seq = zil_itx_assign(zilog, itx, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   405
	dzp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   406
	zp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   407
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   408
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   409
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   410
 * zfs_log_rename() handles TX_RENAME transactions.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   411
 */
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   412
void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   413
zfs_log_rename(zilog_t *zilog, dmu_tx_t *tx, uint64_t txtype,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   414
	znode_t *sdzp, char *sname, znode_t *tdzp, char *dname, znode_t *szp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   415
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   416
	itx_t *itx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   417
	uint64_t seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   418
	lr_rename_t *lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   419
	size_t snamesize = strlen(sname) + 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   420
	size_t dnamesize = strlen(dname) + 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   421
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   422
	if (zilog == NULL)
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   423
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   424
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   425
	itx = zil_itx_create(txtype, sizeof (*lr) + snamesize + dnamesize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   426
	lr = (lr_rename_t *)&itx->itx_lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   427
	lr->lr_sdoid = sdzp->z_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   428
	lr->lr_tdoid = tdzp->z_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   429
	bcopy(sname, (char *)(lr + 1), snamesize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   430
	bcopy(dname, (char *)(lr + 1) + snamesize, dnamesize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   431
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   432
	seq = zil_itx_assign(zilog, itx, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   433
	sdzp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   434
	tdzp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   435
	szp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   436
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   437
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   438
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   439
 * zfs_log_write() handles TX_WRITE transactions.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   440
 */
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 1669
diff changeset
   441
ssize_t zfs_immediate_write_sz = 32768;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   442
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   443
#define	ZIL_MAX_LOG_DATA (SPA_MAXBLOCKSIZE - sizeof (zil_trailer_t) - \
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   444
    sizeof (lr_write_t))
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   445
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   446
void
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   447
zfs_log_write(zilog_t *zilog, dmu_tx_t *tx, int txtype,
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   448
	znode_t *zp, offset_t off, ssize_t resid, int ioflag)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   449
{
1669
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   450
	itx_wr_state_t write_state;
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   451
	boolean_t slogging;
4720
8edc0d2e6f3f 6535160 Lock contention on zl_lock from zil_commit
fr157268
parents: 4620
diff changeset
   452
	uintptr_t fsync_cnt;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   453
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3063
diff changeset
   454
	if (zilog == NULL || zp->z_unlinked)
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   455
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   456
1669
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   457
	/*
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   458
	 * Writes are handled in three different ways:
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   459
	 *
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   460
	 * WR_INDIRECT:
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   461
	 *    If the write is greater than zfs_immediate_write_sz and there are
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   462
	 *    no separate logs in this pool then later *if* we need to log the
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   463
	 *    write then dmu_sync() is used to immediately write the block and
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   464
	 *    its block pointer is put in the log record.
1669
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   465
	 * WR_COPIED:
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   466
	 *    If we know we'll immediately be committing the
6396
09c523979832 6683293 concurrent O_DSYNC writes to a fileset can be much improved over NFS
perrin
parents: 6101
diff changeset
   467
	 *    transaction (FSYNC or FDSYNC), the we allocate a larger
1669
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   468
	 *    log record here for the data and copy the data in.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   469
	 * WR_NEED_COPY:
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   470
	 *    Otherwise we don't allocate a buffer, and *if* we need to
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   471
	 *    flush the write later then a buffer is allocated and
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   472
	 *    we retrieve the data using the dmu.
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   473
	 */
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   474
	slogging = spa_has_slogs(zilog->zl_spa);
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   475
	if (resid > zfs_immediate_write_sz && !slogging)
1669
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   476
		write_state = WR_INDIRECT;
6396
09c523979832 6683293 concurrent O_DSYNC writes to a fileset can be much improved over NFS
perrin
parents: 6101
diff changeset
   477
	else if (ioflag & (FSYNC | FDSYNC))
1669
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   478
		write_state = WR_COPIED;
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3461
diff changeset
   479
	else
1669
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   480
		write_state = WR_NEED_COPY;
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3461
diff changeset
   481
4720
8edc0d2e6f3f 6535160 Lock contention on zl_lock from zil_commit
fr157268
parents: 4620
diff changeset
   482
	if ((fsync_cnt = (uintptr_t)tsd_get(zfs_fsyncer_key)) != 0) {
8edc0d2e6f3f 6535160 Lock contention on zl_lock from zil_commit
fr157268
parents: 4620
diff changeset
   483
		(void) tsd_set(zfs_fsyncer_key, (void *)(fsync_cnt - 1));
8edc0d2e6f3f 6535160 Lock contention on zl_lock from zil_commit
fr157268
parents: 4620
diff changeset
   484
	}
8edc0d2e6f3f 6535160 Lock contention on zl_lock from zil_commit
fr157268
parents: 4620
diff changeset
   485
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   486
	while (resid) {
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   487
		itx_t *itx;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   488
		lr_write_t *lr;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   489
		ssize_t len;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   490
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   491
		/*
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   492
		 * If there are slogs and the write would overflow the largest
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   493
		 * block, then because we don't want to use the main pool
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   494
		 * to dmu_sync, we have to split the write.
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   495
		 */
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   496
		if (slogging && resid > ZIL_MAX_LOG_DATA)
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   497
			len = SPA_MAXBLOCKSIZE >> 1;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   498
		else
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   499
			len = resid;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   500
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   501
		itx = zil_itx_create(txtype, sizeof (*lr) +
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   502
		    (write_state == WR_COPIED ? len : 0));
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   503
		lr = (lr_write_t *)&itx->itx_lr;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   504
		if (write_state == WR_COPIED && dmu_read(zp->z_zfsvfs->z_os,
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   505
		    zp->z_id, off, len, lr + 1) != 0) {
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3461
diff changeset
   506
			kmem_free(itx, offsetof(itx_t, itx_lr) +
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3461
diff changeset
   507
			    itx->itx_lr.lrc_reclen);
1669
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   508
			itx = zil_itx_create(txtype, sizeof (*lr));
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3461
diff changeset
   509
			lr = (lr_write_t *)&itx->itx_lr;
1669
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   510
			write_state = WR_NEED_COPY;
3521dbbcb2e8 6343608 ZFS file range locking
perrin
parents: 789
diff changeset
   511
		}
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   512
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   513
		itx->itx_wr_state = write_state;
6101
915df4cedbc9 6658511 zl_itx_list_sz incorrect for WR_NEED_COPY writes
perrin
parents: 5435
diff changeset
   514
		if (write_state == WR_NEED_COPY)
915df4cedbc9 6658511 zl_itx_list_sz incorrect for WR_NEED_COPY writes
perrin
parents: 5435
diff changeset
   515
			itx->itx_sod += len;
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   516
		lr->lr_foid = zp->z_id;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   517
		lr->lr_offset = off;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   518
		lr->lr_length = len;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   519
		lr->lr_blkoff = 0;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   520
		BP_ZERO(&lr->lr_blkptr);
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3461
diff changeset
   521
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   522
		itx->itx_private = zp->z_zfsvfs;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   523
6396
09c523979832 6683293 concurrent O_DSYNC writes to a fileset can be much improved over NFS
perrin
parents: 6101
diff changeset
   524
		if ((zp->z_sync_cnt != 0) || (fsync_cnt != 0) ||
09c523979832 6683293 concurrent O_DSYNC writes to a fileset can be much improved over NFS
perrin
parents: 6101
diff changeset
   525
		    (ioflag & (FSYNC | FDSYNC)))
4720
8edc0d2e6f3f 6535160 Lock contention on zl_lock from zil_commit
fr157268
parents: 4620
diff changeset
   526
			itx->itx_sync = B_TRUE;
8edc0d2e6f3f 6535160 Lock contention on zl_lock from zil_commit
fr157268
parents: 4620
diff changeset
   527
		else
8edc0d2e6f3f 6535160 Lock contention on zl_lock from zil_commit
fr157268
parents: 4620
diff changeset
   528
			itx->itx_sync = B_FALSE;
8edc0d2e6f3f 6535160 Lock contention on zl_lock from zil_commit
fr157268
parents: 4620
diff changeset
   529
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   530
		zp->z_last_itx = zil_itx_assign(zilog, itx, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   531
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   532
		off += len;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   533
		resid -= len;
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 3638
diff changeset
   534
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   535
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   536
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   537
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   538
 * zfs_log_truncate() handles TX_TRUNCATE transactions.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   539
 */
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   540
void
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   541
zfs_log_truncate(zilog_t *zilog, dmu_tx_t *tx, int txtype,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   542
	znode_t *zp, uint64_t off, uint64_t len)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   543
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   544
	itx_t *itx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   545
	uint64_t seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   546
	lr_truncate_t *lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   547
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3063
diff changeset
   548
	if (zilog == NULL || zp->z_unlinked)
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   549
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   550
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   551
	itx = zil_itx_create(txtype, sizeof (*lr));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   552
	lr = (lr_truncate_t *)&itx->itx_lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   553
	lr->lr_foid = zp->z_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   554
	lr->lr_offset = off;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   555
	lr->lr_length = len;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   556
3063
b252896b372b 6341569 zio_alloc_blk() vdev distribution performs badly
perrin
parents: 2638
diff changeset
   557
	itx->itx_sync = (zp->z_sync_cnt != 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   558
	seq = zil_itx_assign(zilog, itx, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   559
	zp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   560
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   561
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   562
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   563
 * zfs_log_setattr() handles TX_SETATTR transactions.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   564
 */
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   565
void
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   566
zfs_log_setattr(zilog_t *zilog, dmu_tx_t *tx, int txtype,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   567
	znode_t *zp, vattr_t *vap, uint_t mask_applied, zfs_fuid_info_t *fuidp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   568
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   569
	itx_t		*itx;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   570
	uint64_t	seq;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   571
	lr_setattr_t	*lr;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   572
	xvattr_t	*xvap = (xvattr_t *)vap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   573
	size_t		recsize = sizeof (lr_setattr_t);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   574
	void		*start;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   575
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   576
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3063
diff changeset
   577
	if (zilog == NULL || zp->z_unlinked)
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   578
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   579
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   580
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   581
	 * If XVATTR set, then log record size needs to allow
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   582
	 * for lr_attr_t + xvattr mask, mapsize and create time
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   583
	 * plus actual attribute values
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   584
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   585
	if (vap->va_mask & AT_XVATTR)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   586
		recsize = sizeof (*lr) + ZIL_XVAT_SIZE(xvap->xva_mapsize);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   587
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   588
	if (fuidp)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   589
		recsize += fuidp->z_domain_str_sz;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   590
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   591
	itx = zil_itx_create(txtype, recsize);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   592
	lr = (lr_setattr_t *)&itx->itx_lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   593
	lr->lr_foid = zp->z_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   594
	lr->lr_mask = (uint64_t)mask_applied;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   595
	lr->lr_mode = (uint64_t)vap->va_mode;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   596
	if ((mask_applied & AT_UID) && IS_EPHEMERAL(vap->va_uid))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   597
		lr->lr_uid = fuidp->z_fuid_owner;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   598
	else
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   599
		lr->lr_uid = (uint64_t)vap->va_uid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   600
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   601
	if ((mask_applied & AT_GID) && IS_EPHEMERAL(vap->va_gid))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   602
		lr->lr_gid = fuidp->z_fuid_group;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   603
	else
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   604
		lr->lr_gid = (uint64_t)vap->va_gid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   605
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   606
	lr->lr_size = (uint64_t)vap->va_size;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   607
	ZFS_TIME_ENCODE(&vap->va_atime, lr->lr_atime);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   608
	ZFS_TIME_ENCODE(&vap->va_mtime, lr->lr_mtime);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   609
	start = (lr_setattr_t *)(lr + 1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   610
	if (vap->va_mask & AT_XVATTR) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   611
		zfs_log_xvattr((lr_attr_t *)start, xvap);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   612
		start = (caddr_t)start + ZIL_XVAT_SIZE(xvap->xva_mapsize);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   613
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   614
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   615
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   616
	 * Now stick on domain information if any on end
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   617
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   618
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   619
	if (fuidp)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   620
		(void) zfs_log_fuid_domains(fuidp, start);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   621
3063
b252896b372b 6341569 zio_alloc_blk() vdev distribution performs badly
perrin
parents: 2638
diff changeset
   622
	itx->itx_sync = (zp->z_sync_cnt != 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   623
	seq = zil_itx_assign(zilog, itx, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   624
	zp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   625
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   626
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   627
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   628
 * zfs_log_acl() handles TX_ACL transactions.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   629
 */
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   630
void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   631
zfs_log_acl(zilog_t *zilog, dmu_tx_t *tx, znode_t *zp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   632
    vsecattr_t *vsecp, zfs_fuid_info_t *fuidp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   633
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   634
	itx_t *itx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   635
	uint64_t seq;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   636
	lr_acl_v0_t *lrv0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   637
	lr_acl_t *lr;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   638
	int txtype;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   639
	int lrsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   640
	size_t txsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   641
	size_t aclbytes = vsecp->vsa_aclentsz;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   642
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   643
	txtype = (zp->z_zfsvfs->z_version == ZPL_VERSION_INITIAL) ?
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   644
	    TX_ACL_V0 : TX_ACL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   645
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   646
	if (txtype == TX_ACL)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   647
		lrsize = sizeof (*lr);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   648
	else
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   649
		lrsize = sizeof (*lrv0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   650
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3063
diff changeset
   651
	if (zilog == NULL || zp->z_unlinked)
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2237
diff changeset
   652
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   653
5435
1be0be66916d 6624956 zfs_log_fuid_ids can cause panic on sparc
marks
parents: 5331
diff changeset
   654
	txsize = lrsize +
1be0be66916d 6624956 zfs_log_fuid_ids can cause panic on sparc
marks
parents: 5331
diff changeset
   655
	    ((txtype == TX_ACL) ? ZIL_ACE_LENGTH(aclbytes) : aclbytes) +
1be0be66916d 6624956 zfs_log_fuid_ids can cause panic on sparc
marks
parents: 5331
diff changeset
   656
	    (fuidp ? fuidp->z_domain_str_sz : 0) +
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   657
	    sizeof (uint64) * (fuidp ? fuidp->z_fuid_cnt : 0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   658
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   659
	itx = zil_itx_create(txtype, txsize);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   660
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   661
	lr = (lr_acl_t *)&itx->itx_lr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   662
	lr->lr_foid = zp->z_id;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   663
	if (txtype == TX_ACL) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   664
		lr->lr_acl_bytes = aclbytes;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   665
		lr->lr_domcnt = fuidp ? fuidp->z_domain_cnt : 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   666
		lr->lr_fuidcnt = fuidp ? fuidp->z_fuid_cnt : 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   667
		if (vsecp->vsa_mask & VSA_ACE_ACLFLAGS)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   668
			lr->lr_acl_flags = (uint64_t)vsecp->vsa_aclflags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   669
		else
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   670
			lr->lr_acl_flags = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   671
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   672
	lr->lr_aclcnt = (uint64_t)vsecp->vsa_aclcnt;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   673
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   674
	if (txtype == TX_ACL_V0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   675
		lrv0 = (lr_acl_v0_t *)lr;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   676
		bcopy(vsecp->vsa_aclentp, (ace_t *)(lrv0 + 1), aclbytes);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   677
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   678
		void *start = (ace_t *)(lr + 1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   679
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   680
		bcopy(vsecp->vsa_aclentp, start, aclbytes);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   681
5435
1be0be66916d 6624956 zfs_log_fuid_ids can cause panic on sparc
marks
parents: 5331
diff changeset
   682
		start = (caddr_t)start + ZIL_ACE_LENGTH(aclbytes);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   683
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   684
		if (fuidp) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   685
			start = zfs_log_fuid_ids(fuidp, start);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   686
			(void) zfs_log_fuid_domains(fuidp, start);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   687
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4720
diff changeset
   688
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   689
3063
b252896b372b 6341569 zio_alloc_blk() vdev distribution performs badly
perrin
parents: 2638
diff changeset
   690
	itx->itx_sync = (zp->z_sync_cnt != 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   691
	seq = zil_itx_assign(zilog, itx, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   692
	zp->z_last_itx = seq;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   693
}