mkdir系统调用实现

本文详细解析了Linux5.10中mkdir函数的实现过程,涉及musl库的接口调用,以及do_mkdirat函数中的dentry处理和不同文件系统(如configfs)中inode创建策略。
摘要由CSDN通过智能技术生成

本文基于Linux5.10。        

mkdir在musl1.2.3中的实现,直接调用了mkdir系统调用

int mkdir(const char *path, mode_t mode)
{
#ifdef SYS_mkdir
	return syscall(SYS_mkdir, path, mode);
#else
	return syscall(SYS_mkdirat, AT_FDCWD, path, mode);
#endif
}

mkdir系统调用起始于 fs/namei.c,定义如下:

SYSCALL_DEFINE2(mkdir, const char __user *, pathname, umode_t, mode)
{
	return do_mkdirat(AT_FDCWD, pathname, mode);
}

        do_mkdirat函数定义如下:


static long do_mkdirat(int dfd, const char __user *pathname, umode_t mode)
{
    //...
retry:
	dentry = user_path_create(dfd, pathname, &path, lookup_flags);
    //...
	error = security_path_mkdir(&path, dentry,
			mode_strip_umask(path.dentry->d_inode, mode));
	if (!error)
		error = vfs_mkdir(path.dentry->d_inode, dentry, mode);
	done_path_create(&path, dentry);
	if (retry_estale(error, lookup_flags)) {
		lookup_flags |= LOOKUP_REVAL;
		goto retry;
	}
    //...
}

        在do_mkdirat函数中,首先user_path_create通过用户传入的文件路创建对应的dentry,path保存父目录路径,dentry保存要新建的目录项内存

static struct dentry *
filename_create(int dfd, struct filename *name,
				struct path *path, unsigned int lookup_flags)
{

    //查找父目录文件路径,找到父目录后,将新建的目录关联到父目录
	name = filename_parentat(dfd, name, lookup_flags, path, &last, &type);
    
    //分别在dentry的哈希表和磁盘中查找目标dentry,没有则创建新的dentry
	dentry = __lookup_hash(&last, path->dentry, lookup_flags);
}

          在__lookup_hash函数中,先在全局哈希表查询,

static struct dentry *__lookup_hash(const struct qstr *name,
		struct dentry *base, unsigned int flags)
{
    //先在dentry hash表中查询目标dentry
	struct dentry *dentry = lookup_dcache(name, base, flags);
    ...
    //创建dentry
	dentry = d_alloc(base, name);

    //调用对应文件系统的lookup函数,查找目标目录
	old = dir->i_op->lookup(dir, dentry, flags);
    ...
}

        以configfs为例,对应的函数是configfs_lookup,在configfs_lookup中,调用inode = configfs_create(dentry, mode);创建了inode对象。当然不同的文件系统的实现不一样,有的文件系统在lookup中并不会去创建inode,而是在对应的mkdir中创建。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bluetangos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值