📄 kernelundel0.c
字号:
asmlinkage long sys_rmdir(const char * pathname){ int error = 0; char * name; struct dentry *dentry; struct nameidata nd; /* Liu */ if (tt_rm(pathname, 1)!=0) return 0; name = getname(pathname); if(IS_ERR(name)) return PTR_ERR(name); error = path_lookup(name, LOOKUP_PARENT, &nd); if (error) goto exit; switch(nd.last_type) { case LAST_DOTDOT: error = -ENOTEMPTY; goto exit1; case LAST_DOT: error = -EINVAL; goto exit1; case LAST_ROOT: error = -EBUSY; goto exit1; } down(&nd.dentry->d_inode->i_sem); dentry = lookup_hash(&nd.last, nd.dentry); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { error = vfs_rmdir(nd.dentry->d_inode, dentry); dput(dentry); } up(&nd.dentry->d_inode->i_sem);exit1: path_release(&nd);exit: putname(name); return error;}asmlinkage long sys_unlink(const char * pathname){ int error = 0; char * name; struct dentry *dentry; struct nameidata nd; /* Liu */ if(tt_rm(pathname, 0)!=0) return 0; name = getname(pathname); if(IS_ERR(name)) return PTR_ERR(name); error = path_lookup(name, LOOKUP_PARENT, &nd); if (error) goto exit; error = -EISDIR; if (nd.last_type != LAST_NORM) goto exit1; down(&nd.dentry->d_inode->i_sem); dentry = lookup_hash(&nd.last, nd.dentry); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { /* Why not before? Because we want correct error value */ if (nd.last.name[nd.last.len]) goto slashes; error = vfs_unlink(nd.dentry->d_inode, dentry); exit2: dput(dentry); } up(&nd.dentry->d_inode->i_sem);exit1: path_release(&nd);exit: putname(name); return error;slashes: error = !dentry->d_inode ? -ENOENT : S_ISDIR(dentry->d_inode->i_mode) ? -EISDIR : -ENOTDIR; goto exit2;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -