xref: /onnv-gate/usr/src/uts/common/fs/zfs/zfs_log.c (revision 789:b348f31ed315)
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