Как выполняется поиск имени файла в ext4? - PullRequest
3 голосов
/ 06 мая 2020

Env: Linux Ядро 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:

enter image description here

Стек вызовов не оправдал моих ожиданий. Я ожидал ext4 вызовов под vfs_statx для обхода ext4 внутренних структур данных, которые, вероятно, потребовали бы дискового ввода-вывода.

Если он был кэширован в inode или dentry cache, как грипп sh это, чтобы проверить, какие ext4 вызовы потребуют stat(const char *pathname, struct stat *statbuf);?

UPD: При внимательном рассмотрении реализации я обнаружил, что она, похоже, взята из кеша dentry как указано в link_path_walk

1 Ответ

4 голосов
/ 06 мая 2020

Если он был кэширован в кэше inode или dentry, как его пропустить sh, чтобы проверить, какие ext4 вызовы потребуют stat(const char *pathname, struct stat *statbuf);?

Вы должны быть может сделать это через /proc/sys/vm/drop_caches (из Documentation/sysctl/vm.txt):

drop_caches

Writing to this will cause the kernel to drop clean caches, as well as
reclaimable slab objects like dentries and inodes.  Once dropped, their
memory becomes free.

To free pagecache:
  echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):
  echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
  echo 3 > /proc/sys/vm/drop_caches

В основном просто: echo 2 | sudo tee /proc/sys/vm/drop_caches.


Что касается реального вопроса, чтобы узнать, как ext4 обрабатывает поиск, вы можете посмотреть на inode_operations struct , определенную в fs/ext4/namei.c. В частности, вас интересует операция .lookup, которая равна ext4_lookup(). Эта функция вызывается при выполнении поиска.

Дерево вызовов должно быть таким:

...