1 789 ahrens /* 2 789 ahrens * CDDL HEADER START 3 789 ahrens * 4 789 ahrens * The contents of this file are subject to the terms of the 5 1816 marks * Common Development and Distribution License (the "License"). 6 1816 marks * You may not use this file except in compliance with the License. 7 789 ahrens * 8 789 ahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 789 ahrens * or http://www.opensolaris.org/os/licensing. 10 789 ahrens * See the License for the specific language governing permissions 11 789 ahrens * and limitations under the License. 12 789 ahrens * 13 789 ahrens * When distributing Covered Code, include this CDDL HEADER in each 14 789 ahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 789 ahrens * If applicable, add the following below this CDDL HEADER, with the 16 789 ahrens * fields enclosed by brackets "[]" replaced with your own identifying 17 789 ahrens * information: Portions Copyright [yyyy] [name of copyright owner] 18 789 ahrens * 19 789 ahrens * CDDL HEADER END 20 789 ahrens */ 21 789 ahrens /* 22 10793 dai * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 789 ahrens * Use is subject to license terms. 24 789 ahrens */ 25 789 ahrens 26 789 ahrens #include <sys/types.h> 27 789 ahrens #include <sys/param.h> 28 789 ahrens #include <sys/systm.h> 29 789 ahrens #include <sys/sysmacros.h> 30 789 ahrens #include <sys/cmn_err.h> 31 789 ahrens #include <sys/kmem.h> 32 789 ahrens #include <sys/thread.h> 33 789 ahrens #include <sys/file.h> 34 789 ahrens #include <sys/fcntl.h> 35 789 ahrens #include <sys/vfs.h> 36 789 ahrens #include <sys/fs/zfs.h> 37 789 ahrens #include <sys/zfs_znode.h> 38 789 ahrens #include <sys/zfs_dir.h> 39 789 ahrens #include <sys/zfs_acl.h> 40 5331 amw #include <sys/zfs_fuid.h> 41 789 ahrens #include <sys/spa.h> 42 789 ahrens #include <sys/zil.h> 43 789 ahrens #include <sys/byteorder.h> 44 789 ahrens #include <sys/stat.h> 45 789 ahrens #include <sys/mode.h> 46 789 ahrens #include <sys/acl.h> 47 789 ahrens #include <sys/atomic.h> 48 789 ahrens #include <sys/cred.h> 49 789 ahrens 50 789 ahrens /* 51 789 ahrens * Functions to replay ZFS intent log (ZIL) records 52 789 ahrens * The functions are called through a function vector (zfs_replay_vector) 53 789 ahrens * which is indexed by the transaction type. 54 789 ahrens */ 55 789 ahrens 56 789 ahrens static void 57 789 ahrens zfs_init_vattr(vattr_t *vap, uint64_t mask, uint64_t mode, 58 789 ahrens uint64_t uid, uint64_t gid, uint64_t rdev, uint64_t nodeid) 59 789 ahrens { 60 789 ahrens bzero(vap, sizeof (*vap)); 61 789 ahrens vap->va_mask = (uint_t)mask; 62 789 ahrens vap->va_type = IFTOVT(mode); 63 789 ahrens vap->va_mode = mode & MODEMASK; 64 5331 amw vap->va_uid = (uid_t)(IS_EPHEMERAL(uid)) ? -1 : uid; 65 5331 amw vap->va_gid = (gid_t)(IS_EPHEMERAL(gid)) ? -1 : gid; 66 1816 marks vap->va_rdev = zfs_cmpldev(rdev); 67 789 ahrens vap->va_nodeid = nodeid; 68 789 ahrens } 69 789 ahrens 70 789 ahrens /* ARGSUSED */ 71 789 ahrens static int 72 789 ahrens zfs_replay_error(zfsvfs_t *zfsvfs, lr_t *lr, boolean_t byteswap) 73 789 ahrens { 74 789 ahrens return (ENOTSUP); 75 789 ahrens } 76 789 ahrens 77 5331 amw static void 78 5331 amw zfs_replay_xvattr(lr_attr_t *lrattr, xvattr_t *xvap) 79 5331 amw { 80 5331 amw xoptattr_t *xoap = NULL; 81 5331 amw uint64_t *attrs; 82 5331 amw uint64_t *crtime; 83 5435 marks uint32_t *bitmap; 84 5331 amw void *scanstamp; 85 5435 marks int i; 86 5331 amw 87 5331 amw xvap->xva_vattr.va_mask |= AT_XVATTR; 88 5331 amw if ((xoap = xva_getxoptattr(xvap)) == NULL) { 89 5331 amw xvap->xva_vattr.va_mask &= ~AT_XVATTR; /* shouldn't happen */ 90 5331 amw return; 91 5331 amw } 92 5331 amw 93 5331 amw ASSERT(lrattr->lr_attr_masksize == xvap->xva_mapsize); 94 5435 marks 95 5435 marks bitmap = &lrattr->lr_attr_bitmap; 96 5435 marks for (i = 0; i != lrattr->lr_attr_masksize; i++, bitmap++) 97 5435 marks xvap->xva_reqattrmap[i] = *bitmap; 98 5435 marks 99 5331 amw attrs = (uint64_t *)(lrattr + lrattr->lr_attr_masksize - 1); 100 5331 amw crtime = attrs + 1; 101 5331 amw scanstamp = (caddr_t)(crtime + 2); 102 5331 amw 103 5331 amw if (XVA_ISSET_REQ(xvap, XAT_HIDDEN)) 104 5331 amw xoap->xoa_hidden = ((*attrs & XAT0_HIDDEN) != 0); 105 5331 amw if (XVA_ISSET_REQ(xvap, XAT_SYSTEM)) 106 5331 amw xoap->xoa_system = ((*attrs & XAT0_SYSTEM) != 0); 107 5331 amw if (XVA_ISSET_REQ(xvap, XAT_ARCHIVE)) 108 5331 amw xoap->xoa_archive = ((*attrs & XAT0_ARCHIVE) != 0); 109 5331 amw if (XVA_ISSET_REQ(xvap, XAT_READONLY)) 110 5331 amw xoap->xoa_readonly = ((*attrs & XAT0_READONLY) != 0); 111 5331 amw if (XVA_ISSET_REQ(xvap, XAT_IMMUTABLE)) 112 5331 amw xoap->xoa_immutable = ((*attrs & XAT0_IMMUTABLE) != 0); 113 5331 amw if (XVA_ISSET_REQ(xvap, XAT_NOUNLINK)) 114 5331 amw xoap->xoa_nounlink = ((*attrs & XAT0_NOUNLINK) != 0); 115 5331 amw if (XVA_ISSET_REQ(xvap, XAT_APPENDONLY)) 116 5331 amw xoap->xoa_appendonly = ((*attrs & XAT0_APPENDONLY) != 0); 117 5331 amw if (XVA_ISSET_REQ(xvap, XAT_NODUMP)) 118 5331 amw xoap->xoa_nodump = ((*attrs & XAT0_NODUMP) != 0); 119 5331 amw if (XVA_ISSET_REQ(xvap, XAT_OPAQUE)) 120 5331 amw xoap->xoa_opaque = ((*attrs & XAT0_OPAQUE) != 0); 121 5331 amw if (XVA_ISSET_REQ(xvap, XAT_AV_MODIFIED)) 122 5331 amw xoap->xoa_av_modified = ((*attrs & XAT0_AV_MODIFIED) != 0); 123 5331 amw if (XVA_ISSET_REQ(xvap, XAT_AV_QUARANTINED)) 124 5331 amw xoap->xoa_av_quarantined = 125 5331 amw ((*attrs & XAT0_AV_QUARANTINED) != 0); 126 5331 amw if (XVA_ISSET_REQ(xvap, XAT_CREATETIME)) 127 5331 amw ZFS_TIME_DECODE(&xoap->xoa_createtime, crtime); 128 5331 amw if (XVA_ISSET_REQ(xvap, XAT_AV_SCANSTAMP)) 129 5331 amw bcopy(scanstamp, xoap->xoa_av_scanstamp, AV_SCANSTAMP_SZ); 130 10793 dai if (XVA_ISSET_REQ(xvap, XAT_REPARSE)) 131 10793 dai xoap->xoa_reparse = ((*attrs & XAT0_REPARSE) != 0); 132 5331 amw } 133 5331 amw 134 789 ahrens static int 135 5331 amw zfs_replay_domain_cnt(uint64_t uid, uint64_t gid) 136 789 ahrens { 137 5331 amw uint64_t uid_idx; 138 5331 amw uint64_t gid_idx; 139 5331 amw int domcnt = 0; 140 5331 amw 141 5331 amw uid_idx = FUID_INDEX(uid); 142 5331 amw gid_idx = FUID_INDEX(gid); 143 5331 amw if (uid_idx) 144 5331 amw domcnt++; 145 5331 amw if (gid_idx > 0 && gid_idx != uid_idx) 146 5331 amw domcnt++; 147 5331 amw 148 5331 amw return (domcnt); 149 5331 amw } 150 5331 amw 151 5331 amw static void * 152 5331 amw zfs_replay_fuid_domain_common(zfs_fuid_info_t *fuid_infop, void *start, 153 5331 amw int domcnt) 154 5331 amw { 155 5331 amw int i; 156 5331 amw 157 5331 amw for (i = 0; i != domcnt; i++) { 158 5331 amw fuid_infop->z_domain_table[i] = start; 159 5331 amw start = (caddr_t)start + strlen(start) + 1; 160 5331 amw } 161 5331 amw 162 5331 amw return (start); 163 5331 amw } 164 5331 amw 165 5331 amw /* 166 5331 amw * Set the uid/gid in the fuid_info structure. 167 5331 amw */ 168 5331 amw static void 169 5331 amw zfs_replay_fuid_ugid(zfs_fuid_info_t *fuid_infop, uint64_t uid, uint64_t gid) 170 5331 amw { 171 5331 amw /* 172 5331 amw * If owner or group are log specific FUIDs then slurp up 173 5331 amw * domain information and build zfs_fuid_info_t 174 5331 amw */ 175 5331 amw if (IS_EPHEMERAL(uid)) 176 5331 amw fuid_infop->z_fuid_owner = uid; 177 5331 amw 178 5331 amw if (IS_EPHEMERAL(gid)) 179 5331 amw fuid_infop->z_fuid_group = gid; 180 5331 amw } 181 5331 amw 182 5331 amw /* 183 5331 amw * Load fuid domains into fuid_info_t 184 5331 amw */ 185 5331 amw static zfs_fuid_info_t * 186 5331 amw zfs_replay_fuid_domain(void *buf, void **end, uint64_t uid, uint64_t gid) 187 5331 amw { 188 5331 amw int domcnt; 189 5331 amw 190 5331 amw zfs_fuid_info_t *fuid_infop; 191 5331 amw 192 5331 amw fuid_infop = zfs_fuid_info_alloc(); 193 5331 amw 194 5331 amw domcnt = zfs_replay_domain_cnt(uid, gid); 195 5331 amw 196 5331 amw if (domcnt == 0) 197 5331 amw return (fuid_infop); 198 5331 amw 199 5331 amw fuid_infop->z_domain_table = 200 5331 amw kmem_zalloc(domcnt * sizeof (char **), KM_SLEEP); 201 5331 amw 202 5331 amw zfs_replay_fuid_ugid(fuid_infop, uid, gid); 203 5331 amw 204 5331 amw fuid_infop->z_domain_cnt = domcnt; 205 5331 amw *end = zfs_replay_fuid_domain_common(fuid_infop, buf, domcnt); 206 5331 amw return (fuid_infop); 207 5331 amw } 208 5331 amw 209 5331 amw /* 210 5331 amw * load zfs_fuid_t's and fuid_domains into fuid_info_t 211 5331 amw */ 212 5331 amw static zfs_fuid_info_t * 213 5331 amw zfs_replay_fuids(void *start, void **end, int idcnt, int domcnt, uint64_t uid, 214 5331 amw uint64_t gid) 215 5331 amw { 216 5331 amw uint64_t *log_fuid = (uint64_t *)start; 217 5331 amw zfs_fuid_info_t *fuid_infop; 218 5331 amw int i; 219 5331 amw 220 5331 amw fuid_infop = zfs_fuid_info_alloc(); 221 5331 amw fuid_infop->z_domain_cnt = domcnt; 222 5331 amw 223 5331 amw fuid_infop->z_domain_table = 224 5331 amw kmem_zalloc(domcnt * sizeof (char **), KM_SLEEP); 225 5331 amw 226 5331 amw for (i = 0; i != idcnt; i++) { 227 5331 amw zfs_fuid_t *zfuid; 228 5331 amw 229 5331 amw zfuid = kmem_alloc(sizeof (zfs_fuid_t), KM_SLEEP); 230 5331 amw zfuid->z_logfuid = *log_fuid; 231 5331 amw zfuid->z_id = -1; 232 5331 amw zfuid->z_domidx = 0; 233 5331 amw list_insert_tail(&fuid_infop->z_fuids, zfuid); 234 5331 amw log_fuid++; 235 5331 amw } 236 5331 amw 237 5331 amw zfs_replay_fuid_ugid(fuid_infop, uid, gid); 238 5331 amw 239 5331 amw *end = zfs_replay_fuid_domain_common(fuid_infop, log_fuid, domcnt); 240 5331 amw return (fuid_infop); 241 5331 amw } 242 5331 amw 243 5331 amw static void 244 5331 amw zfs_replay_swap_attrs(lr_attr_t *lrattr) 245 5331 amw { 246 5331 amw /* swap the lr_attr structure */ 247 5331 amw byteswap_uint32_array(lrattr, sizeof (*lrattr)); 248 5331 amw /* swap the bitmap */ 249 5435 marks byteswap_uint32_array(lrattr + 1, (lrattr->lr_attr_masksize - 1) * 250 5435 marks sizeof (uint32_t)); 251 5331 amw /* swap the attributes, create time + 64 bit word for attributes */ 252 5435 marks byteswap_uint64_array((caddr_t)(lrattr + 1) + (sizeof (uint32_t) * 253 5331 amw (lrattr->lr_attr_masksize - 1)), 3 * sizeof (uint64_t)); 254 5331 amw } 255 5331 amw 256 5331 amw /* 257 5331 amw * Replay file create with optional ACL, xvattr information as well 258 5331 amw * as option FUID information. 259 5331 amw */ 260 5331 amw static int 261 5331 amw zfs_replay_create_acl(zfsvfs_t *zfsvfs, 262 5331 amw lr_acl_create_t *lracl, boolean_t byteswap) 263 5331 amw { 264 5331 amw char *name = NULL; /* location determined later */ 265 5331 amw lr_create_t *lr = (lr_create_t *)lracl; 266 789 ahrens znode_t *dzp; 267 789 ahrens vnode_t *vp = NULL; 268 5331 amw xvattr_t xva; 269 5331 amw int vflg = 0; 270 5331 amw vsecattr_t vsec = { 0 }; 271 5331 amw lr_attr_t *lrattr; 272 5331 amw void *aclstart; 273 5331 amw void *fuidstart; 274 5331 amw size_t xvatlen = 0; 275 5331 amw uint64_t txtype; 276 789 ahrens int error; 277 789 ahrens 278 5331 amw if (byteswap) { 279 5331 amw byteswap_uint64_array(lracl, sizeof (*lracl)); 280 5331 amw txtype = (int)lr->lr_common.lrc_txtype; 281 5331 amw if (txtype == TX_CREATE_ACL_ATTR || 282 5331 amw txtype == TX_MKDIR_ACL_ATTR) { 283 5435 marks lrattr = (lr_attr_t *)(caddr_t)(lracl + 1); 284 5331 amw zfs_replay_swap_attrs(lrattr); 285 5331 amw xvatlen = ZIL_XVAT_SIZE(lrattr->lr_attr_masksize); 286 5331 amw } 287 5331 amw 288 5331 amw aclstart = (caddr_t)(lracl + 1) + xvatlen; 289 5331 amw zfs_ace_byteswap(aclstart, lracl->lr_acl_bytes, B_FALSE); 290 5331 amw /* swap fuids */ 291 5331 amw if (lracl->lr_fuidcnt) { 292 5331 amw byteswap_uint64_array((caddr_t)aclstart + 293 5435 marks ZIL_ACE_LENGTH(lracl->lr_acl_bytes), 294 5435 marks lracl->lr_fuidcnt * sizeof (uint64_t)); 295 5331 amw } 296 5331 amw } 297 789 ahrens 298 789 ahrens if ((error = zfs_zget(zfsvfs, lr->lr_doid, &dzp)) != 0) 299 789 ahrens return (error); 300 789 ahrens 301 5331 amw xva_init(&xva); 302 5331 amw zfs_init_vattr(&xva.xva_vattr, AT_TYPE | AT_MODE | AT_UID | AT_GID, 303 789 ahrens lr->lr_mode, lr->lr_uid, lr->lr_gid, lr->lr_rdev, lr->lr_foid); 304 789 ahrens 305 789 ahrens /* 306 789 ahrens * All forms of zfs create (create, mkdir, mkxattrdir, symlink) 307 789 ahrens * eventually end up in zfs_mknode(), which assigns the object's 308 789 ahrens * creation time and generation number. The generic VOP_CREATE() 309 789 ahrens * doesn't have either concept, so we smuggle the values inside 310 789 ahrens * the vattr's otherwise unused va_ctime and va_nblocks fields. 311 789 ahrens */ 312 5331 amw ZFS_TIME_DECODE(&xva.xva_vattr.va_ctime, lr->lr_crtime); 313 5331 amw xva.xva_vattr.va_nblocks = lr->lr_gen; 314 5331 amw 315 5331 amw error = dmu_object_info(zfsvfs->z_os, lr->lr_foid, NULL); 316 5331 amw if (error != ENOENT) 317 5331 amw goto bail; 318 5331 amw 319 5331 amw if (lr->lr_common.lrc_txtype & TX_CI) 320 5331 amw vflg |= FIGNORECASE; 321 5331 amw switch ((int)lr->lr_common.lrc_txtype) { 322 5331 amw case TX_CREATE_ACL: 323 5331 amw aclstart = (caddr_t)(lracl + 1); 324 5435 marks fuidstart = (caddr_t)aclstart + 325 5435 marks ZIL_ACE_LENGTH(lracl->lr_acl_bytes); 326 5331 amw zfsvfs->z_fuid_replay = zfs_replay_fuids(fuidstart, 327 5331 amw (void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt, 328 5331 amw lr->lr_uid, lr->lr_gid); 329 5331 amw /*FALLTHROUGH*/ 330 5331 amw case TX_CREATE_ACL_ATTR: 331 5331 amw if (name == NULL) { 332 5331 amw lrattr = (lr_attr_t *)(caddr_t)(lracl + 1); 333 5331 amw xvatlen = ZIL_XVAT_SIZE(lrattr->lr_attr_masksize); 334 5331 amw xva.xva_vattr.va_mask |= AT_XVATTR; 335 5331 amw zfs_replay_xvattr(lrattr, &xva); 336 5331 amw } 337 5331 amw vsec.vsa_mask = VSA_ACE | VSA_ACE_ACLFLAGS; 338 5331 amw vsec.vsa_aclentp = (caddr_t)(lracl + 1) + xvatlen; 339 5331 amw vsec.vsa_aclcnt = lracl->lr_aclcnt; 340 5331 amw vsec.vsa_aclentsz = lracl->lr_acl_bytes; 341 5331 amw vsec.vsa_aclflags = lracl->lr_acl_flags; 342 5833 marks if (zfsvfs->z_fuid_replay == NULL) { 343 5331 amw fuidstart = (caddr_t)(lracl + 1) + xvatlen + 344 5435 marks ZIL_ACE_LENGTH(lracl->lr_acl_bytes); 345 5331 amw zfsvfs->z_fuid_replay = 346 5331 amw zfs_replay_fuids(fuidstart, 347 5331 amw (void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt, 348 5331 amw lr->lr_uid, lr->lr_gid); 349 5833 marks } 350 5331 amw 351 5331 amw error = VOP_CREATE(ZTOV(dzp), name, &xva.xva_vattr, 352 5331 amw 0, 0, &vp, kcred, vflg, NULL, &vsec); 353 5331 amw break; 354 5331 amw case TX_MKDIR_ACL: 355 5331 amw aclstart = (caddr_t)(lracl + 1); 356 5435 marks fuidstart = (caddr_t)aclstart + 357 5435 marks ZIL_ACE_LENGTH(lracl->lr_acl_bytes); 358 5331 amw zfsvfs->z_fuid_replay = zfs_replay_fuids(fuidstart, 359 5331 amw (void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt, 360 5331 amw lr->lr_uid, lr->lr_gid); 361 5331 amw /*FALLTHROUGH*/ 362 5331 amw case TX_MKDIR_ACL_ATTR: 363 5331 amw if (name == NULL) { 364 5331 amw lrattr = (lr_attr_t *)(caddr_t)(lracl + 1); 365 5331 amw xvatlen = ZIL_XVAT_SIZE(lrattr->lr_attr_masksize); 366 5331 amw zfs_replay_xvattr(lrattr, &xva); 367 5331 amw } 368 5331 amw vsec.vsa_mask = VSA_ACE | VSA_ACE_ACLFLAGS; 369 5331 amw vsec.vsa_aclentp = (caddr_t)(lracl + 1) + xvatlen; 370 5331 amw vsec.vsa_aclcnt = lracl->lr_aclcnt; 371 5331 amw vsec.vsa_aclentsz = lracl->lr_acl_bytes; 372 5331 amw vsec.vsa_aclflags = lracl->lr_acl_flags; 373 5833 marks if (zfsvfs->z_fuid_replay == NULL) { 374 5331 amw fuidstart = (caddr_t)(lracl + 1) + xvatlen + 375 5435 marks ZIL_ACE_LENGTH(lracl->lr_acl_bytes); 376 5331 amw zfsvfs->z_fuid_replay = 377 5331 amw zfs_replay_fuids(fuidstart, 378 5331 amw (void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt, 379 5331 amw lr->lr_uid, lr->lr_gid); 380 5833 marks } 381 5331 amw error = VOP_MKDIR(ZTOV(dzp), name, &xva.xva_vattr, 382 5331 amw &vp, kcred, NULL, vflg, &vsec); 383 5331 amw break; 384 5331 amw default: 385 5331 amw error = ENOTSUP; 386 5331 amw } 387 5331 amw 388 5331 amw bail: 389 5331 amw if (error == 0 && vp != NULL) 390 5331 amw VN_RELE(vp); 391 5331 amw 392 5331 amw VN_RELE(ZTOV(dzp)); 393 5331 amw 394 5331 amw zfs_fuid_info_free(zfsvfs->z_fuid_replay); 395 5331 amw zfsvfs->z_fuid_replay = NULL; 396 5331 amw 397 5331 amw return (error); 398 5331 amw } 399 5331 amw 400 5331 amw static int 401 5331 amw zfs_replay_create(zfsvfs_t *zfsvfs, lr_create_t *lr, boolean_t byteswap) 402 5331 amw { 403 5331 amw char *name = NULL; /* location determined later */ 404 5331 amw char *link; /* symlink content follows name */ 405 5331 amw znode_t *dzp; 406 5331 amw vnode_t *vp = NULL; 407 5331 amw xvattr_t xva; 408 5331 amw int vflg = 0; 409 5331 amw size_t lrsize = sizeof (lr_create_t); 410 5331 amw lr_attr_t *lrattr; 411 5331 amw void *start; 412 5331 amw size_t xvatlen; 413 5331 amw uint64_t txtype; 414 5331 amw int error; 415 5331 amw 416 5331 amw if (byteswap) { 417 5331 amw byteswap_uint64_array(lr, sizeof (*lr)); 418 5331 amw txtype = (int)lr->lr_common.lrc_txtype; 419 5331 amw if (txtype == TX_CREATE_ATTR || txtype == TX_MKDIR_ATTR) 420 5331 amw zfs_replay_swap_attrs((lr_attr_t *)(lr + 1)); 421 5331 amw } 422 5331 amw 423 5331 amw 424 5331 amw if ((error = zfs_zget(zfsvfs, lr->lr_doid, &dzp)) != 0) 425 5331 amw return (error); 426 5331 amw 427 5331 amw xva_init(&xva); 428 5331 amw zfs_init_vattr(&xva.xva_vattr, AT_TYPE | AT_MODE | AT_UID | AT_GID, 429 5331 amw lr->lr_mode, lr->lr_uid, lr->lr_gid, lr->lr_rdev, lr->lr_foid); 430 5331 amw 431 5331 amw /* 432 5331 amw * All forms of zfs create (create, mkdir, mkxattrdir, symlink) 433 5331 amw * eventually end up in zfs_mknode(), which assigns the object's 434 5331 amw * creation time and generation number. The generic VOP_CREATE() 435 5331 amw * doesn't have either concept, so we smuggle the values inside 436 5331 amw * the vattr's otherwise unused va_ctime and va_nblocks fields. 437 5331 amw */ 438 5331 amw ZFS_TIME_DECODE(&xva.xva_vattr.va_ctime, lr->lr_crtime); 439 5331 amw xva.xva_vattr.va_nblocks = lr->lr_gen; 440 789 ahrens 441 4480 gw25295 error = dmu_object_info(zfsvfs->z_os, lr->lr_foid, NULL); 442 4480 gw25295 if (error != ENOENT) 443 4480 gw25295 goto out; 444 4480 gw25295 445 5331 amw if (lr->lr_common.lrc_txtype & TX_CI) 446 5331 amw vflg |= FIGNORECASE; 447 5331 amw 448 5331 amw /* 449 5331 amw * Symlinks don't have fuid info, and CIFS never creates 450 5331 amw * symlinks. 451 5331 amw * 452 5331 amw * The _ATTR versions will grab the fuid info in their subcases. 453 5331 amw */ 454 5331 amw if ((int)lr->lr_common.lrc_txtype != TX_SYMLINK && 455 5331 amw (int)lr->lr_common.lrc_txtype != TX_MKDIR_ATTR && 456 5331 amw (int)lr->lr_common.lrc_txtype != TX_CREATE_ATTR) { 457 5331 amw start = (lr + 1); 458 5331 amw zfsvfs->z_fuid_replay = 459 5331 amw zfs_replay_fuid_domain(start, &start, 460 5331 amw lr->lr_uid, lr->lr_gid); 461 5331 amw } 462 5331 amw 463 789 ahrens switch ((int)lr->lr_common.lrc_txtype) { 464 5331 amw case TX_CREATE_ATTR: 465 5331 amw lrattr = (lr_attr_t *)(caddr_t)(lr + 1); 466 5331 amw xvatlen = ZIL_XVAT_SIZE(lrattr->lr_attr_masksize); 467 5331 amw zfs_replay_xvattr((lr_attr_t *)((caddr_t)lr + lrsize), &xva); 468 5331 amw start = (caddr_t)(lr + 1) + xvatlen; 469 5331 amw zfsvfs->z_fuid_replay = 470 5331 amw zfs_replay_fuid_domain(start, &start, 471 5331 amw lr->lr_uid, lr->lr_gid); 472 5331 amw name = (char *)start; 473 5331 amw 474 5331 amw /*FALLTHROUGH*/ 475 789 ahrens case TX_CREATE: 476 5331 amw if (name == NULL) 477 5331 amw name = (char *)start; 478 5331 amw 479 5331 amw error = VOP_CREATE(ZTOV(dzp), name, &xva.xva_vattr, 480 5331 amw 0, 0, &vp, kcred, vflg, NULL, NULL); 481 789 ahrens break; 482 5331 amw case TX_MKDIR_ATTR: 483 5331 amw lrattr = (lr_attr_t *)(caddr_t)(lr + 1); 484 5331 amw xvatlen = ZIL_XVAT_SIZE(lrattr->lr_attr_masksize); 485 5331 amw zfs_replay_xvattr((lr_attr_t *)((caddr_t)lr + lrsize), &xva); 486 5331 amw start = (caddr_t)(lr + 1) + xvatlen; 487 5331 amw zfsvfs->z_fuid_replay = 488 5331 amw zfs_replay_fuid_domain(start, &start, 489 5331 amw lr->lr_uid, lr->lr_gid); 490 5331 amw name = (char *)start; 491 5331 amw 492 5331 amw /*FALLTHROUGH*/ 493 789 ahrens case TX_MKDIR: 494 5331 amw if (name == NULL) 495 5331 amw name = (char *)(lr + 1); 496 5331 amw 497 5331 amw error = VOP_MKDIR(ZTOV(dzp), name, &xva.xva_vattr, 498 5331 amw &vp, kcred, NULL, vflg, NULL); 499 789 ahrens break; 500 789 ahrens case TX_MKXATTR: 501 5331 amw error = zfs_make_xattrdir(dzp, &xva.xva_vattr, &vp, kcred); 502 789 ahrens break; 503 789 ahrens case TX_SYMLINK: 504 5331 amw name = (char *)(lr + 1); 505 789 ahrens link = name + strlen(name) + 1; 506 5331 amw error = VOP_SYMLINK(ZTOV(dzp), name, &xva.xva_vattr, 507 5331 amw link, kcred, NULL, vflg); 508 789 ahrens break; 509 789 ahrens default: 510 789 ahrens error = ENOTSUP; 511 789 ahrens } 512 789 ahrens 513 4480 gw25295 out: 514 789 ahrens if (error == 0 && vp != NULL) 515 789 ahrens VN_RELE(vp); 516 789 ahrens 517 789 ahrens VN_RELE(ZTOV(dzp)); 518 789 ahrens 519 5331 amw if (zfsvfs->z_fuid_replay) 520 5331 amw zfs_fuid_info_free(zfsvfs->z_fuid_replay); 521 5331 amw zfsvfs->z_fuid_replay = NULL; 522 789 ahrens return (error); 523 789 ahrens } 524 789 ahrens 525 789 ahrens static int 526 789 ahrens zfs_replay_remove(zfsvfs_t *zfsvfs, lr_remove_t *lr, boolean_t byteswap) 527 789 ahrens { 528 789 ahrens char *name = (char *)(lr + 1); /* name follows lr_remove_t */ 529 789 ahrens znode_t *dzp; 530 789 ahrens int error; 531 5331 amw int vflg = 0; 532 789 ahrens 533 789 ahrens if (byteswap) 534 789 ahrens byteswap_uint64_array(lr, sizeof (*lr)); 535 789 ahrens 536 789 ahrens if ((error = zfs_zget(zfsvfs, lr->lr_doid, &dzp)) != 0) 537 789 ahrens return (error); 538 789 ahrens 539 5331 amw if (lr->lr_common.lrc_txtype & TX_CI) 540 5331 amw vflg |= FIGNORECASE; 541 5331 amw 542 789 ahrens switch ((int)lr->lr_common.lrc_txtype) { 543 789 ahrens case TX_REMOVE: 544 5331 amw error = VOP_REMOVE(ZTOV(dzp), name, kcred, NULL, vflg); 545 789 ahrens break; 546 789 ahrens case TX_RMDIR: 547 5331 amw error = VOP_RMDIR(ZTOV(dzp), name, NULL, kcred, NULL, vflg); 548 789 ahrens break; 549 789 ahrens default: 550 789 ahrens error = ENOTSUP; 551 789 ahrens } 552 789 ahrens 553 789 ahrens VN_RELE(ZTOV(dzp)); 554 789 ahrens 555 789 ahrens return (error); 556 789 ahrens } 557 789 ahrens 558 789 ahrens static int 559 789 ahrens zfs_replay_link(zfsvfs_t *zfsvfs, lr_link_t *lr, boolean_t byteswap) 560 789 ahrens { 561 789 ahrens char *name = (char *)(lr + 1); /* name follows lr_link_t */ 562 789 ahrens znode_t *dzp, *zp; 563 789 ahrens int error; 564 5331 amw int vflg = 0; 565 789 ahrens 566 789 ahrens if (byteswap) 567 789 ahrens byteswap_uint64_array(lr, sizeof (*lr)); 568 789 ahrens 569 789 ahrens if ((error = zfs_zget(zfsvfs, lr->lr_doid, &dzp)) != 0) 570 789 ahrens return (error); 571 789 ahrens 572 789 ahrens if ((error = zfs_zget(zfsvfs, lr->lr_link_obj, &zp)) != 0) { 573 789 ahrens VN_RELE(ZTOV(dzp)); 574 789 ahrens return (error); 575 789 ahrens } 576 789 ahrens 577 5331 amw if (lr->lr_common.lrc_txtype & TX_CI) 578 5331 amw vflg |= FIGNORECASE; 579 5331 amw 580 5331 amw error = VOP_LINK(ZTOV(dzp), ZTOV(zp), name, kcred, NULL, vflg); 581 789 ahrens 582 789 ahrens VN_RELE(ZTOV(zp)); 583 789 ahrens VN_RELE(ZTOV(dzp)); 584 789 ahrens 585 789 ahrens return (error); 586 789 ahrens } 587 789 ahrens 588 789 ahrens static int 589 789 ahrens zfs_replay_rename(zfsvfs_t *zfsvfs, lr_rename_t *lr, boolean_t byteswap) 590 789 ahrens { 591 789 ahrens char *sname = (char *)(lr + 1); /* sname and tname follow lr_rename_t */ 592 789 ahrens char *tname = sname + strlen(sname) + 1; 593 789 ahrens znode_t *sdzp, *tdzp; 594 789 ahrens int error; 595 5331 amw int vflg = 0; 596 789 ahrens 597 789 ahrens if (byteswap) 598 789 ahrens byteswap_uint64_array(lr, sizeof (*lr)); 599 789 ahrens 600 789 ahrens if ((error = zfs_zget(zfsvfs, lr->lr_sdoid, &sdzp)) != 0) 601 789 ahrens return (error); 602 789 ahrens 603 789 ahrens if ((error = zfs_zget(zfsvfs, lr->lr_tdoid, &tdzp)) != 0) { 604 789 ahrens VN_RELE(ZTOV(sdzp)); 605 789 ahrens return (error); 606 789 ahrens } 607 789 ahrens 608 5331 amw if (lr->lr_common.lrc_txtype & TX_CI) 609 5331 amw vflg |= FIGNORECASE; 610 5331 amw 611 5331 amw error = VOP_RENAME(ZTOV(sdzp), sname, ZTOV(tdzp), tname, kcred, 612 5331 amw NULL, vflg); 613 789 ahrens 614 789 ahrens VN_RELE(ZTOV(tdzp)); 615 789 ahrens VN_RELE(ZTOV(sdzp)); 616 789 ahrens 617 789 ahrens return (error); 618 789 ahrens } 619 789 ahrens 620 789 ahrens static int 621 789 ahrens zfs_replay_write(zfsvfs_t *zfsvfs, lr_write_t *lr, boolean_t byteswap) 622 789 ahrens { 623 789 ahrens char *data = (char *)(lr + 1); /* data follows lr_write_t */ 624 789 ahrens znode_t *zp; 625 789 ahrens int error; 626 789 ahrens ssize_t resid; 627 10922 Jeff uint64_t orig_eof, eod, offset, length; 628 10800 Neil 629 10800 Neil if (byteswap) 630 10800 Neil byteswap_uint64_array(lr, sizeof (*lr)); 631 10800 Neil 632 10800 Neil if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) { 633 10800 Neil /* 634 10800 Neil * As we can log writes out of order, it's possible the 635 10800 Neil * file has been removed. In this case just drop the write 636 10800 Neil * and return success. 637 10800 Neil */ 638 10800 Neil if (error == ENOENT) 639 10800 Neil error = 0; 640 10800 Neil return (error); 641 10800 Neil } 642 10922 Jeff 643 10922 Jeff offset = lr->lr_offset; 644 10922 Jeff length = lr->lr_length; 645 10922 Jeff eod = offset + length; /* end of data for this write */ 646 10922 Jeff 647 10800 Neil orig_eof = zp->z_phys->zp_size; 648 10800 Neil 649 10922 Jeff /* If it's a dmu_sync() block, write the whole block */ 650 10922 Jeff if (lr->lr_common.lrc_reclen == sizeof (lr_write_t)) { 651 10922 Jeff uint64_t blocksize = BP_GET_LSIZE(&lr->lr_blkptr); 652 10922 Jeff if (length < blocksize) { 653 10922 Jeff offset -= offset % blocksize; 654 10922 Jeff length = blocksize; 655 10922 Jeff } 656 10922 Jeff } 657 10800 Neil 658 10922 Jeff error = vn_rdwr(UIO_WRITE, ZTOV(zp), data, length, offset, 659 10922 Jeff UIO_SYSSPACE, 0, RLIM64_INFINITY, kcred, &resid); 660 10800 Neil 661 10800 Neil /* 662 10800 Neil * This may be a write from a dmu_sync() for a whole block, 663 10800 Neil * and may extend beyond the current end of the file. 664 10800 Neil * We can't just replay what was written for this TX_WRITE as 665 10800 Neil * a future TX_WRITE2 may extend the eof and the data for that 666 10800 Neil * write needs to be there. So we write the whole block and 667 10800 Neil * reduce the eof. 668 10800 Neil */ 669 10800 Neil if (orig_eof < zp->z_phys->zp_size) /* file length grew ? */ 670 10800 Neil zp->z_phys->zp_size = eod; 671 10800 Neil 672 10800 Neil VN_RELE(ZTOV(zp)); 673 10800 Neil 674 10800 Neil return (error); 675 10800 Neil } 676 10800 Neil 677 10800 Neil /* 678 10800 Neil * TX_WRITE2 are only generated when dmu_sync() returns EALREADY 679 10800 Neil * meaning the pool block is already being synced. So now that we always write 680 10800 Neil * out full blocks, all we have to do is expand the eof if 681 10800 Neil * the file is grown. 682 10800 Neil */ 683 10800 Neil static int 684 10800 Neil zfs_replay_write2(zfsvfs_t *zfsvfs, lr_write_t *lr, boolean_t byteswap) 685 10800 Neil { 686 10800 Neil znode_t *zp; 687 10800 Neil int error; 688 10800 Neil uint64_t end; 689 789 ahrens 690 789 ahrens if (byteswap) 691 789 ahrens byteswap_uint64_array(lr, sizeof (*lr)); 692 789 ahrens 693 10922 Jeff if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) 694 789 ahrens return (error); 695 789 ahrens 696 10800 Neil end = lr->lr_offset + lr->lr_length; 697 10800 Neil if (end > zp->z_phys->zp_size) { 698 10800 Neil ASSERT3U(end - zp->z_phys->zp_size, <, zp->z_blksz); 699 10800 Neil zp->z_phys->zp_size = end; 700 10800 Neil } 701 789 ahrens 702 789 ahrens VN_RELE(ZTOV(zp)); 703 789 ahrens 704 789 ahrens return (error); 705 789 ahrens } 706 789 ahrens 707 789 ahrens static int 708 789 ahrens zfs_replay_truncate(zfsvfs_t *zfsvfs, lr_truncate_t *lr, boolean_t byteswap) 709 789 ahrens { 710 789 ahrens znode_t *zp; 711 789 ahrens flock64_t fl; 712 789 ahrens int error; 713 789 ahrens 714 789 ahrens if (byteswap) 715 789 ahrens byteswap_uint64_array(lr, sizeof (*lr)); 716 789 ahrens 717 10922 Jeff if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) 718 789 ahrens return (error); 719 789 ahrens 720 789 ahrens bzero(&fl, sizeof (fl)); 721 789 ahrens fl.l_type = F_WRLCK; 722 789 ahrens fl.l_whence = 0; 723 789 ahrens fl.l_start = lr->lr_offset; 724 789 ahrens fl.l_len = lr->lr_length; 725 789 ahrens 726 789 ahrens error = VOP_SPACE(ZTOV(zp), F_FREESP, &fl, FWRITE | FOFFMAX, 727 789 ahrens lr->lr_offset, kcred, NULL); 728 789 ahrens 729 789 ahrens VN_RELE(ZTOV(zp)); 730 789 ahrens 731 789 ahrens return (error); 732 789 ahrens } 733 789 ahrens 734 789 ahrens static int 735 789 ahrens zfs_replay_setattr(zfsvfs_t *zfsvfs, lr_setattr_t *lr, boolean_t byteswap) 736 789 ahrens { 737 789 ahrens znode_t *zp; 738 5331 amw xvattr_t xva; 739 5331 amw vattr_t *vap = &xva.xva_vattr; 740 789 ahrens int error; 741 5331 amw void *start; 742 789 ahrens 743 5331 amw xva_init(&xva); 744 5331 amw if (byteswap) { 745 789 ahrens byteswap_uint64_array(lr, sizeof (*lr)); 746 5331 amw 747 5331 amw if ((lr->lr_mask & AT_XVATTR) && 748 5331 amw zfsvfs->z_version >= ZPL_VERSION_INITIAL) 749 5331 amw zfs_replay_swap_attrs((lr_attr_t *)(lr + 1)); 750 5331 amw } 751 789 ahrens 752 10922 Jeff if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) 753 789 ahrens return (error); 754 789 ahrens 755 5331 amw zfs_init_vattr(vap, lr->lr_mask, lr->lr_mode, 756 789 ahrens lr->lr_uid, lr->lr_gid, 0, lr->lr_foid); 757 789 ahrens 758 5331 amw vap->va_size = lr->lr_size; 759 5331 amw ZFS_TIME_DECODE(&vap->va_atime, lr->lr_atime); 760 5331 amw ZFS_TIME_DECODE(&vap->va_mtime, lr->lr_mtime); 761 789 ahrens 762 5331 amw /* 763 5331 amw * Fill in xvattr_t portions if necessary. 764 5331 amw */ 765 789 ahrens 766 5331 amw start = (lr_setattr_t *)(lr + 1); 767 5331 amw if (vap->va_mask & AT_XVATTR) { 768 5331 amw zfs_replay_xvattr((lr_attr_t *)start, &xva); 769 5331 amw start = (caddr_t)start + 770 5331 amw ZIL_XVAT_SIZE(((lr_attr_t *)start)->lr_attr_masksize); 771 5331 amw } else 772 5331 amw xva.xva_vattr.va_mask &= ~AT_XVATTR; 773 5331 amw 774 5331 amw zfsvfs->z_fuid_replay = zfs_replay_fuid_domain(start, &start, 775 5331 amw lr->lr_uid, lr->lr_gid); 776 5331 amw 777 5331 amw error = VOP_SETATTR(ZTOV(zp), vap, 0, kcred, NULL); 778 5331 amw 779 5331 amw zfs_fuid_info_free(zfsvfs->z_fuid_replay); 780 5331 amw zfsvfs->z_fuid_replay = NULL; 781 789 ahrens VN_RELE(ZTOV(zp)); 782 789 ahrens 783 789 ahrens return (error); 784 789 ahrens } 785 789 ahrens 786 789 ahrens static int 787 5331 amw zfs_replay_acl_v0(zfsvfs_t *zfsvfs, lr_acl_v0_t *lr, boolean_t byteswap) 788 789 ahrens { 789 789 ahrens ace_t *ace = (ace_t *)(lr + 1); /* ace array follows lr_acl_t */ 790 789 ahrens vsecattr_t vsa; 791 789 ahrens znode_t *zp; 792 789 ahrens int error; 793 789 ahrens 794 5435 marks if (byteswap) { 795 5435 marks byteswap_uint64_array(lr, sizeof (*lr)); 796 5435 marks zfs_oldace_byteswap(ace, lr->lr_aclcnt); 797 5435 marks } 798 5435 marks 799 10922 Jeff if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) 800 789 ahrens return (error); 801 5331 amw 802 789 ahrens bzero(&vsa, sizeof (vsa)); 803 789 ahrens vsa.vsa_mask = VSA_ACE | VSA_ACECNT; 804 789 ahrens vsa.vsa_aclcnt = lr->lr_aclcnt; 805 6514 marks vsa.vsa_aclentsz = sizeof (ace_t) * vsa.vsa_aclcnt; 806 6514 marks vsa.vsa_aclflags = 0; 807 789 ahrens vsa.vsa_aclentp = ace; 808 789 ahrens 809 5331 amw error = VOP_SETSECATTR(ZTOV(zp), &vsa, 0, kcred, NULL); 810 789 ahrens 811 5331 amw VN_RELE(ZTOV(zp)); 812 5331 amw 813 5331 amw return (error); 814 5331 amw } 815 5331 amw 816 5331 amw /* 817 5331 amw * Replaying ACLs is complicated by FUID support. 818 5331 amw * The log record may contain some optional data 819 5331 amw * to be used for replaying FUID's. These pieces 820 5331 amw * are the actual FUIDs that were created initially. 821 5331 amw * The FUID table index may no longer be valid and 822 5331 amw * during zfs_create() a new index may be assigned. 823 5331 amw * Because of this the log will contain the original 824 5331 amw * doman+rid in order to create a new FUID. 825 5331 amw * 826 5331 amw * The individual ACEs may contain an ephemeral uid/gid which is no 827 5331 amw * longer valid and will need to be replaced with an actual FUID. 828 5331 amw * 829 5331 amw */ 830 5331 amw static int 831 5331 amw zfs_replay_acl(zfsvfs_t *zfsvfs, lr_acl_t *lr, boolean_t byteswap) 832 5331 amw { 833 5331 amw ace_t *ace = (ace_t *)(lr + 1); 834 5331 amw vsecattr_t vsa; 835 5331 amw znode_t *zp; 836 5331 amw int error; 837 5331 amw 838 5435 marks if (byteswap) { 839 5435 marks byteswap_uint64_array(lr, sizeof (*lr)); 840 5435 marks zfs_ace_byteswap(ace, lr->lr_acl_bytes, B_FALSE); 841 5435 marks if (lr->lr_fuidcnt) { 842 5435 marks byteswap_uint64_array((caddr_t)ace + 843 5435 marks ZIL_ACE_LENGTH(lr->lr_acl_bytes), 844 5435 marks lr->lr_fuidcnt * sizeof (uint64_t)); 845 5435 marks } 846 5435 marks } 847 5435 marks 848 10922 Jeff if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) 849 5331 amw return (error); 850 5331 amw 851 5331 amw bzero(&vsa, sizeof (vsa)); 852 5331 amw vsa.vsa_mask = VSA_ACE | VSA_ACECNT | VSA_ACE_ACLFLAGS; 853 5331 amw vsa.vsa_aclcnt = lr->lr_aclcnt; 854 5331 amw vsa.vsa_aclentp = ace; 855 5331 amw vsa.vsa_aclentsz = lr->lr_acl_bytes; 856 5331 amw vsa.vsa_aclflags = lr->lr_acl_flags; 857 5331 amw 858 5331 amw if (lr->lr_fuidcnt) { 859 5435 marks void *fuidstart = (caddr_t)ace + 860 5435 marks ZIL_ACE_LENGTH(lr->lr_acl_bytes); 861 5331 amw 862 5331 amw zfsvfs->z_fuid_replay = 863 5331 amw zfs_replay_fuids(fuidstart, &fuidstart, 864 5331 amw lr->lr_fuidcnt, lr->lr_domcnt, 0, 0); 865 5331 amw } 866 5331 amw 867 5331 amw error = VOP_SETSECATTR(ZTOV(zp), &vsa, 0, kcred, NULL); 868 5331 amw 869 5331 amw if (zfsvfs->z_fuid_replay) 870 5331 amw zfs_fuid_info_free(zfsvfs->z_fuid_replay); 871 5331 amw 872 5331 amw zfsvfs->z_fuid_replay = NULL; 873 789 ahrens VN_RELE(ZTOV(zp)); 874 789 ahrens 875 789 ahrens return (error); 876 789 ahrens } 877 789 ahrens 878 789 ahrens /* 879 789 ahrens * Callback vectors for replaying records 880 789 ahrens */ 881 789 ahrens zil_replay_func_t *zfs_replay_vector[TX_MAX_TYPE] = { 882 789 ahrens zfs_replay_error, /* 0 no such transaction type */ 883 789 ahrens zfs_replay_create, /* TX_CREATE */ 884 789 ahrens zfs_replay_create, /* TX_MKDIR */ 885 789 ahrens zfs_replay_create, /* TX_MKXATTR */ 886 789 ahrens zfs_replay_create, /* TX_SYMLINK */ 887 789 ahrens zfs_replay_remove, /* TX_REMOVE */ 888 789 ahrens zfs_replay_remove, /* TX_RMDIR */ 889 789 ahrens zfs_replay_link, /* TX_LINK */ 890 789 ahrens zfs_replay_rename, /* TX_RENAME */ 891 789 ahrens zfs_replay_write, /* TX_WRITE */ 892 789 ahrens zfs_replay_truncate, /* TX_TRUNCATE */ 893 789 ahrens zfs_replay_setattr, /* TX_SETATTR */ 894 5331 amw zfs_replay_acl_v0, /* TX_ACL_V0 */ 895 789 ahrens zfs_replay_acl, /* TX_ACL */ 896 5331 amw zfs_replay_create_acl, /* TX_CREATE_ACL */ 897 5331 amw zfs_replay_create, /* TX_CREATE_ATTR */ 898 5331 amw zfs_replay_create_acl, /* TX_CREATE_ACL_ATTR */ 899 5331 amw zfs_replay_create_acl, /* TX_MKDIR_ACL */ 900 5331 amw zfs_replay_create, /* TX_MKDIR_ATTR */ 901 5331 amw zfs_replay_create_acl, /* TX_MKDIR_ACL_ATTR */ 902 10800 Neil zfs_replay_write2, /* TX_WRITE2 */ 903 789 ahrens }; 904