📄 fs.h
字号:
int gfp_mask; /* how to allocate the pages */};struct char_device { struct list_head hash; atomic_t count; dev_t dev; atomic_t openers; struct semaphore sem;};struct block_device { struct list_head bd_hash; atomic_t bd_count; struct inode * bd_inode; dev_t bd_dev; /* not a kdev_t - it's a search key */ int bd_openers; const struct block_device_operations *bd_op; struct semaphore bd_sem; /* open/close mutex */ struct list_head bd_inodes;};struct inode { struct list_head i_hash; struct list_head i_list; struct list_head i_dentry; struct list_head i_dirty_buffers; struct list_head i_dirty_data_buffers; unsigned long i_ino; atomic_t i_count; kdev_t i_dev; umode_t i_mode; nlink_t i_nlink; uid_t i_uid; gid_t i_gid; kdev_t i_rdev; loff_t i_size; time_t i_atime; time_t i_mtime; time_t i_ctime; unsigned int i_blkbits; unsigned long i_blksize; unsigned long i_blocks; unsigned long i_version; unsigned short i_bytes; struct semaphore i_sem; struct semaphore i_zombie; struct inode_operations *i_op; struct file_operations *i_fop; /* former ->i_op->default_file_ops */ struct super_block *i_sb; wait_queue_head_t i_wait; struct file_lock *i_flock; struct address_space *i_mapping; struct address_space i_data; struct dquot *i_dquot[MAXQUOTAS]; /* These three should probably be a union */ struct list_head i_devices; struct pipe_inode_info *i_pipe; struct block_device *i_bdev; struct char_device *i_cdev; unsigned long i_dnotify_mask; /* Directory notify events */ struct dnotify_struct *i_dnotify; /* for directory notifications */ unsigned long i_state; unsigned int i_flags; unsigned char i_sock; atomic_t i_writecount; unsigned int i_attr_flags; __u32 i_generation; union { struct minix_inode_info minix_i; struct ext2_inode_info ext2_i; struct ext3_inode_info ext3_i; struct hpfs_inode_info hpfs_i; struct ntfs_inode_info ntfs_i; struct msdos_inode_info msdos_i; struct umsdos_inode_info umsdos_i; struct iso_inode_info isofs_i; struct nfs_inode_info nfs_i; struct sysv_inode_info sysv_i; struct affs_inode_info affs_i; struct ufs_inode_info ufs_i; struct efs_inode_info efs_i; struct romfs_inode_info romfs_i; struct shmem_inode_info shmem_i; struct coda_inode_info coda_i; struct smb_inode_info smbfs_i; struct hfs_inode_info hfs_i; struct adfs_inode_info adfs_i; struct qnx4_inode_info qnx4_i; struct reiserfs_inode_info reiserfs_i; struct bfs_inode_info bfs_i; struct udf_inode_info udf_i; struct ncp_inode_info ncpfs_i; struct proc_inode_info proc_i; struct socket socket_i; struct usbdev_inode_info usbdev_i; struct jffs2_inode_info jffs2_i; struct squashfs_inode_info squashfs_i; struct pram_inode_info pram_i; struct xfs_inode_info xfs_i; void *generic_ip; } u;};static inline void inode_add_bytes(struct inode *inode, loff_t bytes){ inode->i_blocks += bytes >> 9; bytes &= 511; inode->i_bytes += bytes; if (inode->i_bytes >= 512) { inode->i_blocks++; inode->i_bytes -= 512; }}static inline void inode_sub_bytes(struct inode *inode, loff_t bytes){ inode->i_blocks -= bytes >> 9; bytes &= 511; if (inode->i_bytes < bytes) { inode->i_blocks--; inode->i_bytes += 512; } inode->i_bytes -= bytes;}static inline loff_t inode_get_bytes(struct inode *inode){ return (((loff_t)inode->i_blocks) << 9) + inode->i_bytes;}static inline void inode_set_bytes(struct inode *inode, loff_t bytes){ inode->i_blocks = bytes >> 9; inode->i_bytes = bytes & 511;}struct fown_struct { int pid; /* pid or -pgrp where SIGIO should be sent */ uid_t uid, euid; /* uid/euid of process setting the owner */ int signum; /* posix.1b rt signal to be delivered on IO */};struct file { struct list_head f_list; struct dentry *f_dentry; struct vfsmount *f_vfsmnt; struct file_operations *f_op; atomic_t f_count; unsigned int f_flags; mode_t f_mode; loff_t f_pos; unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; struct fown_struct f_owner; unsigned int f_uid, f_gid; int f_error; unsigned long f_version; /* needed for tty driver, and maybe others */ void *private_data; /* preallocated helper kiobuf to speedup O_DIRECT */ struct kiobuf *f_iobuf; long f_iobuf_lock;};extern spinlock_t files_lock;#define file_list_lock() spin_lock(&files_lock);#define file_list_unlock() spin_unlock(&files_lock);#define get_file(x) atomic_inc(&(x)->f_count)#define file_count(x) atomic_read(&(x)->f_count)extern int init_private_file(struct file *, struct dentry *, int);#define MAX_NON_LFS ((1UL<<31) - 1)/* Page cache limit. The filesystems should put that into their s_maxbytes limits, otherwise bad things can happen in VM. */ #if BITS_PER_LONG==32#define MAX_LFS_FILESIZE (((u64)PAGE_CACHE_SIZE << (BITS_PER_LONG-1))-1) #elif BITS_PER_LONG==64#define MAX_LFS_FILESIZE 0x7fffffffffffffff#endif#define FL_POSIX 1#define FL_FLOCK 2#define FL_BROKEN 4 /* broken flock() emulation */#define FL_ACCESS 8 /* for processes suspended by mandatory locking */#define FL_LOCKD 16 /* lock held by rpc.lockd */#define FL_LEASE 32 /* lease held on this file *//* * The POSIX file lock owner is determined by * the "struct files_struct" in the thread group * (or NULL for no owner - BSD locks). * * Lockd stuffs a "host" pointer into this. */typedef struct files_struct *fl_owner_t;struct file_lock { struct file_lock *fl_next; /* singly linked list for this inode */ struct list_head fl_link; /* doubly linked list of all locks */ struct list_head fl_block; /* circular list of blocked processes */ fl_owner_t fl_owner; unsigned int fl_pid; wait_queue_head_t fl_wait; struct file *fl_file; unsigned char fl_flags; unsigned char fl_type; loff_t fl_start; loff_t fl_end; void (*fl_notify)(struct file_lock *); /* unblock callback */ void (*fl_insert)(struct file_lock *); /* lock insertion callback */ void (*fl_remove)(struct file_lock *); /* lock removal callback */ struct fasync_struct * fl_fasync; /* for lease break notifications */ unsigned long fl_break_time; /* for nonblocking lease breaks */ union { struct nfs_lock_info nfs_fl; } fl_u;};/* The following constant reflects the upper bound of the file/locking space */#ifndef OFFSET_MAX#define INT_LIMIT(x) (~((x)1 << (sizeof(x)*8 - 1)))#define OFFSET_MAX INT_LIMIT(loff_t)#define OFFT_OFFSET_MAX INT_LIMIT(off_t)#endifextern struct list_head file_lock_list;#include <linux/fcntl.h>extern int fcntl_getlk(unsigned int, struct flock *);extern int fcntl_setlk(unsigned int, unsigned int, struct flock *);extern int fcntl_getlk64(unsigned int, struct flock64 *);extern int fcntl_setlk64(unsigned int, unsigned int, struct flock64 *);/* fs/locks.c */extern void locks_init_lock(struct file_lock *);extern void locks_copy_lock(struct file_lock *, struct file_lock *);extern void locks_remove_posix(struct file *, fl_owner_t);extern void locks_remove_flock(struct file *);extern struct file_lock *posix_test_lock(struct file *, struct file_lock *);extern int posix_lock_file(struct file *, struct file_lock *, unsigned int);extern void posix_block_lock(struct file_lock *, struct file_lock *);extern void posix_unblock_lock(struct file_lock *);extern int posix_locks_deadlock(struct file_lock *, struct file_lock *);extern int __get_lease(struct inode *inode, unsigned int flags);extern time_t lease_get_mtime(struct inode *);extern int lock_may_read(struct inode *, loff_t start, unsigned long count);extern int lock_may_write(struct inode *, loff_t start, unsigned long count);struct fasync_struct { int magic; int fa_fd; struct fasync_struct *fa_next; /* singly linked list */ struct file *fa_file;};#define FASYNC_MAGIC 0x4601/* SMP safe fasync helpers: */extern int fasync_helper(int, struct file *, int, struct fasync_struct **);/* can be called from interrupts */extern void kill_fasync(struct fasync_struct **, int, int);/* only for net: no internal synchronization */extern void __kill_fasync(struct fasync_struct *, int, int);struct nameidata { struct dentry *dentry; struct vfsmount *mnt; struct qstr last; unsigned int flags; int last_type;};#define DQUOT_USR_ENABLED 0x01 /* User diskquotas enabled */#define DQUOT_GRP_ENABLED 0x02 /* Group diskquotas enabled */struct quota_info{ unsigned int flags; /* Flags for diskquotas on this device */ struct semaphore dqio_sem; /* lock device while I/O in progress */ struct semaphore dqoff_sem; /* serialize quota_off() and quota_on() on device */ struct file *files[MAXQUOTAS]; /* fp's to quotafiles */ struct mem_dqinfo info[MAXQUOTAS]; /* Information for each quota type */};struct quota_operations { int (*quotaon)(struct super_block *, short, char *); int (*quotaoff)(struct super_block *, short); int (*quotasync)(struct super_block *, short); int (*getinfo)(struct super_block *, short, struct mem_dqinfo *); int (*setinfo)(struct super_block *, short, struct mem_dqinfo *, int); int (*getdqblk)(struct super_block *, short, qid_t, struct mem_dqblk *); int (*setdqblk)(struct super_block *, short, qid_t, struct mem_dqblk *, int); int (*getxstate)(struct super_block *, struct fs_quota_stat *); int (*setxstate)(struct super_block *, unsigned int, int); int (*getxquota)(struct super_block *, short, qid_t, struct fs_disk_quota *); int (*setxquota)(struct super_block *, short, qid_t, struct fs_disk_quota *);};/* * Umount options */#define MNT_FORCE 0x00000001 /* Attempt to forcibily umount */#define MNT_DETACH 0x00000002 /* Just detach from the tree */#include <linux/minix_fs_sb.h>#include <linux/ext2_fs_sb.h>#include <linux/ext3_fs_sb.h>#include <linux/hpfs_fs_sb.h>#include <linux/ntfs_fs_sb.h>#include <linux/msdos_fs_sb.h>#include <linux/iso_fs_sb.h>#include <linux/nfs_fs_sb.h>#include <linux/sysv_fs_sb.h>#include <linux/affs_fs_sb.h>#include <linux/ufs_fs_sb.h>#include <linux/efs_fs_sb.h>#include <linux/romfs_fs_sb.h>#include <linux/smb_fs_sb.h>#include <linux/hfs_fs_sb.h>#include <linux/adfs_fs_sb.h>#include <linux/qnx4_fs_sb.h>#include <linux/reiserfs_fs_sb.h>#include <linux/bfs_fs_sb.h>#include <linux/udf_fs_sb.h>#include <linux/ncp_fs_sb.h>#include <linux/usbdev_fs_sb.h>#include <linux/cramfs_fs_sb.h>#include <linux/jffs2_fs_sb.h>#include <linux/squashfs_fs_sb.h>#include <linux/pram_fs_sb.h>#include <linux/xfs_fs_sb.h>extern struct list_head super_blocks;extern spinlock_t sb_lock;#define sb_entry(list) list_entry((list), struct super_block, s_list)#define S_BIAS (1<<30)struct super_block { struct list_head s_list; /* Keep this first */ kdev_t s_dev; unsigned long s_blocksize; unsigned char s_blocksize_bits; unsigned char s_dirt; unsigned long long s_maxbytes; /* Max file size */ struct file_system_type *s_type; struct super_operations *s_op; struct dquot_operations *dq_op; unsigned long s_flags; unsigned long s_xattr_flags; unsigned long s_magic; struct dentry *s_root; struct rw_semaphore s_umount; struct semaphore s_lock; int s_count; atomic_t s_active; struct list_head s_dirty; /* dirty inodes */ struct list_head s_locked_inodes;/* inodes being synced */ struct list_head s_files; struct block_device *s_bdev; struct list_head s_instances; struct quota_info s_dquot; /* Diskquota specific options */ struct quota_operations *s_qop; union { struct minix_sb_info minix_sb; struct ext2_sb_info ext2_sb; struct ext3_sb_info ext3_sb; struct hpfs_sb_info hpfs_sb; struct ntfs_sb_info ntfs_sb; struct msdos_sb_info msdos_sb; struct isofs_sb_info isofs_sb; struct nfs_sb_info nfs_sb; struct sysv_sb_info sysv_sb; struct affs_sb_info affs_sb; struct ufs_sb_info ufs_sb; struct efs_sb_info efs_sb; struct shmem_sb_info shmem_sb; struct romfs_sb_info romfs_sb; struct smb_sb_info smbfs_sb; struct hfs_sb_info hfs_sb; struct adfs_sb_info adfs_sb; struct qnx4_sb_info qnx4_sb; struct reiserfs_sb_info reiserfs_sb; struct bfs_sb_info bfs_sb; struct udf_sb_info udf_sb; struct ncp_sb_info ncpfs_sb; struct usbdev_sb_info usbdevfs_sb; struct jffs2_sb_info jffs2_sb; struct cramfs_sb_info cramfs_sb; struct squashfs_sb_info squashfs_sb; struct pram_sb_info pram_sb; struct xfs_sb_info xfs_sb; void *generic_sbp; } u; /* * The next field is for VFS *only*. No filesystems have any business * even looking at it. You had been warned. */ struct semaphore s_vfs_rename_sem; /* Kludge */ /* The next field is used by knfsd when converting a (inode number based) * file handle into a dentry. As it builds a path in the dcache tree from * the bottom up, there may for a time be a subpath of dentrys which is not * connected to the main tree. This semaphore ensure that there is only ever * one such free path per filesystem. Note that unconnected files (or other * non-directories) are allowed, but not unconnected diretories. */ struct semaphore s_nfsd_free_path_sem;};/* * VFS helper functions..
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -