lsコマンドの内部動作
メモ。
DIR *opendir() __open64 (name, O_RDONLY|O_NDELAY|EXTRA_FLAGS) sys_open() filp_open() open_namei() path_lookup() link_path_walk() // スラッシュで区切られた各トークンに対してdo_lookup() do_lookup() real_lookup() down(&dir->i_sem) <- down d_lookup() if (キャッシュが見つからない場合){ d_alloc() i_op->lookup() <--- fs --- } up(&dir->i_sem) <- up __lookup_hash() d_alloc() i_op->lookup() <--- fs --- i_op->follow_link() // リンクの場合 dentry_open() f_op->open() <--- fs --- fd_install() struct dirent *readdir() __GETDENTS (dirp->fd, dirp->data, maxread); sys_getdents() vfs_readdir() down(&inode->i_sem) <- down f_op->readdir() <--- up(&inode->i_sem) <- up gobble_file (const char *name, enum filetype type, int explicit_arg, const char *dirname) int stat(const char *path, struct stat *buf); int fstat(int filedes, struct stat *buf); int lstat(const char *path, struct stat *buf); // ディレクトリに含まれるファイルそれぞれに対して行われる vfs_stat() user_path_walk() path_lookup() vfs_getattr() i_op->getattr(mnt, dentry, stat) <--- fs ---