环境: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:

c - 如何在ext4中查找文件名?-LMLPHP

调用堆栈不符合我的期望。我希望在 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()
  • 09-11 19:58