Directory Lookups and Pathname Resolution

There are three main entry points into the filesystem for dealing with pathname resolution, namely ux_readdir(), ux_lookup(), and ux_read_inode(). One interesting way to see how these three functions work together is to consider the interactions between the kernel and the filesystem in response to the user issuing an ls command on the root directory. When the filesystem is mounted, the kernel already has a handle on the root directory, which exports the following operations:

struct inode_operations ux_dir_inops = {
          create:     ux_create,
          lookup:     ux_lookup,
          mkdir:      ux_mkdir,
          rmdir:      ux_rmdir,
          link:       ux_link,
          unlink:     ux_unlink,
};

struct file_operations ux_dir_operations = {
          read:       generic_read_dir,
          readdir:    ux_readdir,
          fsync:      file_fsync,
};

The kernel has two calls at a directory level for name resolution. The first is to call ux_readdir() to obtain the names of all the directory entries. After the filesystem is mounted, the only inode in memory is the root inode so this operation can only be invoked on the root inode. Given a filename, the ux_lookup() function can be called to look up a name relative to a directory. This function is expected to return the inode for the name if found.

The following two sections describe each of these operations in more detail.

Reading Directory Entries

When issuing a call to ls, the ls command needs to know about all of the entries in the specified directory or the current working directory if ls is typed without ...

Get UNIX Filesystems: Evolution, Design, and Implementation now with the O’Reilly learning platform.

O’Reilly members experience live online training, plus books, videos, and digital content from nearly 200 publishers.