xref: /titanic_50/usr/src/uts/common/sys/fs/ufs_lockfs.h (revision 303bf60b5a47ba25850d1ab07297f73962521dff)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
57c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate  * with the License.
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate  * and limitations under the License.
137c478bd9Sstevel@tonic-gate  *
147c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate  *
207c478bd9Sstevel@tonic-gate  * CDDL HEADER END
217c478bd9Sstevel@tonic-gate  */
227c478bd9Sstevel@tonic-gate /*
23bc69f433Saguzovsk  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24bc69f433Saguzovsk  * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate #ifndef _SYS_FS_UFS_LOCKFS_H
287c478bd9Sstevel@tonic-gate #define	_SYS_FS_UFS_LOCKFS_H
297c478bd9Sstevel@tonic-gate 
307c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
317c478bd9Sstevel@tonic-gate 
327c478bd9Sstevel@tonic-gate #include <sys/lockfs.h>
337c478bd9Sstevel@tonic-gate 
347c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
357c478bd9Sstevel@tonic-gate extern "C" {
367c478bd9Sstevel@tonic-gate #endif
377c478bd9Sstevel@tonic-gate 
387c478bd9Sstevel@tonic-gate /*
397c478bd9Sstevel@tonic-gate  * Sun ufs file system locking (lockfs)
407c478bd9Sstevel@tonic-gate  *
417c478bd9Sstevel@tonic-gate  * ufs file system supports the following lock types:
427c478bd9Sstevel@tonic-gate  * 	unlock		- releasing existing locks, or do a file system flush
437c478bd9Sstevel@tonic-gate  *	name lock	- no delete, no rename
447c478bd9Sstevel@tonic-gate  *	write lock	- no update to file system, including delete
457c478bd9Sstevel@tonic-gate  *	delete lock	- no delete, rename is allowed
467c478bd9Sstevel@tonic-gate  *	hard lock	- no update, no access, cannot be unlocked
477c478bd9Sstevel@tonic-gate  *			- for supporting forcible umount
487c478bd9Sstevel@tonic-gate  *	error lock	- no update, no access, may only be unlocked
497c478bd9Sstevel@tonic-gate  *			- once fs becomes clean, may be upgraded to
507c478bd9Sstevel@tonic-gate  *			- a hard lock
517c478bd9Sstevel@tonic-gate  *	error lock (read-only) -- not yet implemented --
527c478bd9Sstevel@tonic-gate  *			- no write changes allowed to fs, may be upgraded
537c478bd9Sstevel@tonic-gate  *			- to error or hard lock
547c478bd9Sstevel@tonic-gate  *			- degrades to panic on subsequent failures
557c478bd9Sstevel@tonic-gate  *
567c478bd9Sstevel@tonic-gate  * ufs_vnodeops(es) that conflict with the above file system lock types
577c478bd9Sstevel@tonic-gate  *	will get either suspended, or get a EAGAIN error,
587c478bd9Sstevel@tonic-gate  *	or get an EIO error if the file sytem is hard locked,
597c478bd9Sstevel@tonic-gate  *	or will block if the file system is error locked.
607c478bd9Sstevel@tonic-gate  *
617c478bd9Sstevel@tonic-gate  * There are exceptions.
627c478bd9Sstevel@tonic-gate  *	The following ufs_vnops do not obey the locking protocol:
637c478bd9Sstevel@tonic-gate  *	ufs_close, ufs_putpage, ufs_inactive, ufs_addmap, ufs_delmap,
647c478bd9Sstevel@tonic-gate  *	ufs_rwlock, ufs_rwunlock, ufs_poll.
657c478bd9Sstevel@tonic-gate  *
667c478bd9Sstevel@tonic-gate  * ul_vnops_cnt will get increment by 1 when a ufs vnodeops is entered;
677c478bd9Sstevel@tonic-gate  * it will be decremented by 1 when a ufs_vnodeops is exited.
687c478bd9Sstevel@tonic-gate  * A file system is in a quiescent state if ufs_vnops_cnt is zero.
69bc69f433Saguzovsk  * Since ufs_pageio() has to change ul_vnops_cnt without using ul_lock
70bc69f433Saguzovsk  * all users of ul_vnops_cnt increment and decrement it via atomic_add_long().
717c478bd9Sstevel@tonic-gate  */
727c478bd9Sstevel@tonic-gate 
737c478bd9Sstevel@tonic-gate #include <sys/fs/ufs_trans.h>
747c478bd9Sstevel@tonic-gate #include <sys/thread.h>
757c478bd9Sstevel@tonic-gate 
767c478bd9Sstevel@tonic-gate /*
777c478bd9Sstevel@tonic-gate  * ul_flag
787c478bd9Sstevel@tonic-gate  */
797c478bd9Sstevel@tonic-gate #define	ULOCKFS_BUSY	0x00000001	/* ul_fs_lock is being set */
807c478bd9Sstevel@tonic-gate #define	ULOCKFS_NOIACC	0x00000004	/* don't keep access times */
817c478bd9Sstevel@tonic-gate #define	ULOCKFS_NOIDEL	0x00000008	/* don't free deleted files */
82*303bf60bSsdebnath #define	ULOCKFS_FALLOC	0x00000010	/* fallocate threads exist */
837c478bd9Sstevel@tonic-gate 
847c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_BUSY(LF)	((LF)->ul_flag & ULOCKFS_BUSY)
857c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_NOIACC(LF)	((LF)->ul_flag & ULOCKFS_NOIACC)
867c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_NOIDEL(LF)	((LF)->ul_flag & ULOCKFS_NOIDEL)
87*303bf60bSsdebnath #define	ULOCKFS_IS_FALLOC(LF)	((LF)->ul_flag & ULOCKFS_FALLOC)
887c478bd9Sstevel@tonic-gate 
897c478bd9Sstevel@tonic-gate #define	ULOCKFS_CLR_BUSY(LF)	((LF)->ul_flag &= ~ULOCKFS_BUSY)
907c478bd9Sstevel@tonic-gate #define	ULOCKFS_SET_BUSY(LF)	((LF)->ul_flag |= ULOCKFS_BUSY)
917c478bd9Sstevel@tonic-gate 
92*303bf60bSsdebnath #define	ULOCKFS_CLR_FALLOC(LF)	((LF)->ul_flag &= ~ULOCKFS_FALLOC)
93*303bf60bSsdebnath #define	ULOCKFS_SET_FALLOC(LF)	((LF)->ul_flag |= ULOCKFS_FALLOC)
94*303bf60bSsdebnath 
957c478bd9Sstevel@tonic-gate /*
967c478bd9Sstevel@tonic-gate  * ul_fs_mod
977c478bd9Sstevel@tonic-gate  */
987c478bd9Sstevel@tonic-gate #define	ULOCKFS_SET_MOD(LF)	((LF)->ul_fs_mod = 1)
997c478bd9Sstevel@tonic-gate #define	ULOCKFS_CLR_MOD(LF)	((LF)->ul_fs_mod = 0)
1007c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_MOD(LF)	((LF)->ul_fs_mod)
1017c478bd9Sstevel@tonic-gate 
1027c478bd9Sstevel@tonic-gate /*
1037c478bd9Sstevel@tonic-gate  * ul_fs_lock
1047c478bd9Sstevel@tonic-gate  *
1057c478bd9Sstevel@tonic-gate  * softlock will temporarily block most ufs_vnodeops.
1067c478bd9Sstevel@tonic-gate  * it is used so that a waiting lockfs command will not be starved
107*303bf60bSsdebnath  *
108*303bf60bSsdebnath  * fwlock will block other fallocate threads wanting to obtain a write lock
109*303bf60bSsdebnath  * on the file system.
1107c478bd9Sstevel@tonic-gate  */
1117c478bd9Sstevel@tonic-gate #define	ULOCKFS_ULOCK	((1 << LOCKFS_ULOCK))	/* unlock */
1127c478bd9Sstevel@tonic-gate #define	ULOCKFS_WLOCK	((1 << LOCKFS_WLOCK))	/* write  lock */
1137c478bd9Sstevel@tonic-gate #define	ULOCKFS_NLOCK	((1 << LOCKFS_NLOCK))	/* name   lock */
1147c478bd9Sstevel@tonic-gate #define	ULOCKFS_DLOCK	((1 << LOCKFS_DLOCK))	/* delete lock */
1157c478bd9Sstevel@tonic-gate #define	ULOCKFS_HLOCK	((1 << LOCKFS_HLOCK))	/* hard   lock */
1167c478bd9Sstevel@tonic-gate #define	ULOCKFS_ELOCK	((1 << LOCKFS_ELOCK))	/* error  lock */
1177c478bd9Sstevel@tonic-gate #define	ULOCKFS_ROELOCK	((1 << LOCKFS_ROELOCK)) /* error lock (read-only) */
118*303bf60bSsdebnath /* Maximum number of LOCKFS lockfs defined in sys/lockfs.h are 6 */
119*303bf60bSsdebnath #define	ULOCKFS_FWLOCK	(1 << (LOCKFS_MAXLOCK + 1)) /* fallocate write lock */
1207c478bd9Sstevel@tonic-gate #define	ULOCKFS_SLOCK	0x80000000		/* soft   lock */
1217c478bd9Sstevel@tonic-gate 
1227c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_WLOCK(LF)	((LF)->ul_fs_lock & ULOCKFS_WLOCK)
1237c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_HLOCK(LF)	((LF)->ul_fs_lock & ULOCKFS_HLOCK)
1247c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_ELOCK(LF)	((LF)->ul_fs_lock & ULOCKFS_ELOCK)
1257c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_ROELOCK(LF)	((LF)->ul_fs_lock & ULOCKFS_ROELOCK)
1267c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_ULOCK(LF)	((LF)->ul_fs_lock & ULOCKFS_ULOCK)
1277c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_NLOCK(LF)	((LF)->ul_fs_lock & ULOCKFS_NLOCK)
1287c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_DLOCK(LF)	((LF)->ul_fs_lock & ULOCKFS_DLOCK)
1297c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_SLOCK(LF)	((LF)->ul_fs_lock & ULOCKFS_SLOCK)
130*303bf60bSsdebnath #define	ULOCKFS_IS_FWLOCK(LF)	((LF)->ul_fs_lock & ULOCKFS_FWLOCK)
1317c478bd9Sstevel@tonic-gate #define	ULOCKFS_IS_JUSTULOCK(LF) \
1327c478bd9Sstevel@tonic-gate 	(((LF)->ul_fs_lock & (ULOCKFS_SLOCK | ULOCKFS_ULOCK)) == ULOCKFS_ULOCK)
1337c478bd9Sstevel@tonic-gate 
1347c478bd9Sstevel@tonic-gate #define	ULOCKFS_SET_SLOCK(LF)	((LF)->ul_fs_lock |= ULOCKFS_SLOCK)
1357c478bd9Sstevel@tonic-gate #define	ULOCKFS_CLR_SLOCK(LF)	((LF)->ul_fs_lock &= ~ULOCKFS_SLOCK)
1367c478bd9Sstevel@tonic-gate 
137*303bf60bSsdebnath #define	ULOCKFS_SET_FWLOCK(LF)	((LF)->ul_fs_lock |= ULOCKFS_FWLOCK)
138*303bf60bSsdebnath #define	ULOCKFS_CLR_FWLOCK(LF)	((LF)->ul_fs_lock &= ~ULOCKFS_FWLOCK)
139*303bf60bSsdebnath 
1407c478bd9Sstevel@tonic-gate #define	ULOCKFS_READ_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1417c478bd9Sstevel@tonic-gate #define	ULOCKFS_WRITE_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1427c478bd9Sstevel@tonic-gate 			ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
1437c478bd9Sstevel@tonic-gate /* used by both ufs_getattr and ufs_getsecattr */
1447c478bd9Sstevel@tonic-gate #define	ULOCKFS_GETATTR_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1457c478bd9Sstevel@tonic-gate /* used by both ufs_setattr and ufs_setsecattr */
1467c478bd9Sstevel@tonic-gate #define	ULOCKFS_SETATTR_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1477c478bd9Sstevel@tonic-gate 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
1487c478bd9Sstevel@tonic-gate #define	ULOCKFS_ACCESS_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1497c478bd9Sstevel@tonic-gate #define	ULOCKFS_LOOKUP_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1507c478bd9Sstevel@tonic-gate #define	ULOCKFS_CREATE_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1517c478bd9Sstevel@tonic-gate 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
1527c478bd9Sstevel@tonic-gate #define	ULOCKFS_REMOVE_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1537c478bd9Sstevel@tonic-gate 			ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK | \
1547c478bd9Sstevel@tonic-gate 					ULOCKFS_NLOCK | ULOCKFS_DLOCK)
1557c478bd9Sstevel@tonic-gate #define	ULOCKFS_LINK_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1567c478bd9Sstevel@tonic-gate 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
1577c478bd9Sstevel@tonic-gate #define	ULOCKFS_RENAME_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1587c478bd9Sstevel@tonic-gate 					ULOCKFS_SLOCK | ULOCKFS_WLOCK | \
1597c478bd9Sstevel@tonic-gate 					ULOCKFS_ROELOCK | ULOCKFS_NLOCK)
1607c478bd9Sstevel@tonic-gate #define	ULOCKFS_MKDIR_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1617c478bd9Sstevel@tonic-gate 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
1627c478bd9Sstevel@tonic-gate #define	ULOCKFS_RMDIR_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1637c478bd9Sstevel@tonic-gate 			ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK | \
1647c478bd9Sstevel@tonic-gate 					ULOCKFS_NLOCK | ULOCKFS_DLOCK)
1657c478bd9Sstevel@tonic-gate #define	ULOCKFS_READDIR_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1667c478bd9Sstevel@tonic-gate #define	ULOCKFS_SYMLINK_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1677c478bd9Sstevel@tonic-gate 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
1687c478bd9Sstevel@tonic-gate #define	ULOCKFS_READLINK_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1697c478bd9Sstevel@tonic-gate #define	ULOCKFS_FSYNC_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1707c478bd9Sstevel@tonic-gate #define	ULOCKFS_FID_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1717c478bd9Sstevel@tonic-gate #define	ULOCKFS_RWLOCK_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1727c478bd9Sstevel@tonic-gate #define	ULOCKFS_RWUNLOCK_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1737c478bd9Sstevel@tonic-gate #define	ULOCKFS_SEEK_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1747c478bd9Sstevel@tonic-gate #define	ULOCKFS_FRLOCK_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1757c478bd9Sstevel@tonic-gate #define	ULOCKFS_SPACE_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1767c478bd9Sstevel@tonic-gate 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
177*303bf60bSsdebnath #define	ULOCKFS_FALLOCATE_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
178*303bf60bSsdebnath 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | \
179*303bf60bSsdebnath 				ULOCKFS_WLOCK | ULOCKFS_FWLOCK)
1807c478bd9Sstevel@tonic-gate #define	ULOCKFS_QUOTA_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1817c478bd9Sstevel@tonic-gate 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
1827c478bd9Sstevel@tonic-gate /* GETPAGE breaks up into two masks */
1837c478bd9Sstevel@tonic-gate #define	ULOCKFS_GETREAD_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1847c478bd9Sstevel@tonic-gate #define	ULOCKFS_GETWRITE_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1857c478bd9Sstevel@tonic-gate 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
1867c478bd9Sstevel@tonic-gate #define	ULOCKFS_MAP_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1877c478bd9Sstevel@tonic-gate #define	ULOCKFS_FIODUTIMES_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1887c478bd9Sstevel@tonic-gate 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
1897c478bd9Sstevel@tonic-gate #define	ULOCKFS_FIODIO_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1907c478bd9Sstevel@tonic-gate 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
1917c478bd9Sstevel@tonic-gate #define	ULOCKFS_FIODIOS_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1927c478bd9Sstevel@tonic-gate #define	ULOCKFS_PATHCONF_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1937c478bd9Sstevel@tonic-gate 
1947c478bd9Sstevel@tonic-gate #define	ULOCKFS_VGET_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | ULOCKFS_SLOCK)
1957c478bd9Sstevel@tonic-gate #define	ULOCKFS_DELETE_MASK	(ULOCKFS_HLOCK | ULOCKFS_ELOCK | \
1967c478bd9Sstevel@tonic-gate 				ULOCKFS_ROELOCK | ULOCKFS_SLOCK | ULOCKFS_WLOCK)
1977c478bd9Sstevel@tonic-gate 
1987c478bd9Sstevel@tonic-gate struct ulockfs {
1997c478bd9Sstevel@tonic-gate 	ulong_t		ul_flag;	/* flags */
2007c478bd9Sstevel@tonic-gate 	ulong_t		ul_fs_lock;	/* current file system lock state */
2017c478bd9Sstevel@tonic-gate 	ulong_t		ul_fs_mod;	/* for test; fs was modified */
2027c478bd9Sstevel@tonic-gate 	ulong_t		ul_vnops_cnt;	/* # of active ufs vnops outstanding */
2037c478bd9Sstevel@tonic-gate 	kmutex_t	ul_lock;	/* mutex to protect ulockfs structure */
2047c478bd9Sstevel@tonic-gate 	kcondvar_t 	ul_cv;
2057c478bd9Sstevel@tonic-gate 	kthread_id_t	ul_sbowner;	/* thread than can write superblock */
2067c478bd9Sstevel@tonic-gate 	struct lockfs	ul_lockfs;	/* ioctl lock struct */
207*303bf60bSsdebnath 	ulong_t		ul_falloc_cnt;	/* # of on-going fallocate ops */
2087c478bd9Sstevel@tonic-gate };
2097c478bd9Sstevel@tonic-gate 
210bc69f433Saguzovsk extern ulong_t ufs_quiesce_pend;
211bc69f433Saguzovsk 
2127c478bd9Sstevel@tonic-gate #define	VTOUL(VP) \
2137c478bd9Sstevel@tonic-gate 	((struct ulockfs *) \
2147c478bd9Sstevel@tonic-gate 	&((struct ufsvfs *)((VP)->v_vfsp->vfs_data))->vfs_ulockfs)
2157c478bd9Sstevel@tonic-gate #define	ITOUL(IP)	((struct ulockfs *)&((IP)->i_ufsvfs->vfs_ulockfs))
2167c478bd9Sstevel@tonic-gate 
2177c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
2187c478bd9Sstevel@tonic-gate }
2197c478bd9Sstevel@tonic-gate #endif
2207c478bd9Sstevel@tonic-gate 
2217c478bd9Sstevel@tonic-gate #endif	/* _SYS_FS_UFS_LOCKFS_H */
222