1*789Sahrens /* 2*789Sahrens * CDDL HEADER START 3*789Sahrens * 4*789Sahrens * The contents of this file are subject to the terms of the 5*789Sahrens * Common Development and Distribution License, Version 1.0 only 6*789Sahrens * (the "License"). You may not use this file except in compliance 7*789Sahrens * with the License. 8*789Sahrens * 9*789Sahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*789Sahrens * or http://www.opensolaris.org/os/licensing. 11*789Sahrens * See the License for the specific language governing permissions 12*789Sahrens * and limitations under the License. 13*789Sahrens * 14*789Sahrens * When distributing Covered Code, include this CDDL HEADER in each 15*789Sahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*789Sahrens * If applicable, add the following below this CDDL HEADER, with the 17*789Sahrens * fields enclosed by brackets "[]" replaced with your own identifying 18*789Sahrens * information: Portions Copyright [yyyy] [name of copyright owner] 19*789Sahrens * 20*789Sahrens * CDDL HEADER END 21*789Sahrens */ 22*789Sahrens /* 23*789Sahrens * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24*789Sahrens * Use is subject to license terms. 25*789Sahrens */ 26*789Sahrens 27*789Sahrens #pragma ident "%Z%%M% %I% %E% SMI" 28*789Sahrens 29*789Sahrens #include <sys/types.h> 30*789Sahrens #include <sys/param.h> 31*789Sahrens #include <sys/systm.h> 32*789Sahrens #include <sys/sysmacros.h> 33*789Sahrens #include <sys/cmn_err.h> 34*789Sahrens #include <sys/kmem.h> 35*789Sahrens #include <sys/thread.h> 36*789Sahrens #include <sys/file.h> 37*789Sahrens #include <sys/vfs.h> 38*789Sahrens #include <sys/zfs_znode.h> 39*789Sahrens #include <sys/zfs_dir.h> 40*789Sahrens #include <sys/zil.h> 41*789Sahrens #include <sys/byteorder.h> 42*789Sahrens #include <sys/policy.h> 43*789Sahrens #include <sys/stat.h> 44*789Sahrens #include <sys/mode.h> 45*789Sahrens #include <sys/acl.h> 46*789Sahrens #include <sys/dmu.h> 47*789Sahrens #include <sys/spa.h> 48*789Sahrens #include <sys/ddi.h> 49*789Sahrens 50*789Sahrens /* 51*789Sahrens * All the functions in this file are used to construct the log entries 52*789Sahrens * to record transactions. They allocate * a intent log transaction 53*789Sahrens * structure (itx_t) and save within it all the information necessary to 54*789Sahrens * possibly replay the transaction. The itx is then assigned a sequence 55*789Sahrens * number and inserted in the in-memory list anchored in the zilog. 56*789Sahrens */ 57*789Sahrens 58*789Sahrens /* 59*789Sahrens * zfs_log_create() is used to handle TX_CREATE, TX_MKDIR and TX_MKXATTR 60*789Sahrens * transactions. 61*789Sahrens */ 62*789Sahrens uint64_t 63*789Sahrens zfs_log_create(zilog_t *zilog, dmu_tx_t *tx, int txtype, 64*789Sahrens znode_t *dzp, znode_t *zp, char *name) 65*789Sahrens { 66*789Sahrens itx_t *itx; 67*789Sahrens uint64_t seq; 68*789Sahrens lr_create_t *lr; 69*789Sahrens size_t namesize = strlen(name) + 1; 70*789Sahrens 71*789Sahrens if (zilog == NULL) 72*789Sahrens return (0); 73*789Sahrens 74*789Sahrens itx = zil_itx_create(txtype, sizeof (*lr) + namesize); 75*789Sahrens lr = (lr_create_t *)&itx->itx_lr; 76*789Sahrens lr->lr_doid = dzp->z_id; 77*789Sahrens lr->lr_foid = zp->z_id; 78*789Sahrens lr->lr_mode = zp->z_phys->zp_mode; 79*789Sahrens lr->lr_uid = zp->z_phys->zp_uid; 80*789Sahrens lr->lr_gid = zp->z_phys->zp_gid; 81*789Sahrens lr->lr_gen = zp->z_phys->zp_gen; 82*789Sahrens lr->lr_crtime[0] = zp->z_phys->zp_crtime[0]; 83*789Sahrens lr->lr_crtime[1] = zp->z_phys->zp_crtime[1]; 84*789Sahrens lr->lr_rdev = zp->z_phys->zp_rdev; 85*789Sahrens bcopy(name, (char *)(lr + 1), namesize); 86*789Sahrens 87*789Sahrens seq = zil_itx_assign(zilog, itx, tx); 88*789Sahrens dzp->z_last_itx = seq; 89*789Sahrens zp->z_last_itx = seq; 90*789Sahrens return (seq); 91*789Sahrens } 92*789Sahrens 93*789Sahrens /* 94*789Sahrens * zfs_log_remove() handles both TX_REMOVE and TX_RMDIR transactions. 95*789Sahrens */ 96*789Sahrens uint64_t 97*789Sahrens zfs_log_remove(zilog_t *zilog, dmu_tx_t *tx, int txtype, 98*789Sahrens znode_t *dzp, char *name) 99*789Sahrens { 100*789Sahrens itx_t *itx; 101*789Sahrens uint64_t seq; 102*789Sahrens lr_remove_t *lr; 103*789Sahrens size_t namesize = strlen(name) + 1; 104*789Sahrens 105*789Sahrens if (zilog == NULL) 106*789Sahrens return (0); 107*789Sahrens 108*789Sahrens itx = zil_itx_create(txtype, sizeof (*lr) + namesize); 109*789Sahrens lr = (lr_remove_t *)&itx->itx_lr; 110*789Sahrens lr->lr_doid = dzp->z_id; 111*789Sahrens bcopy(name, (char *)(lr + 1), namesize); 112*789Sahrens 113*789Sahrens seq = zil_itx_assign(zilog, itx, tx); 114*789Sahrens dzp->z_last_itx = seq; 115*789Sahrens return (seq); 116*789Sahrens } 117*789Sahrens 118*789Sahrens /* 119*789Sahrens * zfs_log_link() handles TX_LINK transactions. 120*789Sahrens */ 121*789Sahrens uint64_t 122*789Sahrens zfs_log_link(zilog_t *zilog, dmu_tx_t *tx, int txtype, 123*789Sahrens znode_t *dzp, znode_t *zp, char *name) 124*789Sahrens { 125*789Sahrens itx_t *itx; 126*789Sahrens uint64_t seq; 127*789Sahrens lr_link_t *lr; 128*789Sahrens size_t namesize = strlen(name) + 1; 129*789Sahrens 130*789Sahrens if (zilog == NULL) 131*789Sahrens return (0); 132*789Sahrens 133*789Sahrens itx = zil_itx_create(txtype, sizeof (*lr) + namesize); 134*789Sahrens lr = (lr_link_t *)&itx->itx_lr; 135*789Sahrens lr->lr_doid = dzp->z_id; 136*789Sahrens lr->lr_link_obj = zp->z_id; 137*789Sahrens bcopy(name, (char *)(lr + 1), namesize); 138*789Sahrens 139*789Sahrens seq = zil_itx_assign(zilog, itx, tx); 140*789Sahrens dzp->z_last_itx = seq; 141*789Sahrens zp->z_last_itx = seq; 142*789Sahrens return (seq); 143*789Sahrens } 144*789Sahrens 145*789Sahrens /* 146*789Sahrens * zfs_log_symlink() handles TX_SYMLINK transactions. 147*789Sahrens */ 148*789Sahrens uint64_t 149*789Sahrens zfs_log_symlink(zilog_t *zilog, dmu_tx_t *tx, int txtype, 150*789Sahrens znode_t *dzp, znode_t *zp, char *name, char *link) 151*789Sahrens { 152*789Sahrens itx_t *itx; 153*789Sahrens uint64_t seq; 154*789Sahrens lr_create_t *lr; 155*789Sahrens size_t namesize = strlen(name) + 1; 156*789Sahrens size_t linksize = strlen(link) + 1; 157*789Sahrens 158*789Sahrens if (zilog == NULL) 159*789Sahrens return (0); 160*789Sahrens 161*789Sahrens itx = zil_itx_create(txtype, sizeof (*lr) + namesize + linksize); 162*789Sahrens lr = (lr_create_t *)&itx->itx_lr; 163*789Sahrens lr->lr_doid = dzp->z_id; 164*789Sahrens lr->lr_foid = zp->z_id; 165*789Sahrens lr->lr_mode = zp->z_phys->zp_mode; 166*789Sahrens lr->lr_uid = zp->z_phys->zp_uid; 167*789Sahrens lr->lr_gid = zp->z_phys->zp_gid; 168*789Sahrens lr->lr_gen = zp->z_phys->zp_gen; 169*789Sahrens lr->lr_crtime[0] = zp->z_phys->zp_crtime[0]; 170*789Sahrens lr->lr_crtime[1] = zp->z_phys->zp_crtime[1]; 171*789Sahrens bcopy(name, (char *)(lr + 1), namesize); 172*789Sahrens bcopy(link, (char *)(lr + 1) + namesize, linksize); 173*789Sahrens 174*789Sahrens seq = zil_itx_assign(zilog, itx, tx); 175*789Sahrens dzp->z_last_itx = seq; 176*789Sahrens zp->z_last_itx = seq; 177*789Sahrens return (seq); 178*789Sahrens } 179*789Sahrens 180*789Sahrens /* 181*789Sahrens * zfs_log_rename() handles TX_RENAME transactions. 182*789Sahrens */ 183*789Sahrens uint64_t 184*789Sahrens zfs_log_rename(zilog_t *zilog, dmu_tx_t *tx, int txtype, 185*789Sahrens znode_t *sdzp, char *sname, znode_t *tdzp, char *dname, znode_t *szp) 186*789Sahrens { 187*789Sahrens itx_t *itx; 188*789Sahrens uint64_t seq; 189*789Sahrens lr_rename_t *lr; 190*789Sahrens size_t snamesize = strlen(sname) + 1; 191*789Sahrens size_t dnamesize = strlen(dname) + 1; 192*789Sahrens 193*789Sahrens if (zilog == NULL) 194*789Sahrens return (0); 195*789Sahrens 196*789Sahrens itx = zil_itx_create(txtype, sizeof (*lr) + snamesize + dnamesize); 197*789Sahrens lr = (lr_rename_t *)&itx->itx_lr; 198*789Sahrens lr->lr_sdoid = sdzp->z_id; 199*789Sahrens lr->lr_tdoid = tdzp->z_id; 200*789Sahrens bcopy(sname, (char *)(lr + 1), snamesize); 201*789Sahrens bcopy(dname, (char *)(lr + 1) + snamesize, dnamesize); 202*789Sahrens 203*789Sahrens seq = zil_itx_assign(zilog, itx, tx); 204*789Sahrens sdzp->z_last_itx = seq; 205*789Sahrens tdzp->z_last_itx = seq; 206*789Sahrens szp->z_last_itx = seq; 207*789Sahrens return (seq); 208*789Sahrens } 209*789Sahrens 210*789Sahrens /* 211*789Sahrens * zfs_log_write() handles TX_WRITE transactions. 212*789Sahrens * 213*789Sahrens * We store data in the log buffers if it small enough. 214*789Sahrens * Otherwise we flush the data out via dmu_sync(). 215*789Sahrens */ 216*789Sahrens ssize_t zfs_immediate_write_sz = 65536; 217*789Sahrens 218*789Sahrens uint64_t 219*789Sahrens zfs_log_write(zilog_t *zilog, dmu_tx_t *tx, int txtype, 220*789Sahrens znode_t *zp, offset_t off, ssize_t len, int ioflag, uio_t *uio) 221*789Sahrens { 222*789Sahrens itx_t *itx; 223*789Sahrens uint64_t seq; 224*789Sahrens lr_write_t *lr; 225*789Sahrens int dlen, err; 226*789Sahrens 227*789Sahrens if (zilog == NULL || zp->z_reap) 228*789Sahrens return (0); 229*789Sahrens 230*789Sahrens dlen = (len <= zfs_immediate_write_sz ? len : 0); 231*789Sahrens itx = zil_itx_create(txtype, sizeof (*lr) + dlen); 232*789Sahrens itx->itx_data_copied = 0; 233*789Sahrens if ((ioflag & FDSYNC) && (dlen != 0)) { 234*789Sahrens err = xcopyin(uio->uio_iov->iov_base - len, 235*789Sahrens (char *)itx + offsetof(itx_t, itx_lr) + sizeof (*lr), 236*789Sahrens len); 237*789Sahrens /* 238*789Sahrens * copyin shouldn't fault as we've already successfully 239*789Sahrens * copied it to a dmu buffer. However if it does we'll get 240*789Sahrens * the data from the dmu later. 241*789Sahrens */ 242*789Sahrens if (!err) 243*789Sahrens itx->itx_data_copied = 1; 244*789Sahrens } 245*789Sahrens lr = (lr_write_t *)&itx->itx_lr; 246*789Sahrens lr->lr_foid = zp->z_id; 247*789Sahrens lr->lr_offset = off; 248*789Sahrens lr->lr_length = len; 249*789Sahrens lr->lr_blkoff = 0; 250*789Sahrens BP_ZERO(&lr->lr_blkptr); 251*789Sahrens 252*789Sahrens itx->itx_private = zp->z_zfsvfs; 253*789Sahrens 254*789Sahrens seq = zil_itx_assign(zilog, itx, tx); 255*789Sahrens zp->z_last_itx = seq; 256*789Sahrens return (seq); 257*789Sahrens } 258*789Sahrens 259*789Sahrens /* 260*789Sahrens * zfs_log_truncate() handles TX_TRUNCATE transactions. 261*789Sahrens */ 262*789Sahrens uint64_t 263*789Sahrens zfs_log_truncate(zilog_t *zilog, dmu_tx_t *tx, int txtype, 264*789Sahrens znode_t *zp, uint64_t off, uint64_t len) 265*789Sahrens { 266*789Sahrens itx_t *itx; 267*789Sahrens uint64_t seq; 268*789Sahrens lr_truncate_t *lr; 269*789Sahrens 270*789Sahrens if (zilog == NULL || zp->z_reap) 271*789Sahrens return (0); 272*789Sahrens 273*789Sahrens itx = zil_itx_create(txtype, sizeof (*lr)); 274*789Sahrens lr = (lr_truncate_t *)&itx->itx_lr; 275*789Sahrens lr->lr_foid = zp->z_id; 276*789Sahrens lr->lr_offset = off; 277*789Sahrens lr->lr_length = len; 278*789Sahrens 279*789Sahrens seq = zil_itx_assign(zilog, itx, tx); 280*789Sahrens zp->z_last_itx = seq; 281*789Sahrens return (seq); 282*789Sahrens } 283*789Sahrens 284*789Sahrens /* 285*789Sahrens * zfs_log_setattr() handles TX_SETATTR transactions. 286*789Sahrens */ 287*789Sahrens uint64_t 288*789Sahrens zfs_log_setattr(zilog_t *zilog, dmu_tx_t *tx, int txtype, 289*789Sahrens znode_t *zp, vattr_t *vap, uint_t mask_applied) 290*789Sahrens { 291*789Sahrens itx_t *itx; 292*789Sahrens uint64_t seq; 293*789Sahrens lr_setattr_t *lr; 294*789Sahrens 295*789Sahrens if (zilog == NULL || zp->z_reap) 296*789Sahrens return (0); 297*789Sahrens 298*789Sahrens itx = zil_itx_create(txtype, sizeof (*lr)); 299*789Sahrens lr = (lr_setattr_t *)&itx->itx_lr; 300*789Sahrens lr->lr_foid = zp->z_id; 301*789Sahrens lr->lr_mask = (uint64_t)mask_applied; 302*789Sahrens lr->lr_mode = (uint64_t)vap->va_mode; 303*789Sahrens lr->lr_uid = (uint64_t)vap->va_uid; 304*789Sahrens lr->lr_gid = (uint64_t)vap->va_gid; 305*789Sahrens lr->lr_size = (uint64_t)vap->va_size; 306*789Sahrens ZFS_TIME_ENCODE(&vap->va_atime, lr->lr_atime); 307*789Sahrens ZFS_TIME_ENCODE(&vap->va_mtime, lr->lr_mtime); 308*789Sahrens 309*789Sahrens seq = zil_itx_assign(zilog, itx, tx); 310*789Sahrens zp->z_last_itx = seq; 311*789Sahrens return (seq); 312*789Sahrens } 313*789Sahrens 314*789Sahrens /* 315*789Sahrens * zfs_log_acl() handles TX_ACL transactions. 316*789Sahrens */ 317*789Sahrens uint64_t 318*789Sahrens zfs_log_acl(zilog_t *zilog, dmu_tx_t *tx, int txtype, 319*789Sahrens znode_t *zp, int aclcnt, ace_t *z_ace) 320*789Sahrens { 321*789Sahrens itx_t *itx; 322*789Sahrens uint64_t seq; 323*789Sahrens lr_acl_t *lr; 324*789Sahrens 325*789Sahrens if (zilog == NULL || zp->z_reap) 326*789Sahrens return (0); 327*789Sahrens 328*789Sahrens itx = zil_itx_create(txtype, sizeof (*lr) + aclcnt * sizeof (ace_t)); 329*789Sahrens lr = (lr_acl_t *)&itx->itx_lr; 330*789Sahrens lr->lr_foid = zp->z_id; 331*789Sahrens lr->lr_aclcnt = (uint64_t)aclcnt; 332*789Sahrens bcopy(z_ace, (ace_t *)(lr + 1), aclcnt * sizeof (ace_t)); 333*789Sahrens 334*789Sahrens seq = zil_itx_assign(zilog, itx, tx); 335*789Sahrens zp->z_last_itx = seq; 336*789Sahrens return (seq); 337*789Sahrens } 338