岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Linux频道 >> 系统管理 >> 内核技术 >> Linux频道正文
Linux 2.6.11内核文件IO系统调用详解
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-12-18 17:31:42

int may_open(struct nameidata *nd, int acc_mode, int flag){

        struct dentry *dentry = nd->;dentry;

        struct inode *inode = dentry->;d_inode;

        int error;

        if (!inode) return -ENOENT; // inode为空,则返回错误

        if (S_ISLNK(inode->;i_mode)) // 连接文件,返回错误

                return -ELOOP;

        if (S_ISDIR(inode->;i_mode) && (flag & FMODE_WRITE))

                return -EISDIR; // 是目录且仅有写权限,返回错误

        error = permission(inode, acc_mode, nd); // 见擦inode的accmode

        if (error)

                return error;

        if (S_ISFIFO(inode->;i_mode) || S_ISSOCK(inode->;i_mode)) {

                    flag &= ~O_TRUNC; // 如果是FIFO文件,则不允许truncate

        } else if (S_ISBLK(inode->;i_mode) || S_ISCHR(inode->;i_mode)) {

                if (nd->;mnt->;mnt_flags & MNT_NODEV)

                        return -EACCES; // 如果是设备,则不允许truncate,否则返回错误

                flag &= ~O_TRUNC;

        } else if (IS_RDONLY(inode) && (flag & FMODE_WRITE))

                return -EROFS; 如果flag标识和inode权限冲突,则返回错误

        // 如果inode只允许append方式写入,则不允许truncate和非append写入方式。

if (IS_APPEND(inode)) {

                if  ((flag & FMODE_WRITE) && !(flag & O_APPEND))

                        return -EPERM;

                if (flag & O_TRUNC)

                        return -EPERM;

        }

        // O_NOATIME方式仅在inode用户是文件拥有者或者超级用户情况下才被允许

        if (flag & O_NOATIME)

                if (current->;fsuid != inode->;i_uid && !capable(CAP_FOWNER))

                        return -EPERM;

        // 检查是否有其他进程在使用该文件

        error = break_lease(inode, flag);

        if (error)

                return error;

        if (flag & O_TRUNC) {

                error = get_write_access(inode); // 获取一次inode写操作权限

                if (error)

                        return error;

                // 锁定inode

                error = locks_verify_locked(inode);

                if (!error) {

                        DQUOT_INIT(inode); // 对inode执行配额初始化

                        error = do_truncate(dentry, 0); // truncate dentry

                }

                put_write_access(inode); // 释放当前写操作权限

                if (error)

                        return error;

        } else

                if (flag & FMODE_WRITE) // 如果有写标识,则对inode执行配额初始化

                        DQUOT_INIT(inode); 

        return 0;

                        }

4.2.4.2.open_namei子函数dentry_open

dentry_open函数主要实现文件表的对应打开等操作,返回文件指针。

struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags){

        struct file * f;

        struct inode *inode;

        int error;

        error = -ENFILE;

        f = get_empty_filp(); // 从进程文件表中获取一个未使用的文件结构指针,空则出错返回

        if (!f)

                goto cleanup_dentry;

        // 设置文件的flags和mode标识

        f->;f_flags = flags;

        f->;f_mode = ((flags+1) & O_ACCMODE) | FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE;

        inode = d

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页


  • 上一个Linux频道:
  • 下一个Linux频道:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:WebSyue@163.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    惊天动地私服 天龙八部私服 天龙八部私服 热血江湖私服 天龙八部私服 bet365 bet365 传世私服 传奇世界私服