xref: /titanic_44/usr/src/uts/common/sys/fs/ufs_log.h (revision b7f45089ccbe01bab3d7c7377b49d80d2ae18a69)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _SYS_FS_UFS_LOG_H
28 #define	_SYS_FS_UFS_LOG_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #include <sys/buf.h>
33 #include <sys/fs/ufs_trans.h>
34 #include <sys/fs/ufs_filio.h>
35 #include <sys/fs/ufs_inode.h>
36 
37 #ifdef	__cplusplus
38 extern "C" {
39 #endif
40 
41 typedef struct lufs_save {
42 	buf_t		*sv_bp;
43 	size_t		sv_nb_left;
44 	int		sv_error;
45 } lufs_save_t;
46 
47 typedef struct lufs_buf {
48 	buf_t		lb_buf;
49 	void		*lb_ptr;
50 } lufs_buf_t;
51 
52 /*
53  * Log space is stored as extents
54  */
55 #define	LUFS_EXTENTS	(UINT32_C(0))
56 #define	LS_SECTORS	2
57 
58 typedef struct extent {
59 	uint32_t	lbno;	/* Logical block # within the space */
60 	uint32_t	pbno;	/* Physical block number of extent. */
61 				/* in disk blocks for non-MTB ufs */
62 				/* in frags for MTB ufs */
63 	uint32_t	nbno;	/* # blocks in this extent */
64 } extent_t;
65 
66 typedef struct ic_extent {
67 	uint32_t	ic_lbno;	/* Logical block # within the space */
68 	uint32_t	ic_nbno;	/* # blocks in this extent */
69 	daddr_t		ic_pbno;	/* Physical block number of extent. */
70 					/* (always in disk blocks) 	*/
71 } ic_extent_t;
72 
73 typedef struct extent_block {
74 	uint32_t	type;		/* Set to LUFS_EXTENTS to identify */
75 					/*   structure on disk. */
76 	int32_t		chksum;		/* Checksum over entire block. */
77 	uint32_t	nextents;	/* Size of extents array. */
78 	uint32_t	nbytes;		/* # bytes mapped by extent_block. */
79 	uint32_t	nextbno;	/* blkno of next extent_block. */
80 	extent_t	extents[1];
81 } extent_block_t;
82 
83 typedef struct ic_extent_block {
84 	uint32_t	ic_nextents;	/* Size of extents array. */
85 	uint32_t	ic_nbytes;	/* # bytes mapped by extent_block. */
86 	uint32_t	ic_nextbno;	/* blkno of next extent_block. */
87 	ic_extent_t	ic_extents[1];
88 } ic_extent_block_t;
89 
90 /*
91  * Don't size the incore buffers too small or too large
92  */
93 #define	LDL_MINTRANSFER		(UINT32_C(32768))	/* 32 k */
94 #define	LDL_MAXTRANSFER		(UINT32_C(1048576))	/* 1 M */
95 
96 /*
97  * LDL_DIVISOR (ldl_divisor) is the number to calculate the log size
98  * from the file system size according to the calculation in lufs_enable()
99  */
100 #define	LDL_DIVISOR		1024 /* 1024 gives 1MB per 1GB */
101 
102 /*
103  * But set reasonable min/max units
104  *   BUT never set LDL_MAXLOGSIZE to greater than LDL_REALMAXLOGSIZE.  The
105  *   scan code will break (See sect_trailer).
106  */
107 #define	LDL_MINLOGSIZE		(1024 * 1024)
108 #define	LDL_MAXLOGSIZE		(64 * 1024 * 1024)
109 
110 #define	LDL_MINBUFSIZE		(32 * 1024)
111 #define	LDL_USABLE_BSIZE	(DEV_BSIZE - sizeof (sect_trailer_t))
112 #define	NB_LEFT_IN_SECTOR(off) 	(LDL_USABLE_BSIZE - ((off) - dbtob(btodb(off))))
113 
114 typedef struct cirbuf {
115 	buf_t		*cb_bp;		/* buf's with space in circular buf */
116 	buf_t		*cb_dirty;	/* filling this buffer for log write */
117 	buf_t		*cb_free;	/* free bufs list */
118 	caddr_t		cb_va;		/* address of circular buffer */
119 	size_t		cb_nb;		/* size of circular buffer */
120 	krwlock_t	cb_rwlock;	/* r/w lock to protect list mgmt. */
121 } cirbuf_t;
122 
123 #define	LUFS_VERSION		(UINT32_C(1))	/* Version 1 */
124 #define	LUFS_VERSION_LATEST	LUFS_VERSION
125 
126 /*
127  * The old Disksuite unit structure has been split into two parts -- the
128  * incore part which is created at run time and the ondisk structure.  To
129  * minimize code changes, the incore structure retains the old name,
130  * ml_unit_t and the ondisk structure is called ml_odunit_t.  The ondisk
131  * structure is stored at the beginning of the log.
132  *
133  * This structure must fit into a sector (512b)
134  *
135  */
136 typedef struct ml_odunit {
137 	uint32_t	od_version;	/* version number */
138 	uint32_t	od_badlog;	/* is the log okay? */
139 	uint32_t	od_unused1;
140 
141 	/*
142 	 * Important constants
143 	 */
144 	uint32_t	od_maxtransfer;	/* max transfer in bytes */
145 	uint32_t	od_devbsize;	/* device bsize */
146 	int32_t		od_bol_lof;	/* byte offset to begin of log */
147 	int32_t		od_eol_lof;	/* byte offset to end of log */
148 
149 	/*
150 	 * The disk space is split into state and circular log
151 	 */
152 	uint32_t	od_requestsize;	/* size requested by user */
153 	uint32_t	od_statesize;	/* size of state area in bytes */
154 	uint32_t	od_logsize;	/* size of log area in bytes */
155 	int32_t		od_statebno;	/* first block of state area */
156 	int32_t		od_unused2;
157 
158 	/*
159 	 * Head and tail of log
160 	 */
161 	int32_t		od_head_lof;	/* byte offset of head */
162 	uint32_t	od_head_ident;	/* head sector id # */
163 	int32_t		od_tail_lof;	/* byte offset of tail */
164 	uint32_t	od_tail_ident;	/* tail sector id # */
165 	uint32_t	od_chksum;	/* checksum to verify ondisk contents */
166 
167 	/*
168 	 * Used for error recovery
169 	 */
170 	uint32_t	od_head_tid;	/* used for logscan; set at sethead */
171 
172 	/*
173 	 * Debug bits
174 	 */
175 	int32_t		od_debug;
176 
177 	/*
178 	 * Misc
179 	 */
180 	struct timeval	od_timestamp;	/* time of last state change */
181 } ml_odunit_t;
182 
183 typedef struct ml_unit {
184 	struct ml_unit	*un_next;	/* next incore log */
185 	int		un_flags;	/* Incore state */
186 	buf_t		*un_bp;		/* contains memory for un_ondisk */
187 	struct ufsvfs	*un_ufsvfs;	/* backpointer to ufsvfs */
188 	dev_t		un_dev;		/* for convenience */
189 	ic_extent_block_t *un_ebp;	/* block of extents */
190 	size_t		un_nbeb;	/* # bytes used by *un_ebp */
191 	struct mt_map	*un_deltamap;	/* deltamap */
192 	struct mt_map	*un_logmap;	/* logmap includes moby trans stuff */
193 	struct mt_map	*un_matamap;	/* optional - matamap */
194 
195 	/*
196 	 * Used for managing transactions
197 	 */
198 	uint32_t	un_maxresv;	/* maximum reservable space */
199 	uint32_t	un_resv;	/* reserved byte count for this trans */
200 	uint32_t	un_resv_wantin;	/* reserved byte count for next trans */
201 
202 	/*
203 	 * Used during logscan
204 	 */
205 	uint32_t	un_tid;
206 
207 	/*
208 	 * Read/Write Buffers
209 	 */
210 	cirbuf_t	un_rdbuf;	/* read buffer space */
211 	cirbuf_t	un_wrbuf;	/* write buffer space */
212 
213 	/*
214 	 * Ondisk state
215 	 */
216 	ml_odunit_t	un_ondisk;	/* ondisk log information */
217 
218 	/*
219 	 * locks
220 	 */
221 	kmutex_t	un_log_mutex;	/* allows one log write at a time */
222 	kmutex_t	un_state_mutex;	/* only 1 state update at a time */
223 } ml_unit_t;
224 
225 /*
226  * Macros to allow access to the ondisk elements via the ml_unit_t incore
227  * structure.
228  */
229 
230 #define	un_version	un_ondisk.od_version
231 #define	un_badlog	un_ondisk.od_badlog
232 #define	un_maxtransfer	un_ondisk.od_maxtransfer
233 #define	un_devbsize	un_ondisk.od_devbsize
234 #define	un_bol_lof	un_ondisk.od_bol_lof
235 #define	un_eol_lof	un_ondisk.od_eol_lof
236 #define	un_statesize	un_ondisk.od_statesize
237 #define	un_logsize	un_ondisk.od_logsize
238 #define	un_statebno	un_ondisk.od_statebno
239 #define	un_requestsize	un_ondisk.od_requestsize
240 #define	un_head_lof	un_ondisk.od_head_lof
241 #define	un_head_ident	un_ondisk.od_head_ident
242 #define	un_tail_lof	un_ondisk.od_tail_lof
243 #define	un_tail_ident	un_ondisk.od_tail_ident
244 #define	un_chksum	un_ondisk.od_chksum
245 #define	un_head_tid	un_ondisk.od_head_tid
246 #define	un_debug	un_ondisk.od_debug
247 #define	un_timestamp	un_ondisk.od_timestamp
248 
249 /*
250  *	un_flags
251  */
252 #define	LDL_SCAN	0x0001	/* log scan in progress */
253 #define	LDL_ERROR	0x0002	/* in error state */
254 #define	LDL_NOROLL	0x0004  /* Log Not Yet Rollable */
255 
256 typedef struct sect_trailer {
257 	uint32_t	st_tid;		/* transaction id */
258 	uint32_t	st_ident;	/* unique sector id */
259 } sect_trailer_t;
260 
261 /*
262  * map block
263  */
264 #define	MAPBLOCKSIZE	(8192)
265 #define	MAPBLOCKSHIFT	(13)
266 #define	MAPBLOCKOFF	(MAPBLOCKSIZE-1)
267 #define	MAPBLOCKMASK	(~MAPBLOCKOFF)
268 #define	DEV_BMASK	(DEV_BSIZE - 1)
269 
270 /*
271  * cached roll buffer
272  */
273 typedef struct crb {
274 	int64_t		c_mof;		/* master file offset of buffer */
275 	caddr_t		c_buf;		/* pointer to cached roll buffer */
276 	uint32_t	c_nb;		/* size of buffer */
277 	ushort_t	c_refcnt;	/* reference count on crb */
278 	uchar_t		c_invalid;	/* crb should not be used */
279 } crb_t;
280 
281 #define	CRB_END ((crb_t *)1) /* must be non zero */
282 
283 /*
284  * delta header
285  */
286 struct delta {
287 	int64_t		d_mof;	/* byte offset on device to start writing */
288 				/*   delta */
289 	int32_t		d_nb;	/* # bytes in the delta */
290 	delta_t 	d_typ;	/* Type of delta.  Defined in ufs_trans.h */
291 };
292 /*
293  * common map entry
294  */
295 typedef struct mapentry	mapentry_t;
296 struct mapentry {
297 	/*
298 	 * doubly linked list of all mapentries in map -- MUST BE FIRST
299 	 */
300 	mapentry_t	*me_next;
301 	mapentry_t	*me_prev;
302 
303 	mapentry_t	*me_hash;
304 	mapentry_t	*me_agenext;
305 	mapentry_t	*me_cancel;
306 	crb_t		*me_crb;
307 	int		(*me_func)();
308 	ulong_t		me_arg;
309 	ulong_t		me_age;
310 	struct delta	me_delta;
311 	uint32_t	me_tid;
312 	off_t		me_lof;
313 	ushort_t	me_flags;
314 };
315 
316 #define	me_mof	me_delta.d_mof
317 #define	me_nb	me_delta.d_nb
318 #define	me_dt	me_delta.d_typ
319 
320 /*
321  * me_flags
322  */
323 #define	ME_SCAN		(0x0001)	/* entry from log scan */
324 #define	ME_HASH		(0x0002)	/* on hash   list */
325 #define	ME_CANCEL	(0x0004)	/* on cancel list */
326 #define	ME_AGE		(0x0008)	/* on age    list */
327 #define	ME_LIST		(0x0010)	/* on list   list */
328 #define	ME_ROLL		(0x0020)	/* on pseudo-roll list */
329 #define	ME_USER		(0x0040)	/* User Block DT_CANCEL entry */
330 
331 /*
332  * MAP TYPES
333  */
334 enum maptypes	{
335 	deltamaptype, logmaptype, matamaptype
336 };
337 
338 /*
339  * MAP
340  */
341 #define	DELTAMAP_NHASH	(512)
342 #define	LOGMAP_NHASH	(2048)
343 #define	MAP_INDEX(mof, mtm) \
344 	(((mof) >> MAPBLOCKSHIFT) & (mtm->mtm_nhash-1))
345 #define	MAP_HASH(mof, mtm) \
346 	((mtm)->mtm_hash + MAP_INDEX((mof), (mtm)))
347 
348 typedef struct mt_map {
349 	/*
350 	 * anchor doubly linked list this map's entries -- MUST BE FIRST
351 	 */
352 	mapentry_t	*mtm_next;
353 	mapentry_t	*mtm_prev;
354 
355 	enum maptypes	mtm_type;	/* map type */
356 	int		mtm_flags;	/* generic flags */
357 	int		mtm_ref;	/* PTE like ref bit */
358 	ulong_t		mtm_debug;	/* set at create time */
359 	ulong_t		mtm_age;	/* mono-inc; tags mapentries */
360 	mapentry_t	*mtm_cancel;	/* to be canceled at commit */
361 	ulong_t		mtm_nhash;	/* # of hash anchors */
362 	mapentry_t	**mtm_hash;	/* array of singly linked lists */
363 	struct topstats	*mtm_tops;	/* trans ops - enabled by an ioctl */
364 	long		mtm_nme;	/* # of mapentries */
365 	long		mtm_nmet;	/* # of mapentries this transaction */
366 	long		mtm_cfrags;	/* Canceled frags */
367 	long		mtm_cfragmax;	/* Maximum canceled frags */
368 	/*
369 	 * used after logscan to set the log's tail
370 	 */
371 	off_t		mtm_tail_lof;
372 	size_t		mtm_tail_nb;
373 
374 	/*
375 	 * debug field for Scan test
376 	 */
377 	off_t		mtm_trimlof;	/* log was trimmed to this lof */
378 	off_t		mtm_trimtail;	/* tail lof before trimming */
379 	off_t		mtm_trimalof;	/* lof of last allocation delta */
380 	off_t		mtm_trimclof;	/* lof of last commit delta */
381 	off_t		mtm_trimrlof;	/* lof of last rolled delta */
382 	ml_unit_t	*mtm_ul;	/* log unit for this map */
383 
384 	/*
385 	 * moby trans stuff
386 	 */
387 	uint32_t		mtm_tid;
388 	uint32_t		mtm_committid;
389 	ushort_t		mtm_closed;
390 	ushort_t		mtm_seq;
391 	long			mtm_wantin;
392 	long			mtm_active;
393 	long			mtm_activesync;
394 	ulong_t			mtm_dirty;
395 	kmutex_t		mtm_lock;
396 	kcondvar_t		mtm_cv_commit;
397 	kcondvar_t		mtm_cv_next;
398 	kcondvar_t		mtm_cv_eot;
399 
400 	/*
401 	 * mutex that protects all the fields in mt_map except
402 	 * mtm_mapnext and mtm_refcnt
403 	 */
404 	kmutex_t	mtm_mutex;
405 
406 	/*
407 	 * logmap only condition variables
408 	 */
409 	kcondvar_t	mtm_to_roll_cv; /* roll log or kill roll thread */
410 	kcondvar_t	mtm_from_roll_cv; /* log rolled or thread exiting */
411 
412 	/*
413 	 * rw lock for the agenext mapentry field
414 	 */
415 	krwlock_t	mtm_rwlock;
416 	/*
417 	 * DEBUG: runtestscan
418 	 */
419 	kmutex_t	mtm_scan_mutex;
420 
421 	/*
422 	 * logmap only taskq sync count variable, protected by mtm_lock.
423 	 * keeps track of the number of pending top_issue_sync
424 	 * dispatches.
425 	 */
426 	int		mtm_taskq_sync_count;
427 
428 	/*
429 	 * logmap only condition variable, to synchronize with lufs_unsnarf.
430 	 */
431 	kcondvar_t	mtm_cv;
432 } mt_map_t;
433 
434 /*
435  * mtm_flags
436  */
437 #define	MTM_ROLL_EXIT		0x00000001 /* force roll thread to exit */
438 #define	MTM_ROLL_RUNNING	0x00000002 /* roll thread is running */
439 #define	MTM_FORCE_ROLL		0x00000004 /* force at least one roll cycle */
440 #define	MTM_ROLLING		0x00000008 /* currently rolling the log */
441 #define	MTM_CANCELED		0x00000010 /* cancel entries were removed */
442 
443 /*
444  * Generic range checking macros
445  */
446 #define	OVERLAP(sof, snb, dof, dnb) \
447 	(((sof) >= (dof) && (sof) < ((dof) + (dnb))) || \
448 	((dof) >= (sof) && (dof) < ((sof) + (snb))))
449 #define	WITHIN(sof, snb, dof, dnb) \
450 	(((sof) >= (dof)) && (((sof) + (snb)) <= ((dof) + (dnb))))
451 #define	DATAoverlapME(mof, hnb, me) \
452 	(OVERLAP((mof), (hnb), (me)->me_mof, (me)->me_nb))
453 #define	MEwithinDATA(me, mof, hnb) \
454 	(WITHIN((me)->me_mof, (me)->me_nb, (mof), (hnb)))
455 #define	DATAwithinME(mof, hnb, me) \
456 	(WITHIN((mof), (hnb), (me)->me_mof, (me)->me_nb))
457 #define	DATAwithinCRB(mof, nb, crb) \
458 	(WITHIN((mof), (nb), (crb)->c_mof, (crb)->c_nb))
459 
460 /*
461  * TRANSACTION OPS STATS
462  */
463 typedef struct topstats {
464 	uint64_t	mtm_top_num[TOP_MAX];
465 	uint64_t	mtm_top_size_etot[TOP_MAX];
466 	uint64_t	mtm_top_size_rtot[TOP_MAX];
467 	uint64_t	mtm_top_size_max[TOP_MAX];
468 	uint64_t	mtm_top_size_min[TOP_MAX];
469 	uint64_t	mtm_delta_num[DT_MAX];
470 } topstats_t;
471 
472 /*
473  * fio_lufs_stats_t is used by _FIO_GET_TOP_STATS ioctl for getting topstats
474  */
475 typedef struct fio_lufs_stats {
476 	uint32_t	ls_debug;	/* out: un_debug value */
477 	uint32_t	_ls_pad;	/* make size 64-bit aligned on x86 */
478 	topstats_t	ls_topstats;	/* out: transaction stats */
479 } fio_lufs_stats_t;
480 
481 /*
482  * roll buf structure; one per roll buffer
483  */
484 typedef uint16_t rbsecmap_t;
485 typedef struct rollbuf {
486 	buf_t rb_bh;		/* roll buffer header */
487 	struct rollbuf *rb_next; /* link for mof ordered roll bufs */
488 	crb_t *rb_crb;		/* cached roll buffer to roll */
489 	mapentry_t *rb_age;	/* age list */
490 	rbsecmap_t rb_secmap;	/* sector map */
491 } rollbuf_t;
492 
493 /*
494  * un_debug
495  *	MT_TRANSACT		- keep per thread accounting of tranactions
496  *	MT_MATAMAP		- double check deltas and ops against matamap
497  *	MT_WRITE_CHECK		- check master+deltas against metadata write
498  *	MT_LOG_WRITE_CHECK	- read after write for log writes
499  *	MT_CHECK_MAP		- check map after every insert/delete
500  *	MT_TRACE		- trace transactions (used with MT_TRANSACT)
501  *	MT_SIZE			- fail on size errors (used with MT_TRANSACT)
502  *	MT_NOASYNC		- force every op to be sync
503  *	MT_FORCEROLL		- forcibly roll the log after every commit
504  *	MT_SCAN			- running runtestscan; special case as needed
505  */
506 #define	MT_NONE			(0x00000000)
507 #define	MT_TRANSACT		(0x00000001)
508 #define	MT_MATAMAP		(0x00000002)
509 #define	MT_WRITE_CHECK		(0x00000004)
510 #define	MT_LOG_WRITE_CHECK	(0x00000008)
511 #define	MT_CHECK_MAP		(0x00000010)
512 #define	MT_TRACE		(0x00000020)
513 #define	MT_SIZE			(0x00000040)
514 #define	MT_NOASYNC		(0x00000080)
515 #define	MT_FORCEROLL		(0x00000100)
516 #define	MT_SCAN			(0x00000200)
517 
518 struct logstats {
519 	kstat_named_t ls_lreads;	/* master reads */
520 	kstat_named_t ls_lwrites;	/* master writes */
521 	kstat_named_t ls_lreadsinmem;	/* log reads in memory */
522 	kstat_named_t ls_ldlreads;	/* log reads */
523 	kstat_named_t ls_ldlwrites;	/* log writes */
524 	kstat_named_t ls_mreads;	/* log master reads */
525 	kstat_named_t ls_rreads;	/* log roll reads */
526 	kstat_named_t ls_rwrites;	/* log roll writes */
527 };
528 
529 #ifdef _KERNEL
530 
531 typedef struct threadtrans {
532 	ulong_t		deltas_size;	/* size of deltas this transaction */
533 	uint32_t	last_async_tid;	/* last async transaction id */
534 	uchar_t		any_deltas;	/* any deltas done this transaction */
535 #ifdef DEBUG
536 	uint_t		topid;		/* transaction type */
537 	ulong_t		esize;		/* estimated trans size */
538 	ulong_t		rsize;		/* real trans size */
539 	dev_t		dev;		/* device */
540 #endif /* DEBUG */
541 } threadtrans_t;
542 
543 /*
544  * Log layer protos -- lufs_log.c
545  */
546 extern void		ldl_strategy(ml_unit_t *, buf_t *);
547 extern void		ldl_round_commit(ml_unit_t *);
548 extern void		ldl_push_commit(ml_unit_t *);
549 extern int		ldl_need_commit(ml_unit_t *);
550 extern int		ldl_has_space(ml_unit_t *, mapentry_t *);
551 extern void		ldl_write(ml_unit_t *, caddr_t, offset_t, mapentry_t *);
552 extern void		ldl_waito(ml_unit_t *);
553 extern int		ldl_read(ml_unit_t *, caddr_t, offset_t, off_t,
554 					mapentry_t *);
555 extern void		ldl_sethead(ml_unit_t *, off_t, uint32_t);
556 extern void		ldl_settail(ml_unit_t *, off_t, size_t);
557 extern ulong_t		ldl_logscan_nbcommit(off_t);
558 extern int		ldl_logscan_read(ml_unit_t *, off_t *, size_t, caddr_t);
559 extern void		ldl_logscan_begin(ml_unit_t *);
560 extern void		ldl_logscan_end(ml_unit_t *);
561 extern int		ldl_need_roll(ml_unit_t *);
562 extern void		ldl_seterror(ml_unit_t *, char *);
563 extern size_t		ldl_bufsize(ml_unit_t *);
564 extern void		ldl_savestate(ml_unit_t *);
565 extern void		free_cirbuf(cirbuf_t *);
566 extern void		alloc_rdbuf(cirbuf_t *, size_t, size_t);
567 extern void		alloc_wrbuf(cirbuf_t *, size_t);
568 
569 /*
570  * trans driver layer -- lufs.c
571  */
572 extern int		trans_not_wait(struct buf *cb);
573 extern int		trans_not_done(struct buf *cb);
574 extern int		trans_wait(struct buf *cb);
575 extern int		trans_done(struct buf *cb);
576 extern void		lufs_strategy(ml_unit_t *, buf_t *);
577 extern void		lufs_read_strategy(ml_unit_t *, buf_t *);
578 extern void		lufs_write_strategy(ml_unit_t *, buf_t *);
579 extern void		lufs_init(void);
580 extern int		lufs_enable(struct vnode *, struct fiolog *, cred_t *);
581 extern int		lufs_disable(vnode_t *, struct fiolog *);
582 
583 /*
584  * transaction op layer -- lufs_top.c
585  */
586 extern void	_init_top(void);
587 extern int	top_read_roll(rollbuf_t *, ml_unit_t *);
588 
589 
590 /*
591  * map layer -- lufs_map.c
592  */
593 extern void		map_free_entries(mt_map_t *);
594 extern int		matamap_overlap(mt_map_t *, offset_t, off_t);
595 extern int		matamap_within(mt_map_t *, offset_t, off_t);
596 extern int		deltamap_need_commit(mt_map_t *);
597 extern void		deltamap_add(mt_map_t *, offset_t, off_t, delta_t,
598 				int (*)(), ulong_t, threadtrans_t *tp);
599 extern mapentry_t	*deltamap_remove(mt_map_t *, offset_t, off_t);
600 extern void		deltamap_del(mt_map_t *, offset_t, off_t);
601 extern void		deltamap_push(ml_unit_t *);
602 extern void		logmap_cancel_remove(mt_map_t *);
603 extern int		logmap_need_commit(mt_map_t *);
604 extern int		logmap_need_roll_async(mt_map_t *);
605 extern int		logmap_need_roll_sync(mt_map_t *);
606 extern void		logmap_start_roll(ml_unit_t *);
607 extern void		logmap_kill_roll(ml_unit_t *);
608 extern void		logmap_forceroll(mt_map_t *);
609 extern void		logmap_forceroll_nowait(mt_map_t *);
610 extern int		logmap_overlap(mt_map_t *, offset_t, off_t);
611 extern void		logmap_remove_roll(mt_map_t *, offset_t, off_t);
612 extern int		logmap_next_roll(mt_map_t *, offset_t *);
613 extern int		logmap_list_get(mt_map_t *, offset_t, off_t,
614 				mapentry_t **);
615 extern int		logmap_list_get_roll(mt_map_t *, offset_t, rollbuf_t *);
616 extern void		logmap_list_put(mt_map_t *, mapentry_t *);
617 extern void		logmap_list_put_roll(mt_map_t *, mapentry_t *);
618 extern int		logmap_setup_read(mapentry_t *, rollbuf_t *);
619 extern void		logmap_make_space(struct mt_map *, ml_unit_t *,
620 				mapentry_t *);
621 extern void		logmap_add(ml_unit_t *, char *, offset_t, mapentry_t *);
622 extern void		logmap_add_buf(ml_unit_t *, char *, offset_t,
623 				mapentry_t *, caddr_t, uint32_t);
624 extern void		logmap_commit(ml_unit_t *, uint32_t);
625 extern void		logmap_sethead(mt_map_t *, ml_unit_t *);
626 extern void		logmap_settail(mt_map_t *, ml_unit_t *);
627 extern void		logmap_roll_dev(ml_unit_t *ul);
628 extern void		logmap_cancel(ml_unit_t *, offset_t, off_t, int);
629 extern void		logmap_free_cancel(mt_map_t *, mapentry_t **);
630 extern int		logmap_iscancel(mt_map_t *, offset_t, off_t);
631 extern void		logmap_logscan(ml_unit_t *);
632 extern mt_map_t		*map_put(mt_map_t *);
633 extern mt_map_t		*map_get(ml_unit_t *, enum maptypes, int);
634 extern void		_init_map(void);
635 
636 /*
637  * scan and roll threads -- lufs_thread.c
638  */
639 extern void	trans_roll(ml_unit_t *);
640 
641 /*
642  * DEBUG
643  */
644 #ifdef	DEBUG
645 extern int	map_put_debug(mt_map_t *);
646 extern int	map_get_debug(ml_unit_t *, mt_map_t *);
647 extern int	top_write_debug(ml_unit_t *, mapentry_t *, offset_t, off_t);
648 extern int	matamap_overlap(mt_map_t *, offset_t, off_t);
649 extern int	ldl_sethead_debug(ml_unit_t *);
650 extern int	map_check_linkage(mt_map_t *);
651 extern int	logmap_logscan_debug(mt_map_t *, mapentry_t *);
652 extern int	map_check_ldl_write(ml_unit_t *, caddr_t, offset_t,
653 								mapentry_t *);
654 extern int	logmap_logscan_commit_debug(off_t, mt_map_t *);
655 extern int	logmap_logscan_add_debug(struct delta *, mt_map_t *);
656 extern int	top_delta_debug(ml_unit_t *, offset_t, off_t, delta_t);
657 extern int	top_begin_debug(ml_unit_t *, top_t, ulong_t);
658 extern int	top_end_debug(ml_unit_t *, mt_map_t *, top_t, ulong_t);
659 extern int	top_roll_debug(ml_unit_t *);
660 extern int	top_init_debug(void);
661 extern int	lufs_initialize_debug(ml_odunit_t *);
662 #endif	/* DEBUG */
663 
664 extern uint64_t delta_stats[DT_MAX];
665 extern uint64_t roll_stats[DT_MAX];
666 extern struct logstats logstats;
667 extern int ufs_crb_enable;
668 
669 extern uint_t topkey;
670 extern uint32_t ufs_ncg_log;
671 
672 extern uint_t lufs_debug;
673 extern uint32_t	last_loghead_ident;
674 
675 #endif	/* _KERNEL */
676 
677 #ifdef	__cplusplus
678 }
679 #endif
680 
681 #endif	/* _SYS_FS_UFS_LOG_H */
682