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:
inode_lock-a
) szuka tego inode-a w
inode_hashtable
(metoda find_inode()
). Jeśli się uda wywołuje __iget()
.
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()
:
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()
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:
sb->s_op->put_inode()
,
to jest wywoływana bez żadnych lock-ów (aby się mogła blokować)
inode_lock
i zmniejsza i_count
. Jeśli to nie było ostatnie odwołanie to kończy.
(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()
.
inode_unused
(wraz ze zwiększeniem inode_stat.nr_unused
).
Inode-y nie związane z żadnym systemem plików są kasowane.