CSC 660: Advanced Operating Systems Slide #1
CSC 660: Advanced OS
Virtual Filesystem
CSC 660: Advanced Operating Systems Slide #2
Topics
1. Filesystems
2. Filenames and Pathnames
3. File Attributes
4. File Operations
5. Virtual Filesystem
6. VFS Objects
7. Processes and Files
CSC 660: Advanced Operating Systems Slide #3
Why filesystems?
Physical Disk Filesystem
Access by Blocks Bytes
Addressing Block # Pathname
Security None ACLs
Reliability Corruption on crash Robust response to system failures.
CSC 660: Advanced Operating Systems Slide #4
Tree Structure
/
bin boot tmp usr var
ls grub bin lib X11R6
vmlinuzmenu.lst
less
zip bin lib
xclock xterm
CSC 660: Advanced Operating Systems Slide #5
Filenames and Pathnames
• Filenames– Human-readable identifier for data.– File suffixes have special meanings in Windows.
• Directories– Store lists of filename/location mappings.
• Pathnames– Identify file in directory hierarchy.– Ex: /usr/X11R6/bin/xclock
CSC 660: Advanced Operating Systems Slide #6
File Attributes• Filename and Data• Location• File Type
– Regular files– Directories– Device (block + char) files– IPC files
• Ownership• Access Control List• Locking• Size• Timestamps
CSC 660: Advanced Operating Systems Slide #7
File Operations
• Create• Delete• Open• Close• Read• Write
• Append• Seek• Get Attributes• Set Attributes• Rename
CSC 660: Advanced Operating Systems Slide #8
File Descriptors
User process reference to a file.A non-negative integer unique to process.
Returned by open or creat system calls.
Used as argument to other file system calls.
View with: ls –l /proc/self/fd
Common file descriptors:0 STDIN
1 STDOUT
2 STDERR
CSC 660: Advanced Operating Systems Slide #9
Process File Context
• Root directory– Usually /, but can change for security.
• Current working directory– Default location for file commands.– Relative pathnames are relative to CWD.
• Open file table– Maps file descriptors to kernel file objects.– files_struct member of task_struct
CSC 660: Advanced Operating Systems Slide #10
Open File Tablestruct files_struct {
atomic_t count;
spinlock_t file_lock;
int max_fds;
int max_fdset;
int next_fd;
struct file ** fd;
fd_set *close_on_exec;
fd_set *open_fds;
fd_set close_on_exec_init;
fd_set open_fds_init;
struct file * fd_array[NR_OPEN_DEFAULT];
};
CSC 660: Advanced Operating Systems Slide #11
Opening and Closing#include <fcntl.h>#include <unistd.h>
int open(char *path, int oflag);/*Common flags: O_RDONLY, O_WRONLY, O_CREAT Returns FD on success, -1 on failure
*/
int close(int filedes);/* Returns 0 on success, -1 on failure */
CSC 660: Advanced Operating Systems Slide #12
Reading and Writing#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes);/* Returns # bytes read, 0 if EOF, -1 error */
ssize_t write(int fd, void *buf, size_t nbytes);/* Returns # bytes written, -1 on error */
off_t lseek(int fd, off_t offset, int whence)/*
Whence: SEEK_SET (f/ 0) or SEEK_CUR (f/ current)Returns new file offset, -1 on error
*/
CSC 660: Advanced Operating Systems Slide #13
Virtual Filesystem
CSC 660: Advanced Operating Systems Slide #14
Classes of Filesystems
• Disk-based filesystems– Linux (ext2, ext3, reiserfs)– UNIX (ufs, minix, JFS, XFS)– MS (FAT, VFAT, NTFS) and other proprietary– ISO9660 CD-ROM, UDF DVD
• Network filesystems– NFS, AFS, CIFS
• Special filesystems– Procfs, sysfs
CSC 660: Advanced Operating Systems Slide #15
VFS Objects
• superblock– Represents a mounted filesystem.
• inode– Represents a specific file.
• dentry– Represents a directory entry, a single path comp.
• file– Represents an open file associated w/ a process.
CSC 660: Advanced Operating Systems Slide #16
VFS Objects
• Directories are files– Directories are handled by file objects.– dentry objects are path components, not dirs.
• Each object contains an operations object– Define methods kernel invokes on object.– Defined as struct of function pointers.
• What if a fs doesn’t have a type of object?– Objects of that type made on the fly for VFS.
CSC 660: Advanced Operating Systems Slide #17
VFS Objects
CSC 660: Advanced Operating Systems Slide #18
struct super_blockType Field Description
struct list_head s_list Superblock linked list
dev_t s_dev Device identifier
u_long s_blocksize Block size in bytes
u_char s_dirt Dirty (modified) flag
struct
super_operations *
s_op Superblock methods
struct semaphore s_lock Superblock semaphore
struct list_head s_inodes List of all inodes
struct list_head s_io Inodes waiting for write
struct list_head s_files List of file objects
CSC 660: Advanced Operating Systems Slide #19
struct inodeType Field Description
struct list_head i_list Inode linked list
struct list_head i_dentry List of dentries to this inode
inode_operations *i_op Inode methods
u_long i_ino Inode number
atomic_t i_count Reference count
umode_t i_mode ACL for file
u_long i_nlink Number of hard links
uid_t,gid_t i_{uid,gid} UID and GID of owner
loff_t i_size File size in bytes
struct timespec i_[amc]time Last access, modify, change
CSC 660: Advanced Operating Systems Slide #20
Inode Operationsint create(struct inode *dir, struct dentry *dentry, int mode)struct dentry *lookup(struct inode *dir, struct dentry *dentry)int link(struct dentry *old, struct inode *dir, struct dentry
*dentry)int unlink(struct inode *dir, struct dentry *dentry)int symlink(struct inode *dir, struct dentry *dentry, const char
*symname)int mkdir(struct inode *dir, struct dentry *dentry, int mode)int rmdir(struct inode *dir, struct dentry *dentry)int rename(struct inode *old_dir, struct dentry *old, struct
inode *new_dir, struct dentry *new) int readlink(struct dentry *dentry, char *buffer, int buflen)
CSC 660: Advanced Operating Systems Slide #21
Dentry Objects
• Path components– Ex: /bin/vi has 3 dentries: /, etc, and vi
• Not an on-disk data structure– Constructed on fly from pathname string.– Cached by the kernel to avoid re-construction.
• States– Used: corresponds to valid inode in use.– Unused: valid inode not currently used (cached).– Negative: invalid path, no corresponding inode
CSC 660: Advanced Operating Systems Slide #22
struct dentryType Field Description
atomic_t d_count Usage count
spinlock_t d_lock Lock for this dentry
struct inode *d_inode Corresponding inode
struct
dentry_operations
*d_op Dentry methods
struct list_head d_lru List of unused dentries.
struct list_head d_child Dir dentries of same parent.
struct list_head d_subdirs Subdirectory dentries.
struct list_head d_alias Dentries w/ same inode.
CSC 660: Advanced Operating Systems Slide #23
struct fileType Field Description
struct list_head f_list Linked list of file objects
struct dentry *f_dentry Associated dentry object
atomic_t f_count Usage count
u_int f_flags Flags specified on open()
struct
file_operations *
f_op File methods (open, read, write, readdir, ioctl)
mode_t f_mode File access mode
loff_t f_pos File offset
u_int f_{uid,gid} User’s UID and GID
int f_error Error code
CSC 660: Advanced Operating Systems Slide #24
References1. Daniel P. Bovet and Marco Cesati, Understanding the
Linux Kernel, 3rd edition, O’Reilly, 2005.2. Robert Love, Linux Kernel Development, 2nd edition,
Prentice-Hall, 2005.3. Claudia Rodriguez et al, The Linux Kernel Primer,
Prentice-Hall, 2005.4. Peter Salzman et. al., Linux Kernel Module Programming
Guide, version 2.6.1, 2005.5. Avi Silberchatz et. al., Operating System Concepts, 7th
edition, 2004.6. Andrew S. Tanenbaum, Modern Operating Systems, 3rd
edition, Prentice-Hall, 2005.