⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfs.txt

📁 《嵌入式系统设计与实例开发实验教材二源码》Linux内核移植与编译实验
💻 TXT
📖 第 1 页 / 共 2 页
字号:
struct inode_operations {	struct file_operations * default_file_ops;	int (*create) (struct inode *,struct dentry *,int);	int (*lookup) (struct inode *,struct dentry *);	int (*link) (struct dentry *,struct inode *,struct dentry *);	int (*unlink) (struct inode *,struct dentry *);	int (*symlink) (struct inode *,struct dentry *,const char *);	int (*mkdir) (struct inode *,struct dentry *,int);	int (*rmdir) (struct inode *,struct dentry *);	int (*mknod) (struct inode *,struct dentry *,int,int);	int (*rename) (struct inode *, struct dentry *,			struct inode *, struct dentry *);	int (*readlink) (struct dentry *, char *,int);	struct dentry * (*follow_link) (struct dentry *, struct dentry *);	int (*readpage) (struct file *, struct page *);	int (*writepage) (struct file *, struct page *);	int (*bmap) (struct inode *,int);	void (*truncate) (struct inode *);	int (*permission) (struct inode *, int);	int (*smap) (struct inode *,int);	int (*updatepage) (struct file *, struct page *, const char *,				unsigned long, unsigned int, int);	int (*revalidate) (struct dentry *);};Again, all methods are called without any locks being held, unlessotherwise noted.  default_file_ops: this is a pointer to a "struct file_operations"	which describes how to open and then manipulate open files  create: called by the open(2) and creat(2) system calls. Only	required if you want to support regular files. The dentry you	get should not have an inode (i.e. it should be a negative	dentry). Here you will probably call d_instantiate() with the	dentry and the newly created inode  lookup: called when the VFS needs to lookup an inode in a parent	directory. The name to look for is found in the dentry. This	method must call d_add() to insert the found inode into the	dentry. The "i_count" field in the inode structure should be	incremented. If the named inode does not exist a NULL inode	should be inserted into the dentry (this is called a negative	dentry). Returning an error code from this routine must only	be done on a real error, otherwise creating inodes with system	calls like create(2), mknod(2), mkdir(2) and so on will fail.	If you wish to overload the dentry methods then you should	initialise the "d_dop" field in the dentry; this is a pointer	to a struct "dentry_operations".	This method is called with the directory inode semaphore held  link: called by the link(2) system call. Only required if you want	to support hard links. You will probably need to call	d_instantiate() just as you would in the create() method  unlink: called by the unlink(2) system call. Only required if you	want to support deleting inodes  symlink: called by the symlink(2) system call. Only required if you	want to support symlinks. You will probably need to call	d_instantiate() just as you would in the create() method  mkdir: called by the mkdir(2) system call. Only required if you want	to support creating subdirectories. You will probably need to	call d_instantiate() just as you would in the create() method  rmdir: called by the rmdir(2) system call. Only required if you want	to support deleting subdirectories  mknod: called by the mknod(2) system call to create a device (char,	block) inode or a named pipe (FIFO) or socket. Only required	if you want to support creating these types of inodes. You	will probably need to call d_instantiate() just as you would	in the create() method  readlink: called by the readlink(2) system call. Only required if	you want to support reading symbolic links  follow_link: called by the VFS to follow a symbolic link to the	inode it points to. Only required if you want to support	symbolic linksstruct file_operations                                                <section>======================This describes how the VFS can manipulate an open file. As of kernel2.1.99, the following members are defined:struct file_operations {	loff_t (*llseek) (struct file *, loff_t, int);	ssize_t (*read) (struct file *, char *, size_t, loff_t *);	ssize_t (*write) (struct file *, const char *, size_t, loff_t *);	int (*readdir) (struct file *, void *, filldir_t);	unsigned int (*poll) (struct file *, struct poll_table_struct *);	int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);	int (*mmap) (struct file *, struct vm_area_struct *);	int (*open) (struct inode *, struct file *);	int (*release) (struct inode *, struct file *);	int (*fsync) (struct file *, struct dentry *);	int (*fasync) (struct file *, int);	int (*check_media_change) (kdev_t dev);	int (*revalidate) (kdev_t dev);	int (*lock) (struct file *, int, struct file_lock *);};Again, all methods are called without any locks being held, unlessotherwise noted.  llseek: called when the VFS needs to move the file position index  read: called by read(2) and related system calls  write: called by write(2) and related system calls  readdir: called when the VFS needs to read the directory contents  poll: called by the VFS when a process wants to check if there is	activity on this file and (optionally) go to sleep until there	is activity. Called by the select(2) and poll(2) system calls  ioctl: called by the ioctl(2) system call  mmap: called by the mmap(2) system call  open: called by the VFS when an inode should be opened. When the VFS	opens a file, it creates a new "struct file" and initialises	the "f_op" file operations member with the "default_file_ops"	field in the inode structure. It then calls the open method	for the newly allocated file structure. You might think that	the open method really belongs in "struct inode_operations",	and you may be right. I think it's done the way it is because	it makes filesystems simpler to implement. The open() method	is a good place to initialise the "private_data" member in the	file structure if you want to point to a device structure  release: called when the last reference to an open file is closed  fsync: called by the fsync(2) system call  fasync: called by the fcntl(2) system call when asynchronous	(non-blocking) mode is enabled for a fileNote that the file operations are implemented by the specificfilesystem in which the inode resides. When opening a device node(character or block special) most filesystems will call specialsupport routines in the VFS which will locate the required devicedriver information. These support routines replace the filesystem fileoperations with those for the device driver, and then proceed to callthe new open() method for the file. This is how opening a device filein the filesystem eventually ends up calling the device driver open()method. Note the devfs (the Device FileSystem) has a more direct pathfrom device node to device driver (this is an unofficial kernelpatch).struct dentry_operations                                              <section>========================This describes how a filesystem can overload the standard dentryoperations. Dentries and the dcache are the domain of the VFS and theindividual filesystem implementations. Device drivers have no businesshere. These methods may be set to NULL, as they are either optional orthe VFS uses a default. As of kernel 2.1.99, the following members aredefined:struct dentry_operations {	int (*d_revalidate)(struct dentry *);	int (*d_hash) (struct dentry *, struct qstr *);	int (*d_compare) (struct dentry *, struct qstr *, struct qstr *);	void (*d_delete)(struct dentry *);	void (*d_release)(struct dentry *);	void (*d_iput)(struct dentry *, struct inode *);};  d_revalidate: called when the VFS needs to revalidate a dentry. This	is called whenever a name lookup finds a dentry in the	dcache. Most filesystems leave this as NULL, because all their	dentries in the dcache are valid  d_hash: called when the VFS adds a dentry to the hash table  d_compare: called when a dentry should be compared with another  d_delete: called when the last reference to a dentry is	deleted. This means no-one is using the dentry, however it is	still valid and in the dcache  d_release: called when a dentry is really deallocated  d_iput: called when a dentry looses its inode (just prior to its	being deallocated). The default when this is NULL is that the	VFS calls iput(). If you define this method, you must call	iput() yourselfEach dentry has a pointer to its parent dentry, as well as a hash listof child dentries. Child dentries are basically like files in adirectory.There are a number of functions defined which permit a filesystem tomanipulate dentries:  dget: open a new handle for an existing dentry (this just increments	the usage count)  dput: close a handle for a dentry (decrements the usage count). If	the usage count drops to 0, the "d_delete" method is called	and the dentry is placed on the unused list if the dentry is	still in its parents hash list. Putting the dentry on the	unused list just means that if the system needs some RAM, it	goes through the unused list of dentries and deallocates them.	If the dentry has already been unhashed and the usage count	drops to 0, in this case the dentry is deallocated after the	"d_delete" method is called  d_drop: this unhashes a dentry from its parents hash list. A	subsequent call to dput() will dellocate the dentry if its	usage count drops to 0  d_delete: delete a dentry. If there are no other open references to	the dentry then the dentry is turned into a negative dentry	(the d_iput() method is called). If there are other	references, then d_drop() is called instead  d_add: add a dentry to its parents hash list and then calls	d_instantiate()  d_instantiate: add a dentry to the alias hash list for the inode and	updates the "d_inode" member. The "i_count" member in the	inode structure should be set/incremented. If the inode	pointer is NULL, the dentry is called a "negative	dentry". This function is commonly called when an inode is	created for an existing negative dentry

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -