环境:Linux Kernel 5.3; FS:ext4
请求stat(const char *pathname, struct stat *statbuf)
时,如何检查const char *pathname
是否存在?
这是必要的,因为万一没有这样的路径,stat
返回-1 (ENOENT)
。这是我正在测试的程序:
static const char *pathname = "/some/fancy/path/name";
int main(void){
struct stat statbuf;
unsigned long i = 0;
int fd = -1;
while(1){
if((++i) % 2){
fd = open(pathname, O_CREAT, 0644);
}
stat(pathname, &statbuf);
if(i % 2){
close(fd);
unlink(pathname);
}
}
}
每2次迭代,该文件将被删除,并在下一次重新创建。为了检查内核调用堆栈,我使用了
perf report
:调用堆栈不符合我的期望。我希望在
ext4
下调用vfs_statx
,以便遍历可能需要磁盘I/O的ext4
内部数据结构。如果将其缓存在inode或dentry缓存中,如何刷新它以检查需要
ext4
的哪些stat(const char *pathname, struct stat *statbuf);
调用?UPD:仔细研究一下实现,我发现它似乎是从
link_path_walk
中指定的dentry缓存中获取的 最佳答案
您应该能够通过/proc/sys/vm/drop_caches
(来自 Documentation/sysctl/vm.txt
)来做到这一点:
基本上只是:echo 2 | sudo tee /proc/sys/vm/drop_caches
。
根据实际问题,为了找到ext4如何处理查找,您可以查看inode_operations
结构defined in fs/ext4/namei.c
。更具体地说,您对.lookup
操作 ext4_lookup()
感兴趣。查找时调用此函数。
调用树应如下所示:
link_path_walk()
walk_component()
lookup_slow()
__lookup_slow()
ext4的
inode->i_op->lookup(...)
是 ext4_lookup()