Chapter 8: The Virtual Filesystem
fd_installsys_openforce_o_largefiledo_sys_openget_unused_fd_flagsdo_flip_openopen_nameinameidata_to_filpFigure 8-11: Code flow diagram forsys_open.do_filp_openfinds the file inode with the support of two helper functions.- open_nameiinvokes thepath_lookupfunction to find the inode and performs several
additional checks (e.g., to ascertain whether the application is trying to open a directory
as if it were a regular file). If a new filesystem entry needs to be created, the function also
applies the current default settings for the permission bits as stored in the process’s umask
(current->fs->umask). - nameidata_to_filpinitializes the readahead structure, places the newly generatedfile
instance on thes_fileslist of the superblock (see Section 8.4.1), and invokes theopenfunc-
tion in thefile_operationsstructure of the underlying filesystem.
fd_installmust then install thefileinstance infiles->fdfrom the task structure of the process before
control is transferred back to the user process to which the file descriptor is returned.Reading andWriting
Once a file has been successfully opened, a process either reads or modifies the data it contains using the
readandwritesystem calls provided by the kernel. As usual, the entry routines are calledsys_readand
sys_write, and both are implemented infs/read_write.c.Read
Thereadfunction requires three parameters — the file descriptor, a buffer to hold data, and a length
argument to specify the number of characters to be read. The parameters are passed directly to the kernel.For the VFS layer, reading from a file is not particularly difficult, as Figure 8-12 illustrates.By reference to the file descriptor number, the kernel (using thefget_lightfunction from
fs/file_table.c)isabletofindthefileinstance associated with the task structure of the process.After finding the current position in the file withfile_pos_read(the routine just needs to return the
value offile->f_pos), the read operation itself is delegated tovfs_read. This routine invokes either