Najpierw jest wywoływana funkcja put_inode() z superbloku i-węzła (funkcja charakterystyczna dla danego systemu plików). Następnie wykonywana jest atomowa operacja: pole i_count jest zmniejszane, jeśli pozostaje większe od zera, to funkcja kończy działanie, w przeciwnym wypadku zakładany jest spin-lock.

Jeśli liczba dowiązań do węzła w postaci nazwy (pole i_nlink) jest równa zero, węzeł jest usuwany z odpowiadającej mu listy w tablicy haszowanej, a także z listy i-węzłów używanych, nieużywanych lub brudnych (z tej, na której się znajduje). Następnie i-węzeł oznaczany jest jako zwalniany (bit I_FREEING w polu i_state) oraz zmniejszany jest licznik i-węzłów (inodes_stat.nr_inodes). Zwalniany jest spin-lock. Działanie funkcji kończy wywoływanie funkcji delete_inode() oraz clear_inode() z superbloku (jeśli w superbloku nie ma funkcji delete_inode(), jest wywoływane clear_inode z VFS).

Jeśli pole i_nlink jest większe od zera, sprawdzane jest, czy i-węzeł znajduje się w tablicy haszowanej. Jeśli tak - jeśli był brudny albo zablokowany, jest przenoszony do listy i-węzłów nieużywanych (z listy węzłów używanych albo brudnych). Zwiększany jest licznik i-węzłów nieużywanych (inodes_stat.nr_unused).

Jeśli i-węzła nie ma w tablicy haszowanej, jest wyrzucany z listy, na której się znajduje (pole i_list), jest oznaczany jako zwalniany (bit I_FREEING w polu i_state), zmniejszany jest licznik i-węzłów (inodes_stat.nr_inodes), zwalniany jest spin-lock i wywołuje się funkcję clear_inode.

Funkcję kończy wywołanie destroy_inode().


Używana przez iput funkcja VFS clear_inode() jest wywoływana głównie przez funkcje obsługi systemu plików, po to, aby poinformować VFS, że i-węzeł jest niepotrzebny i można zwolnić zajęte przez niego zasoby. W funkcji tej najpierw zapisywane są na dysk wszystkie brudne bufory. Następnie wywoływana jest wait_on_inode() (czekanie na odblokowanie i-węzła). Uaktualniana jest quota. Wywoływane jest clear_node() z superbloku. Pole i_state ustawiane jest na I_CLEAR.