Funkcja iget

Funkcja iget(sb, ino) zwraca VFS-owego inode-a odpowiadającemu inode-owi 'ino' z sytemu plików opisywanego przez superblock 'sb'. Jej działanie sprowadza się do znalezienia inode-a jeśli już istnieje, bądź stworzenia go, oraz do zadbania żeby wszystkie kolejki i zmienne dotyczące podystemu cachowania inodów były uaktualnione.

Funkcja pomocnicza __iget() jest wywoływana zawsze gdy już znajdziemy lub stworzymy inode-a. Zwiększa ona i_count, i przesuwa (jeśli trzeba) i_node-a z kolejki inode-ów nieużywancyh do kolejki używanych (zwiększając inode_stat.nr_unused).

Algorytm iget:

  1. funkcja (będąc w posiadaniu inode_lock-a) szuka tego inode-a w inode_hashtable (metoda find_inode()). Jeśli się uda wywołuje __iget().
  2. Jeśli znaleziony inode jest za-lock-owany to czeka aż ten lock zostanie zdjęty aby zagwarantować ze funkcja zwróci inode gotowy do użytku.
  3. Jeśli nie znajdzie inode-a w inode_hashtable to znaczy że po raz pierwszy ma z tym inode-em do czynienia (ewentualnie został on już skasowany z kolejki inoed-ów nieużywanych), i wywołuje get_new_inode() :
  4. Funkcja get_new_inode() tworzy nowego inode-a (metodą ialloc), która to operacja może się blokować. Tak więc wcześniej zwalnia ona inode_lock. Po wykonaniu tej operacji musi więc potem (już z inode_lock-iem) sprawdzić czy w między czasie szukany inode nie został wstawiony do kolejki inode_hashtable. Jeszcze raz przeszukuje więc kolejkę używanych inode-ów ( find_inode()). Jeśli znajdzie, wywołuje __iget() aby uaktualnić liczbe odwołań, po czym kasuje właśnie stworzonego. Jeśli szukany inode ciągle nie jest w kolejce to inicjalizuje pola tego nowo stworzonego, wywołując przy okazji specyficzną dla danego systemu plików sb->s_op->read_inode()

Funkcja iput

Funkcja iput() jest wywoływana gdy inode przestaje być używany. Jej zadaniem jest tak jak w przypadku iget() żeby wszelkie kolejki miały poprawne wartości.

Algorytm iput:

  1. Jeśli istnieje w danym systemie plików funkcja sb->s_op->put_inode(), to jest wywoływana bez żadnych lock-ów (aby się mogła blokować)
  2. zajmuje inode_lock i zmniejsza i_count. Jeśli to nie było ostatnie odwołanie to kończy.
  3. Jeśli już nie ma więcej odwołań to tego inode-a to trzeba wykonać wiecej pracy:
    1. Jeśli (i_nlink = 0) (wszystkie odwołania do inode-a zostały w miedzyczasie skasowane) to inode ten zostaje usunięty z kolejek w których się znajduje, i niszczony metodą sb->op->delete_inode().
    2. Wpp jeśli ten inode nie jest "brudny" to przenoszony jest do kolejki inode_unused (wraz ze zwiększeniem inode_stat.nr_unused). Inode-y nie związane z żadnym systemem plików są kasowane.