Linux 内核文件系统与设备操作流程分析(19) retval = -EBADF; if (!file) goto out_fail; // // 使用 struct file 中的来填充 // dentry = file->f_dentry; retval = -ENOTDIR; if (!S_ISDIR(dentry->d_inode->i_mode)) goto fput_fail; retval = file_permission(file, MAY_EXEC); if (retval) goto fput_fail; nd->mnt = mntget(file->f_vfsmnt); nd->dentry = dget(dentry); fput_light(file, fput_needed); } current->total_link_count = 0; // // 注意:这个函数才真正的分解路径,调用实际文件系统的操作。 // 它本身也是个简单封状,实际是使用 __link_path_walk() 函数 // 完成操作。 // retval = link_path_walk(name, nd);out: if (likely(retval == 0)) { if (unlikely(!audit_dummy_context() && nd && nd->dentry &&