Linux5.14版本中的文件系统中iterate_shared函数如何实现
时间: 2024-03-22 13:39:40 浏览: 158
`iterate_shared()` 函数是 Linux 文件系统中的一个遍历目录项的函数,它的作用是遍历一个目录下所有的目录项。在 Linux 5.14 版本中,该函数的实现如下:
```c
int iterate_shared(struct file *file, struct dir_context *ctx)
{
struct inode *inode = file_inode(file);
struct super_block *sb = inode->i_sb;
struct dentry *parent = file->f_path.dentry;
struct dentry *dentry, *prev;
int err = 0;
rcu_read_lock();
spin_lock(&parent->d_lock);
dentry = parent->d_subdirs;
if (dentry)
dentry = dget(dentry);
spin_unlock(&parent->d_lock);
while (dentry) {
if (ctx->pos >= ctx->count)
break;
if (!dentry->d_inode)
goto next;
if (dentry->d_name.len == 1 && dentry->d_name.name[0] == '.')
goto next;
if (dentry->d_name.len == 2 && dentry->d_name.name[0] == '.' &&
dentry->d_name.name[1] == '.')
goto next;
prev = ctx->pos;
err = dir_emit(ctx, dentry->d_name.name, dentry->d_name.len,
dentry->d_inode->i_ino, dentry->d_inode->i_mode);
if (err)
break;
if (ctx->pos != prev) {
spin_lock(&dentry->d_lock);
if (d_unhashed(dentry)) {
spin_unlock(&dentry->d_lock);
goto next;
}
if (dentry->d_inode)
inotify_inode_queue_event(dentry, IN_ACCESS, 0);
spin_unlock(&dentry->d_lock);
}
next:
spin_lock(&parent->d_lock);
dentry = dentry->d_u.d_child.d_next;
if (dentry)
dentry = dget(dentry);
spin_unlock(&prev->d_lock);
dput(prev);
}
if (dentry) {
spin_lock(&parent->d_lock);
dput(dentry);
spin_unlock(&parent->d_lock);
}
rcu_read_unlock();
return err;
}
```
同样的,该函数有两个参数,第一个参数是一个 `file` 结构体,代表要遍历的目录文件。第二个参数是一个 `dir_context` 结构体,包含了遍历过程中需要的一些信息,如遍历到的目录项数量、目录项的位置等。
函数的主要实现是通过遍历目录项链表,获取每个目录项的名称和 inode 号,并将这些信息传递给回调函数 `dir_emit()`,由回调函数进行处理。在遍历过程中,会跳过当前目录和上级目录,同时会对每个目录项进行一些额外的处理,如判断目录项是否已经被卸载、是否需要发送事件通知等。
在 Linux 5.14 版本中,该函数的实现与之前的版本相比,主要是采用了 RCU 机制来保证目录项的访问安全,并对一些细节进行了优化。
阅读全文