Chinaunix首页 | 论坛 | 博客
  • 博客访问: 286466
  • 博文数量: 60
  • 博客积分: 2697
  • 博客等级: 少校
  • 技术积分: 653
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-13 15:52
文章分类

全部博文(60)

文章存档

2012年(6)

2011年(31)

2010年(23)

分类: LINUX

2010-12-06 22:02:19

asmlinkage long sys_mkdir(const char __user * pathname, int mode)
{
    int error = 0;
     char * tmp;
 
     //把用户空间的值copy到内核空间
     tmp = getname(pathname);
     error = PTR_ERR(tmp);
     if (!IS_ERR(tmp)) {
         struct dentry *dentry;
         struct nameidata nd;
 
         //先查到它的父目录,看父目录是否存在
         error = path_lookup(tmp, LOOKUP_PARENT, &nd);
         if (error)
              goto out;
         //寻找子结点的dentry. 如果没有,则新建之
         dentry = lookup_create(&nd, 1);
         error = PTR_ERR(dentry);
         if (!IS_ERR(dentry)) {
              if (!IS_POSIXACL(nd.dentry->d_inode))
                   mode &= ~current->fs->umask;
              //与具体的文件系统相关的部份
              error = vfs_mkdir(nd.dentry->d_inode, dentry, mode);
              //减少dentry的引用计数
              dput(dentry);
         }
         up(&nd.dentry->d_inode->i_sem);
 
         //释放临时内存
         path_release(&nd);
out:
         putname(tmp);
     }
 
     return error;
}

 

  1. lookup_create()的代码如下:
  2. {
  3. struct dentry *dentry;
  4. //防止并发操作,获得信号量
  5. down(&nd->dentry->d_inode->i_sem);
  6. dentry = ERR_PTR(-EEXIST);
  7. //如果之前的查找过程失败
  8. if (nd->last_type != LAST_NORM)
  9. goto fail;
  10. //去掉LOOKUP_PARENT标志
  11. nd->flags &= ~LOOKUP_PARENT;
  12. //在缓存中寻找相应的dentry.如果没有。则新建之
  13. dentry = lookup_hash(&nd->last, nd->dentry);
  14. //创建或者查找失败
  15. if (IS_ERR(dentry))
  16. goto fail;
  17. //如果不是建立一个目录而且文件名字不是以0结尾
  18. //出错退出
  19. if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
  20. goto enoent;
  21. return dentry;
  22. enoent:
  23. dput(dentry);
  24. dentry = ERR_PTR(-ENOENT);
  25. fail:
  26. return dentry;
  27. }
  28. lookup_hash()à __lookup_hash():

 

 

阅读(2864) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

yimikeer2012-08-19 09:36:15

楼主我在使用syscalls.h里声明的sys_***系统调用时make总是提示
sys_*** undefined!,这个怎么解决啊