博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微视linux 文件系统之打开文件create模式
阅读量:4070 次
发布时间:2019-05-25

本文共 2777 字,大约阅读时间需要 9 分钟。

struct file *do_last(struct nameidata *nd, struct path *path,			    int open_flag, int acc_mode,			    int mode, const char *pathname){	struct dentry *dir = nd->path.dentry;	/* just plain open? */	if (!(open_flag & O_CREAT)){		error = do_lookup(nd, &nd->last, path);		if (error)			goto exit;		/*#define	ENOENT		 2	/* No such file or directory */*/		error = -ENOENT; //非创建模式如果找不到就上报错误		if (!path->dentry->d_inode)			goto exit_dput;		if (path->dentry->d_inode->i_op->follow_link)			return NULL;		/*#define	ENOTDIR		20	/* Not a directory */*/		error = -ENOTDIR;	}		/* OK, it's O_CREAT */	path->dentry = lookup_hash(nd);	=>struct dentry *lookup_hash(struct nameidata *nd)	{		return __lookup_hash(&nd->last, nd->path.dentry, nd);		=>struct dentry *__lookup_hash(struct qstr *name,		struct dentry *base, struct nameidata *nd)		{			inode = base->d_inode;			dentry = __d_lookup(base, name);			if (!dentry)				dentry = d_lookup(base, name);							if (!dentry) {				struct dentry *new;				new = d_alloc(base, name);//申请dentry空间								dentry = inode->i_op->lookup(inode, new, nd);				=>struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, struct nameidata *nd)				{					/*根据文件名找节点号,找不到则返回空*/					ino = ext2_inode_by_name(dir, &dentry->d_name);					if (ino) {						inode = ext2_iget(dir->i_sb, ino);					}					return d_splice_alias(inode, dentry);				}				/*不存在则创建新dentry*/				if (!dentry)					dentry = new;				else					dput(new);			}			return dentry;		}	}	path->mnt = nd->path.mnt;		/* Negative dentry, just create the file */	if (!path->dentry->d_inode) {		error = __open_namei_create(nd, path, open_flag, mode);		=>int __open_namei_create(struct nameidata *nd, struct path *path,				int open_flag, int mode)		{			struct dentry *dir = nd->path.dentry;			error = vfs_create(dir->d_inode, path->dentry, mode, nd);			/*创建dentry对应的inode节点*/			=>int vfs_create(struct inode *dir, struct dentry *dentry, int mode,				struct nameidata *nd)			{				error = dir->i_op->create(dir, dentry, mode, nd);				=>int ext2_create (struct inode * dir, struct dentry * dentry, int mode, struct nameidata *nd)				{					inode = ext2_new_inode(dir, mode);					inode->i_op = &ext2_file_inode_operations;					if (ext2_use_xip(inode->i_sb)) {						inode->i_mapping->a_ops = &ext2_aops_xip;						inode->i_fop = &ext2_xip_file_operations;					} else if (test_opt(inode->i_sb, NOBH)) {						inode->i_mapping->a_ops = &ext2_nobh_aops;						inode->i_fop = &ext2_file_operations;					} else {						inode->i_mapping->a_ops = &ext2_aops;						inode->i_fop = &ext2_file_operations;					}					mark_inode_dirty(inode);					return ext2_add_nondir(dentry, inode);				}				return error;			}			dput(nd->path.dentry);			nd->path.dentry = path->dentry;			return may_open(&nd->path, 0, open_flag & ~O_TRUNC);		}	}}

 

转载地址:http://qylji.baihongyu.com/

你可能感兴趣的文章
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
adb command not found
查看>>
Xcode 启动页面禁用和显示
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>
【leetcode】Reorder List (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Candy(python)
查看>>
【leetcode】Sum Root to leaf Numbers
查看>>
【leetcode】Pascal's Triangle II (python)
查看>>
java自定义容器排序的两种方法
查看>>
如何成为编程高手
查看>>
本科生的编程水平到底有多高
查看>>
使用与或运算完成两个整数的相加
查看>>
备忘:java中的递归
查看>>
Solr及Spring-Data-Solr入门学习
查看>>