Next: Najpopularniejsze systemy plików dostępne
Up: Niezależność od systemu plików
Previous: File System Switch
Spis rzeczy
Subsections
Po raz pierwszy idea vnode'ów została przedstawiona publicznie w artykule
Steve'a Kleimana ,,Vnodes: An Architecture for Multiple System Types in Sun UNIX''.
Zakładano realizację czterech celów:
- Implementacja systemu plików powinna być podzielona na dwie warstwy: zależna i
niezależną od systemu plików. Należy zdefiniować interfejs komunikacji między tymi
warstwami.
- Obsługa lokalnych systemów plikowych zarówno UNIXowych i
obcych (MS-DOS), zdalnych systemów plików (NFS, RFS).
- Obsługa serwera zdalnych systemów plików.
- Operacje na systemach plików powinny być atomowe, aby unikać blokowania i danych
globalnych.
Zaproponowano dwa interfejsy pomiędzy warstwą niezależną i zależną od systemu plików:
vfsops z operacjami na systemie plików i vnops z operacjami na poszczególnych
plikach. Ponieważ obsługiwane miały być też systemy plików nie mające nic wspólnego
z UNIXem i/lub dyskami in-core inode nie mógł dalej pełnić swojej funkcji.
Jego miejsce zajął vnode. Nowa struktura zawierała wszystko potrzebne warstwie
niezależnej, a jednocześnie pozwalała przechowywać połączenia z charakterystycznymi
dla systemu plików danymi (inode'ami, rnode'ami itp.). Pola struktury
vnode to:
- v_flag - flagi: VROOT vnode jest głównym katalogiem systemu plików,
VNOMAP wskazuje, że plik nie może być zamapowany w pamięci, VNOSWAP wskazuje,
że plik nie może być użyty jako urządzenie wymiany, VNOMOUNT mówi, że plik nie może być
montowany i VISSWAP ustawiany, gdy plik jest częścią wirtualnego użądzenia wymiany.
- v_count - liczba otwartych dowiązań do pliku.
- v_shlockc - liczba współdzielonych blokad założonych na plik.
- v_exlockc - liczba wyłącznych blokad założonych na plik.
- v_vfsmountedhere - jeżeli inny system plików jest zamontowany w katalogu związanym
z vnode'm pole to wskazuje strukturę vfs tego systemu.
- v_op - wskaźnik do operacji na pliku związanym z vnode'm.
- v_vfsp - określa typ pliku reprezentowanego przez vnode.
- v_data - wskaźnik na dane charakterystyczne dla systemu plików (np.: inode.
Jeżeli system plików nie ma UNIXowego interfejsu to odpowiednie pola vnodeops są ustawiane
na fs_nosys. Funkcja ta zwraca w wypadku wywołania ENOSYS.
Zamontowane systemy plików przechowane są w postaci listy struktur vfs. Podobnie
jak vnode vfs jest niezależny od systemu plików. Jedynie pole vfs_data może
być użyte do przechowania dowiązania do danych charakterystycznych dla systemu plików.
Z każdym systemem plików związana jest struktura vfsops zawierająca operacje, które
mogą być na nim wykonywane. Dowiązanie do tej struktury znajduje się w polu vfs_op
z vfs. Dostępne są następujące operacje:
- vfs_mount - funkcja używana do montowania systemu plików.
- vfs_unmount - funkcja używana do demontowania systemu plików.
- vfs_root - funkcja zwraca glówny vnode systemu plików.
- vfs_statfs - zwraca informacje potrzebne funkcji systemowej statfs().
- vfs_sync - funkcja zrzuca dane pliku i dane strukturalne systemu plików na dysk. Używana jest aby zminimalizować straty w czasie załamania systemu.
- vfs_fid - funkcja używana przez NFS dla zapewnienia obsługi pliku.
- vfs_vget - funkcja używana przez NFS do konwersji funkcji zwróconej przez wywołanie
vfs_fid.
Wszystkie operacje, które można przeprowadzić na plikach zdefiniowane są w strukturze vnodeops.
Są to następujące funkcje:
- vop_open - funkcja używana dla plików specjalnych urządzeń. Używana tylko kiedy
vnode został zwrócony z wcześniejszego wywołania vop_lookup.
- vop_close - podobnie do vop_open.
- vop_rdwr - czytanie i zapis do pliku.
- vop_ioctl - wywołanie ioctl na pliku.
- vop_select - implementacja funkcji select().
- vop_getattr - używana do wydobywania informacji potrzebnych funkcjom takim, jak stat().
- vop_setattr - używana do ustawiania tych informacji.
- vop_access - sprawdzenie pozwolenia na odczyt z pliku, zapis do pliku i wykonanie pliku.
- vop_lookup - zastępuje funkcję namei().
- vop_create - utworzenie nowego pliku w katalogu związanym z vnode`m.
- vop_remove - usunięcie katalogu.
- vop_link - impementacja wywołania systemowego link().
- vop_rename - impementacja wywołania systemowego rename().
- vop_mkdir - impementacja wywołania systemowego mkdir().
- vop_rmdir - impementacja wywołania systemowego rmdir().
- vop_readdir - odczytuje podkatalogi z katalogu związanego z vnode'm. Funkcja wywoływana
przez getdents().
- vop_symlink - impementacja wywołania systemowego symlink().
- vop_readlink - odczytuje zawartość dowiązania symbolicznego.
- vop_fsync - zrzuca zawartość pliku na dysk. Używana przez fsync().
- vop_inactive - funkcja wywoływana gdy nikt już nie korzysta z vnode'u i może być już
on zwolniony.
- vop_bmap - funkcja wywołana przez wirtualną pamięć przy stronicowaniu.
- vop_strategy - przeniesienie bloków do pamięci po wywołaniu vop_bmap().
- vop_bread - funkcja odczytuje logiczny blok z vnode'u i zwraca bufor z cache'a buforów,
który zawiera odczytane dane.
- vop_brelse - funkcja zwalnia bufor zwrócony przez vop_bread().
Jeżeli system plików nie obsługuje operacji to pole powinno być ustawione na fs_nosys(), która
zwraca ENOSYS. Operacje wywoływane są przez makra np.:
#define VOP_INACTIVE(vp, cr) \
(*(vp)->v_op->vop_inactive)(vp, cr)
SVR4 powstał w wyniku połączenia SVR3 i SunOS. Jednym z celów projektu było połączenie
interfejsu VFS/vnode z opracowanym przez AT&T File System Switch.
Pojawiła się więc tablica budowana dynamicznie w czasie kompilacji jądra virtual system switch table
podpięta pod vfssw[] zawierająca pozycję dla każdego systemu plików, z którym
jądro mogło współpracować. Elementami tablicy są struktury vfssw:
struct vfssw {
char *vsw_name; /* nazwa systemu plików */
int (*vsw_init)(); /* funkcja wywoływana w czasie inicjalizacji jądra */
struct vfsops *vsw_vfops;
}
Operacje, które można wykonać na systemie plików przechowane są zarówno w vsw_vfops
i w polu vfs_ops struktury vfs:
- vfs_mount - montowanie systemu plików.
- vfs_unmount - demontowanie systemu plików.
- vfs_root - zwraca główny vnode sytemu plików.
- vfs_statvfs - zwraca statystyki związane z systemem plików.
- vfs_sync - zrzucenie zmodyfikowanych danych na dysk.
- vfs_vget - funkcja wykorzystywana przez NFS, zwraca vnode obsługujący
podany plik.
- vfs_mountroot - Pole wykorzystywane w systemach plików, które mogą być montowane
jako główny system plików.
Vnode'y uległy małym modyfikacjom. Usunięte zostały pola v_shlockc i v_exlockc.
Dodano następujące pola:
- v_stream - jeżeli otwarty plik wskazuje na urządzenie strumieniowe, pole to wskazuje
na początek (head) strumienia.
- v_filocks - dowiązanie do blokad założonych na plik.
- v_pages - dowiązanie do wszystkich stron związanych z vnode'm w cache'u.
Większych zmian dokonano w vnodeops. Usunięto operacje: vop_bmap(), vop_bread(),
vop_brelse(), vop_strategy(), vop_rdwr() i vop_select().
Dodano następujące operacje:
- vop_read - odczyt z pliku.
- vop_write - zapis do pliku.
- vop_setfl - sprawdzenie przekazywanej przez system flagi.
- vop_fid - utworzenie obsługi pliku, z której NFS może później korzystać.
- vop_rwlock - blokowanie zapisu/odczytu pliku (LOCK_SHARED, LOCK_EXCL).
- vop_rwunlock - odblokowanie zapisu/odczytu pliku.
- vop_seek - sprawdzenie czy w systemie plików dozwolone jest wywołanie lseek()
z podanymi argumentami (niektóre systemy plików nie umożliwiają zapisu za końcem pliku).
- vop_cmp - funkcja porównująca vnode'y
- vop_frlock - funkcja implementująca blokowanie plików i rekordów.
- vop_space - funkcja używana w systemach plików umożliwiających zwolnienie przestrzeni
w trackie pracy nad plikiem.
- vop_realvp - wydobywanie vnode'a w systemach plików ukrywających je.
- vop_getpage - przeczytanie danych w pliku w przypadku błędu braku strony.
- vop_putpage - zrzucenie zmodyfikowanych danych na dysk.
- vop_map - funkcja używana do implementacji mapownia pamięci.
- vop_addmap - dodanie mapowania.
- vop_delmap - usunięcie mapowania.
- vop_poll - implementacja funkcji systemowej poll().
- vop_pathconf - implementacja wywołań systemowych pathconf() i fpatchconf().
Podobnie jak poprzednio operacje są dostępne poprzez makra.
Ważną zmianą była modyfikacja operacji namei(), która w BSD korzysta z następującej
struktury danych (nie korzysta z danych ustawionych przez wcześniejsze wywołanie
w jądrze namei()):
struct nameidata {
caddr_t ni_dirp /* dowiązanie do ścieżki */
enum uio_seg ni_seg; /* lokalizacja ścieżki */
short ni_nameiop; /* operacja do wykonania */
struct vnode *ni_cdir; /* aktualny katalog roboczy */
struct vnode *ni_rdir; /* główny katalog */
struct ucred *ni_cred; /* dane związane z wywołującym */
caddr_t ni_pnbuf; /* bufor nazwy ścieżki */
char *ni_ptr; /* aktualna pozycja w nazwie ścieżki */
int ni_pathlen; /* ilość znaków pozostała w nazwie ścieżki */
short ni_more; /* flaga informująca czy pozostało coś do przekształcenia */
short ni_loopcnt; /* liczba odnalezionych symbolicznych dowiązań */
struct vnode *nivp /* zwracany vnode */
struct vnode *nidvp /* vnode nadkatalogu */
}
Operacje, które można wykonać (ni_nameiop) to:
- LOOKUP - wyszukanie;
- CREATE - przygotowanie do stworzenia pliku;
- DELETE - przygotowanie do usunięcia pliku;
- WANTPARENT - zwrócenie vnode'a nadkatalogu;
- NOCACHE - usunięcie nazwy z cache'a;
- FOLLOW - podążanie za dowiązaniami symbolicznymi;
- NOFOLLOW - niepożądanie za dowiązaniami symbolicznymi;
Większość struktur pozostała taka sama jak w Sun VFS (dokonano bardzo małych
modyfikacji). Struktura vfs zyskała pole vfs_bsize (optymalny rozmiar
bloku), do statfs dodano f_bsize, natomiast vnode powiększył się
o v_text używany przez pliki wykonywalne.
Przybyło kilka operacji na plikach:
- vn_mknod - obsługa funkcji systemowej mknod(S);
- vn_read - obsługa wywołania systemowego read(S);
- vn_write - obsługa wywołania systemowego write(S);
- vn_seek - obsługa wywołania systemowego lseek(S);
- vn_abortop - funkcja wywoływana gdy poprzednio wywołano namei()
z CREATE lub DELETE, ale zrezygnowano z przeprowadzenia operacji;
- vn_lock - blokowanie operacji na pliku;
- vn_unlock - odblokowanie operacji na pliku;
Budowa VFS i vnode'ów w HP-UX jest bardzo podobna do SVR4.
Struktura vfs zachowuje większość składowych z SVR4 z kilkoma
małymi dodatkami. Operacje VFS też nie różnią się zbytnio od SVR4
(podobnie jest kilka dodatkowych funkcji). Strukturę vnode
odróżniają od tej z SVR4 dwie listy: z niezmienionymi buforami v_cleanblkhd
i z buforami zwierającymi modyfikacje v_dirtyblkhd. Konstrukcja
ta jest podobna do v_pages, ale zapewnia proste rozróżnienie,
które bufory były modyfikowane.
Next: Najpopularniejsze systemy plików dostępne
Up: Niezależność od systemu plików
Previous: File System Switch
Spis rzeczy
Elżbieta Krępska
2004-01-19