bc434254ea
When search for free slot always cache position of last allocated slot, so next time when need to allocate new slot, we can search from that position.
65 lines
2.5 KiB
C
65 lines
2.5 KiB
C
#ifndef __MFS_INODE_H__
|
|
#define __MFS_INODE_H__
|
|
|
|
/* Inode table. This table holds inodes that are currently in use. In some
|
|
* cases they have been opened by an open() or creat() system call, in other
|
|
* cases the file system itself needs the inode for one reason or another,
|
|
* such as to search a directory for a path name.
|
|
* The first part of the struct holds fields that are present on the
|
|
* disk; the second part holds fields not present on the disk.
|
|
* The disk inode part is also declared in "type.h" as 'd1_inode' for V1
|
|
* file systems and 'd2_inode' for V2 file systems.
|
|
*
|
|
* Updates:
|
|
* 2007-01-06: jfdsmit@gmail.com added i_zsearch
|
|
*/
|
|
|
|
#include <sys/queue.h>
|
|
|
|
EXTERN struct inode {
|
|
mode_t i_mode; /* file type, protection, etc. */
|
|
nlink_t i_nlinks; /* how many links to this file */
|
|
uid_t i_uid; /* user id of the file's owner */
|
|
gid_t i_gid; /* group number */
|
|
off_t i_size; /* current file size in bytes */
|
|
time_t i_atime; /* time of last access (V2 only) */
|
|
time_t i_mtime; /* when was file data last changed */
|
|
time_t i_ctime; /* when was inode itself changed (V2 only)*/
|
|
zone_t i_zone[V2_NR_TZONES]; /* zone numbers for direct, ind, and dbl ind */
|
|
|
|
/* The following items are not present on the disk. */
|
|
dev_t i_dev; /* which device is the inode on */
|
|
ino_t i_num; /* inode number on its (minor) device */
|
|
int i_count; /* # times inode used; 0 means slot is free */
|
|
unsigned int i_ndzones; /* # direct zones (Vx_NR_DZONES) */
|
|
unsigned int i_nindirs; /* # indirect zones per indirect block */
|
|
struct super_block *i_sp; /* pointer to super block for inode's device */
|
|
char i_dirt; /* CLEAN or DIRTY */
|
|
zone_t i_zsearch; /* where to start search for new zones */
|
|
off_t i_last_dpos; /* where to start dentry search */
|
|
|
|
char i_mountpoint; /* true if mounted on */
|
|
|
|
char i_seek; /* set on LSEEK, cleared on READ/WRITE */
|
|
char i_update; /* the ATIME, CTIME, and MTIME bits are here */
|
|
|
|
LIST_ENTRY(inode) i_hash; /* hash list */
|
|
TAILQ_ENTRY(inode) i_unused; /* free and unused list */
|
|
|
|
} inode[NR_INODES];
|
|
|
|
/* list of unused/free inodes */
|
|
EXTERN TAILQ_HEAD(unused_inodes_t, inode) unused_inodes;
|
|
|
|
/* inode hashtable */
|
|
EXTERN LIST_HEAD(inodelist, inode) hash_inodes[INODE_HASH_SIZE];
|
|
|
|
EXTERN unsigned int inode_cache_hit;
|
|
EXTERN unsigned int inode_cache_miss;
|
|
|
|
|
|
/* Field values. Note that CLEAN and DIRTY are defined in "const.h" */
|
|
#define NO_SEEK 0 /* i_seek = NO_SEEK if last op was not SEEK */
|
|
#define ISEEK 1 /* i_seek = ISEEK if last op was SEEK */
|
|
|
|
#endif
|