Init
This commit is contained in:
68
sys/tfs/tnode.h
Normal file
68
sys/tfs/tnode.h
Normal file
@@ -0,0 +1,68 @@
|
||||
/* @(#)tnode.h 1.1 92/07/30 SMI */
|
||||
|
||||
#ifndef __TNODE_HEADER__
|
||||
#define __TNODE_HEADER__
|
||||
|
||||
/*
|
||||
* Private information per vnode for TFS vnodes.
|
||||
* t_realvp is held until the TFS vnode is released (or until the real
|
||||
* vnode changes.)
|
||||
*/
|
||||
struct tnode {
|
||||
struct tnode *t_next; /* link for hash chain */
|
||||
struct vnode t_vnode;
|
||||
fhandle_t t_fh; /* tfsd's file handle */
|
||||
u_long t_nodeid; /* nodeid of file */
|
||||
u_int t_writeable : 1; /* is the file writeable? */
|
||||
u_int t_eof : 1; /* eof reached on directory? */
|
||||
u_int t_locked : 1; /* is locked? */
|
||||
u_int t_wanted : 1; /* someone wants a wakeup */
|
||||
long t_size; /* size of directory */
|
||||
struct tnode_unl *t_unlinkp; /* data for unlinked file */
|
||||
struct timeval t_ctime; /* ctime of dir or readonly file */
|
||||
struct nfssattr t_sattrs; /* attrs to be changed */
|
||||
struct vnode *t_realvp; /* vnode of real file */
|
||||
};
|
||||
|
||||
#define TTOV(tp) (&((tp)->t_vnode))
|
||||
#define VTOT(vp) ((struct tnode *)((vp)->v_data))
|
||||
#define REALVP(vp) (VTOT(vp)->t_realvp)
|
||||
|
||||
/*
|
||||
* Data to handle unlinking open files. (If the real vnode of a TFS vnode
|
||||
* is an NFS vnode, and the tfsd is not on the local machine, then a
|
||||
* TFS_REMOVE call to the tfsd will cause the file to be removed on the
|
||||
* remote machine, and our local NFS vnode will become stale. So
|
||||
* tfs_remove has to behave like nfs_remove and rename the file to a tmp
|
||||
* name.)
|
||||
*/
|
||||
struct tnode_unl {
|
||||
struct ucred *tu_cred; /* unlinked credentials */
|
||||
char *tu_name; /* unlinked file name */
|
||||
struct vnode *tu_dvp; /* parent dir of unlinked file */
|
||||
};
|
||||
|
||||
/*
|
||||
* Lock and unlock tnodes. We need to put locks around the routines which
|
||||
* translate TFS vnodes to real vnodes, because a process doing a TFS
|
||||
* translation can sleep in either the rfscall to the tfsd or in the
|
||||
* lookupname of the real vnode.
|
||||
*/
|
||||
#define TLOCK(tp) { \
|
||||
while ((tp)->t_locked) { \
|
||||
(tp)->t_wanted = TRUE; \
|
||||
tnode_sleeps++; \
|
||||
(void) sleep((caddr_t)(tp), PINOD); \
|
||||
} \
|
||||
(tp)->t_locked = TRUE; \
|
||||
}
|
||||
|
||||
#define TUNLOCK(tp) { \
|
||||
(tp)->t_locked = FALSE; \
|
||||
if ((tp)->t_wanted) { \
|
||||
(tp)->t_wanted = FALSE; \
|
||||
wakeup((caddr_t)(tp)); \
|
||||
} \
|
||||
}
|
||||
|
||||
#endif !__TNODE_HEADER__
|
||||
Reference in New Issue
Block a user