Files
Arquivotheca.Solaris-2.5/uts/common/sys/fs/tmpnode.h
seta75D 7c4988eac0 Init
2021-10-11 19:38:01 -03:00

149 lines
4.5 KiB
C
Executable File

/*
* Copyright (c) 1989, 1990, 1991 by Sun Microsystems, Inc.
*/
#ifndef _SYS_FS_TMPNODE_H
#define _SYS_FS_TMPNODE_H
#pragma ident "@(#)tmpnode.h 1.15 94/11/16 SMI"
/* tmpnode.h 1.8 89/10/10 SMI */
#include <sys/t_lock.h>
#include <vm/seg.h>
#include <vm/seg_vn.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* tmpnode is the file system dependent node for tmpfs.
*
* tn_rwlock protects access of the directory list at tn_dir
* as well as syncronizing read and writes to the tmpnode
*
* tn_contents protects growing, shrinking, reading and writing
* the file along with tn_rwlock (see below).
*
* tn_tlock protects updates to
* tn_[amc]time, tn_flags and tn_nlink
*
* tm_contents in the tmount filesystem data structure protects
* tn_forw and tn_back which are used to maintain a linked
* list of all tmpfs files associated with that file system
*
* The anon array represents the secondary store for tmpfs.
* To grow or shrink the file or fill in holes requires
* manipulation of the anon array. These operations are protected
* by a combination of tn_rwlock and tn_contents. Growing or shrinking
* the array requires the write lock on tn_rwlock and tn_contents.
* Filling in a slot in the array requires the write lock on tn_contents.
* Reading the array requires the read lock on tn_contents.
*
* The ordering of the locking is:
* tn_rwlock -> tn_contents -> page locks on pages in file
*
* tn_tlock doesn't require any tmpnode locks
*/
struct tmpnode {
u_int tn_flags; /* see T flags below */
struct tmpnode *tn_back; /* linked list of tmpnodes */
struct tmpnode *tn_forw; /* linked list of tmpnodes */
union {
struct tdirent *un_dir; /* pointer to directory list */
char *un_symlink; /* pointer to symlink */
struct {
struct anon **un_anon; /* anon backing for file */
u_int un_size; /* size repres. by array */
} un_anonstruct;
} un_tmpnode;
struct vnode tn_vnode; /* vnode for this tmpnode */
struct vattr tn_attr; /* attributes */
long tn_gen; /* pseudo gen number for tfid */
krwlock_t tn_contents; /* vm side -serialize mods */
krwlock_t tn_rwlock; /* rw,trunc size - serialize */
/* mods and directory updates */
kmutex_t tn_tlock; /* time, flag, and nlink lock */
};
#define tn_dir un_tmpnode.un_dir
#define tn_symlink un_tmpnode.un_symlink
#define tn_anon un_tmpnode.un_anonstruct.un_anon
#define tn_asize un_tmpnode.un_anonstruct.un_size
/*
* Attributes
*/
#define tn_mask tn_attr.va_mask
#define tn_type tn_attr.va_type
#define tn_mode tn_attr.va_mode
#define tn_uid tn_attr.va_uid
#define tn_gid tn_attr.va_gid
#define tn_fsid tn_attr.va_fsid
#define tn_nodeid tn_attr.va_nodeid
#define tn_nlink tn_attr.va_nlink
#define tn_size tn_attr.va_size
#define tn_atime tn_attr.va_atime
#define tn_mtime tn_attr.va_mtime
#define tn_ctime tn_attr.va_ctime
#define tn_rdev tn_attr.va_rdev
#define tn_blksize tn_attr.va_blksize
#define tn_nblocks tn_attr.va_nblocks
#define tn_vcode tn_attr.va_vcode
/*
* tn_flags
*/
#define TREF 0x001 /* tmpnode referenced */
#define TUPD 0x002 /* file accessed */
#define TACC 0x004 /* file modified */
#define TCHG 0x008 /* file changed */
#define TMAP 0x010 /* file was mapped beyond EOF */
#define TFREE 0x020 /* tmpnode freed, but still has HELD */
#define tmp_accessed(t) tmp_timestamp((t), (((t)->tn_flags)|TACC))
#define tmp_modified(t) tmp_timestamp((t), (((t)->tn_flags)|TACC|TUPD))
#define tmp_created(t) tmp_timestamp((t), (((t)->tn_flags)|TACC|TUPD|TCHG))
/*
* tmpfs directories are made up of a linked list of tdirent structures
* hanging off directory tmpnodes. File names are not fixed length,
* but are null terminated.
*/
struct tdirent {
struct tmpnode *td_tmpnode; /* tnode for this file */
struct tdirent *td_next; /* next directory entry */
struct tdirent *td_prev; /* prev directory entry */
u_int td_offset; /* "offset" of dir entry */
u_int td_hash; /* a hash of td_name */
struct tdirent *td_link; /* linked via the hash table */
struct tmpnode *td_parent; /* parent, dir we are in */
char *td_name; /* must be null terminated */
/* max length is MAXNAMELEN */
};
/*
* tfid overlays the fid structure (for VFS_VGET)
*/
struct tfid {
u_short tfid_len;
ino_t tfid_ino;
long tfid_gen;
};
#define ESAME (-1) /* trying to rename linked files (special) */
extern int tmp_files;
extern struct vnodeops tmp_vnodeops;
extern int tmpfsinit();
extern int tmpfsfstype;
extern dev_t tmpdev;
#ifdef __cplusplus
}
#endif
#endif /* _SYS_FS_TMPNODE_H */