author | eschrock |
Tue, 16 May 2006 11:20:11 -0700 | |
changeset 1986 | 628267397204 |
parent 1842 | 1712a484fc9d |
child 2199 | 712a788c2dfd |
permissions | -rw-r--r-- |
789 | 1 |
/* |
2 |
* CDDL HEADER START |
|
3 |
* |
|
4 |
* The contents of this file are subject to the terms of the |
|
1646
b4e43ae19fff
6393443 Remove remaining txg_wait_synced() from zfs unmount path.
perrin
parents:
789
diff
changeset
|
5 |
* Common Development and Distribution License (the "License"). |
b4e43ae19fff
6393443 Remove remaining txg_wait_synced() from zfs unmount path.
perrin
parents:
789
diff
changeset
|
6 |
* You may not use this file except in compliance with the License. |
789 | 7 |
* |
8 |
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
|
9 |
* or http://www.opensolaris.org/os/licensing. |
|
10 |
* See the License for the specific language governing permissions |
|
11 |
* and limitations under the License. |
|
12 |
* |
|
13 |
* When distributing Covered Code, include this CDDL HEADER in each |
|
14 |
* file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
|
15 |
* If applicable, add the following below this CDDL HEADER, with the |
|
16 |
* fields enclosed by brackets "[]" replaced with your own identifying |
|
17 |
* information: Portions Copyright [yyyy] [name of copyright owner] |
|
18 |
* |
|
19 |
* CDDL HEADER END |
|
20 |
*/ |
|
21 |
/* |
|
1646
b4e43ae19fff
6393443 Remove remaining txg_wait_synced() from zfs unmount path.
perrin
parents:
789
diff
changeset
|
22 |
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. |
789 | 23 |
* Use is subject to license terms. |
24 |
*/ |
|
25 |
||
26 |
#ifndef _SYS_ZIL_H |
|
27 |
#define _SYS_ZIL_H |
|
28 |
||
29 |
#pragma ident "%Z%%M% %I% %E% SMI" |
|
30 |
||
31 |
#include <sys/types.h> |
|
32 |
#include <sys/spa.h> |
|
33 |
#include <sys/zio.h> |
|
34 |
#include <sys/dmu.h> |
|
35 |
||
36 |
#ifdef __cplusplus |
|
37 |
extern "C" { |
|
38 |
#endif |
|
39 |
||
40 |
/* |
|
41 |
* Intent log format: |
|
42 |
* |
|
43 |
* Each objset has its own intent log. The log header (zil_header_t) |
|
44 |
* for objset N's intent log is kept in the Nth object of the SPA's |
|
45 |
* intent_log objset. The log header points to a chain of log blocks, |
|
46 |
* each of which contains log records (i.e., transactions) followed by |
|
47 |
* a log block trailer (zil_trailer_t). The format of a log record |
|
48 |
* depends on the record (or transaction) type, but all records begin |
|
49 |
* with a common structure that defines the type, length, and txg. |
|
50 |
*/ |
|
51 |
||
52 |
/* |
|
53 |
* Intent log header - this on disk structure holds fields to manage |
|
54 |
* the log. All fields are 64 bit to easily handle cross architectures. |
|
55 |
*/ |
|
56 |
typedef struct zil_header { |
|
57 |
uint64_t zh_claim_txg; /* txg in which log blocks were claimed */ |
|
58 |
uint64_t zh_replay_seq; /* highest replayed sequence number */ |
|
59 |
blkptr_t zh_log; /* log chain */ |
|
1807
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
60 |
uint64_t zh_claim_seq; /* highest claimed sequence number */ |
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
61 |
uint64_t zh_pad[5]; |
789 | 62 |
} zil_header_t; |
63 |
||
64 |
/* |
|
65 |
* Log block trailer - structure at the end of the header and each log block |
|
66 |
* |
|
67 |
* The zit_bt contains a zbt_cksum which for the intent log is |
|
68 |
* the sequence number of this log block. A seq of 0 is invalid. |
|
69 |
* The zbt_cksum is checked by the SPA against the sequence |
|
70 |
* number passed in the blk_cksum field of the blkptr_t |
|
71 |
*/ |
|
72 |
typedef struct zil_trailer { |
|
73 |
uint64_t zit_pad; |
|
74 |
blkptr_t zit_next_blk; /* next block in chain */ |
|
75 |
uint64_t zit_nused; /* bytes in log block used */ |
|
76 |
zio_block_tail_t zit_bt; /* block trailer */ |
|
77 |
} zil_trailer_t; |
|
78 |
||
1842
1712a484fc9d
6413731 pathologically slower fsync on 32 bit systems
perrin
parents:
1807
diff
changeset
|
79 |
#define ZIL_MIN_BLKSZ 4096ULL |
789 | 80 |
#define ZIL_MAX_BLKSZ SPA_MAXBLOCKSIZE |
81 |
#define ZIL_BLK_DATA_SZ(lwb) ((lwb)->lwb_sz - sizeof (zil_trailer_t)) |
|
82 |
||
83 |
/* |
|
1807
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
84 |
* The words of a log block checksum. |
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
85 |
*/ |
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
86 |
#define ZIL_ZC_GUID_0 0 |
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
87 |
#define ZIL_ZC_GUID_1 1 |
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
88 |
#define ZIL_ZC_OBJSET 2 |
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
89 |
#define ZIL_ZC_SEQ 3 |
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
90 |
|
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
91 |
/* |
789 | 92 |
* Intent log transaction types and record structures |
93 |
*/ |
|
94 |
#define TX_CREATE 1 /* Create file */ |
|
95 |
#define TX_MKDIR 2 /* Make directory */ |
|
96 |
#define TX_MKXATTR 3 /* Make XATTR directory */ |
|
97 |
#define TX_SYMLINK 4 /* Create symbolic link to a file */ |
|
98 |
#define TX_REMOVE 5 /* Remove file */ |
|
99 |
#define TX_RMDIR 6 /* Remove directory */ |
|
100 |
#define TX_LINK 7 /* Create hard link to a file */ |
|
101 |
#define TX_RENAME 8 /* Rename a file */ |
|
102 |
#define TX_WRITE 9 /* File write */ |
|
103 |
#define TX_TRUNCATE 10 /* Truncate a file */ |
|
104 |
#define TX_SETATTR 11 /* Set file attributes */ |
|
105 |
#define TX_ACL 12 /* Set acl */ |
|
106 |
#define TX_MAX_TYPE 13 /* Max transaction type */ |
|
107 |
||
108 |
/* |
|
109 |
* Format of log records. |
|
110 |
* The fields are carefully defined to allow them to be aligned |
|
111 |
* and sized the same on sparc & intel architectures. |
|
112 |
* Each log record has a common structure at the beginning. |
|
113 |
*/ |
|
114 |
typedef struct { /* common log record header */ |
|
115 |
uint64_t lrc_txtype; /* intent log transaction type */ |
|
116 |
uint64_t lrc_reclen; /* transaction record length */ |
|
117 |
uint64_t lrc_txg; /* dmu transaction group number */ |
|
118 |
uint64_t lrc_seq; /* intent log sequence number */ |
|
119 |
} lr_t; |
|
120 |
||
121 |
typedef struct { |
|
122 |
lr_t lr_common; /* common portion of log record */ |
|
123 |
uint64_t lr_doid; /* object id of directory */ |
|
124 |
uint64_t lr_foid; /* object id of created file object */ |
|
125 |
uint64_t lr_mode; /* mode of object */ |
|
126 |
uint64_t lr_uid; /* uid of object */ |
|
127 |
uint64_t lr_gid; /* gid of object */ |
|
128 |
uint64_t lr_gen; /* generation (txg of creation) */ |
|
129 |
uint64_t lr_crtime[2]; /* creation time */ |
|
130 |
uint64_t lr_rdev; /* rdev of object to create */ |
|
131 |
/* name of object to create follows this */ |
|
132 |
/* for symlinks, link content follows name */ |
|
133 |
} lr_create_t; |
|
134 |
||
135 |
typedef struct { |
|
136 |
lr_t lr_common; /* common portion of log record */ |
|
137 |
uint64_t lr_doid; /* obj id of directory */ |
|
138 |
/* name of object to remove follows this */ |
|
139 |
} lr_remove_t; |
|
140 |
||
141 |
typedef struct { |
|
142 |
lr_t lr_common; /* common portion of log record */ |
|
143 |
uint64_t lr_doid; /* obj id of directory */ |
|
144 |
uint64_t lr_link_obj; /* obj id of link */ |
|
145 |
/* name of object to link follows this */ |
|
146 |
} lr_link_t; |
|
147 |
||
148 |
typedef struct { |
|
149 |
lr_t lr_common; /* common portion of log record */ |
|
150 |
uint64_t lr_sdoid; /* obj id of source directory */ |
|
151 |
uint64_t lr_tdoid; /* obj id of target directory */ |
|
152 |
/* 2 strings: names of source and destination follow this */ |
|
153 |
} lr_rename_t; |
|
154 |
||
155 |
typedef struct { |
|
156 |
lr_t lr_common; /* common portion of log record */ |
|
157 |
uint64_t lr_foid; /* file object to write */ |
|
158 |
uint64_t lr_offset; /* offset to write to */ |
|
159 |
uint64_t lr_length; /* user data length to write */ |
|
160 |
uint64_t lr_blkoff; /* offset represented by lr_blkptr */ |
|
161 |
blkptr_t lr_blkptr; /* spa block pointer for replay */ |
|
162 |
/* write data will follow for small writes */ |
|
163 |
} lr_write_t; |
|
164 |
||
165 |
typedef struct { |
|
166 |
lr_t lr_common; /* common portion of log record */ |
|
167 |
uint64_t lr_foid; /* object id of file to truncate */ |
|
168 |
uint64_t lr_offset; /* offset to truncate from */ |
|
169 |
uint64_t lr_length; /* length to truncate */ |
|
170 |
} lr_truncate_t; |
|
171 |
||
172 |
typedef struct { |
|
173 |
lr_t lr_common; /* common portion of log record */ |
|
174 |
uint64_t lr_foid; /* file object to change attributes */ |
|
175 |
uint64_t lr_mask; /* mask of attributes to set */ |
|
176 |
uint64_t lr_mode; /* mode to set */ |
|
177 |
uint64_t lr_uid; /* uid to set */ |
|
178 |
uint64_t lr_gid; /* gid to set */ |
|
179 |
uint64_t lr_size; /* size to set */ |
|
180 |
uint64_t lr_atime[2]; /* access time */ |
|
181 |
uint64_t lr_mtime[2]; /* modification time */ |
|
182 |
} lr_setattr_t; |
|
183 |
||
184 |
typedef struct { |
|
185 |
lr_t lr_common; /* common portion of log record */ |
|
186 |
uint64_t lr_foid; /* obj id of file */ |
|
187 |
uint64_t lr_aclcnt; /* number of acl entries */ |
|
188 |
/* lr_aclcnt number of ace_t entries follow this */ |
|
189 |
} lr_acl_t; |
|
190 |
||
191 |
/* |
|
192 |
* ZIL structure definitions, interface function prototype and globals. |
|
193 |
*/ |
|
194 |
||
195 |
/* |
|
196 |
* ZFS intent log transaction structure |
|
197 |
*/ |
|
1669 | 198 |
typedef enum { |
199 |
WR_INDIRECT, /* indirect - a large write (dmu_sync() data */ |
|
200 |
/* and put blkptr in log, rather than actual data) */ |
|
201 |
WR_COPIED, /* immediate - data is copied into lr_write_t */ |
|
202 |
WR_NEED_COPY, /* immediate - data needs to be copied if pushed */ |
|
203 |
} itx_wr_state_t; |
|
204 |
||
789 | 205 |
typedef struct itx { |
206 |
list_node_t itx_node; /* linkage on zl_itx_list */ |
|
207 |
void *itx_private; /* type-specific opaque data */ |
|
1669 | 208 |
itx_wr_state_t itx_wr_state; /* write state */ |
789 | 209 |
lr_t itx_lr; /* common part of log record */ |
210 |
/* followed by type-specific part of lr_xx_t and its immediate data */ |
|
211 |
} itx_t; |
|
212 |
||
213 |
typedef void zil_parse_blk_func_t(zilog_t *zilog, blkptr_t *bp, void *arg, |
|
214 |
uint64_t txg); |
|
215 |
typedef void zil_parse_lr_func_t(zilog_t *zilog, lr_t *lr, void *arg, |
|
216 |
uint64_t txg); |
|
217 |
typedef int zil_replay_func_t(); |
|
1669 | 218 |
typedef int zil_get_data_t(void *arg, lr_write_t *lr, char *dbuf); |
789 | 219 |
|
1807
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
220 |
extern uint64_t zil_parse(zilog_t *zilog, zil_parse_blk_func_t *parse_blk_func, |
789 | 221 |
zil_parse_lr_func_t *parse_lr_func, void *arg, uint64_t txg); |
222 |
||
223 |
extern void zil_init(void); |
|
224 |
extern void zil_fini(void); |
|
225 |
||
226 |
extern zilog_t *zil_alloc(objset_t *os, zil_header_t *zh_phys); |
|
227 |
extern void zil_free(zilog_t *zilog); |
|
228 |
||
229 |
extern zilog_t *zil_open(objset_t *os, zil_get_data_t *get_data); |
|
230 |
extern void zil_close(zilog_t *zilog); |
|
231 |
||
232 |
extern void zil_replay(objset_t *os, void *arg, uint64_t *txgp, |
|
233 |
zil_replay_func_t *replay_func[TX_MAX_TYPE], void (*rm_wait)(void *)); |
|
1807
35c8b566d7af
6410711 intent log blocks don't get invited to pool parties
bonwick
parents:
1669
diff
changeset
|
234 |
extern void zil_destroy(zilog_t *zilog, boolean_t keep_first); |
789 | 235 |
|
236 |
extern itx_t *zil_itx_create(int txtype, size_t lrsize); |
|
237 |
extern uint64_t zil_itx_assign(zilog_t *zilog, itx_t *itx, dmu_tx_t *tx); |
|
238 |
||
239 |
extern void zil_commit(zilog_t *zilog, uint64_t seq, int ioflag); |
|
240 |
||
241 |
extern void zil_claim(char *osname, void *txarg); |
|
242 |
extern void zil_sync(zilog_t *zilog, dmu_tx_t *tx); |
|
243 |
extern void zil_clean(zilog_t *zilog); |
|
1646
b4e43ae19fff
6393443 Remove remaining txg_wait_synced() from zfs unmount path.
perrin
parents:
789
diff
changeset
|
244 |
extern int zil_is_committed(zilog_t *zilog); |
789 | 245 |
|
246 |
extern int zil_suspend(zilog_t *zilog); |
|
247 |
extern void zil_resume(zilog_t *zilog); |
|
248 |
||
249 |
extern int zil_disable; |
|
250 |
extern int zil_always; |
|
251 |
extern int zil_purge; |
|
252 |
||
253 |
#ifdef __cplusplus |
|
254 |
} |
|
255 |
#endif |
|
256 |
||
257 |
#endif /* _SYS_ZIL_H */ |