1. vfs層node
open(O_CREATE)rest
sys_open()系統服務例程是這樣的: code
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) { if (force_o_largefile()) flags |= O_LARGEFILE; return do_sys_open(AT_FDCWD, filename, flags, mode); }
do_sys_open索引
getname(filename)get
get_unused_fd_flags(flags)it
do_filp_openio
set_nameidataast
path_openatclass
get_empty_filpsed
path_init
while(link_path_walk && do_last) {trailing_syslink();}
do_last() -->
lookup_open中調用父目錄的create方法來分配一個新的磁盤索引結點:
/* Negative dentry, just create the file */ if (!dentry->d_inode && (open_flag & O_CREAT)) { *opened |= FILE_CREATED; audit_inode_child(dir_inode, dentry, AUDIT_TYPE_CHILD_CREATE); if (!dir_inode->i_op->create) { error = -EACCES; goto out_dput; } error = dir_inode->i_op->create(dir_inode, dentry, mode, open_flag & O_EXCL); if (error) goto out_dput; fsnotify_create(dir_inode, dentry); }
terminate_walk()
restore_nameidata
fd_install
putname
2. ocfs2如何建立一個新的inode
const struct inode_operations ocfs2_dir_iops = { ...... .create = ocfs2_create, ...... };
ocfs2_create ocfs2_mknod ocfs2_prepare_dir_for_insert ocfs2_reserve_new_inode ocfs2_get_init_inode ocfs2_reserve_new_metadata_blocks ocfs2_reserve_clusters ocfs2_mknod_locked ocfs2_claim_new_inode __ocfs2_mknod_locked ocfs2_add_entry