Do spisu tresci tematu System plików EXT2

Funkcja namei() - zamiana nazwy ścieżkowej na i-węzeł




Spis treści


Wstęp

Dostęp do plików poprzez wywoływanie funkcji systemowych realizowany jest przez nazwy ścieżkowe, natomiast jądro wewnętrznie posługuje się i-węzłami. W związku z tym konieczne jest dokonywanie konwersji z nazwy ścieżkowej na odpowiadający jej i-węzeł. Konwersję tą dokonuje funkcja namei.

Nazwa ścieżkowa zbudowana jest z nazw katalogów oddzielonych znakami "/". Nazwa może się zaczynać od "/" - wtedy jest to ścieżka bezwzględna (od korzenia systemu plików) lub od innego znaku - wtedy jest to ścieżka względna (od bierzącego katalogu).

Poza główną funkcją namei istnieją również jej odmiany używane przez konkretne funkcje systemowe np. open. Zostaną one omówione w celu ukazania sposobów korzystania z algorytmu namei().

Dwie specjalne funkcje lookup() i follow_link() implementują obsługę specjalnych przypadków - przekraczanie punktów zamontowania plików i dowiązań symbolicznych. Jedynie w tych dwóch funkcjach są realizowane zależne od systemu plików na podstawie pola i_op w i-węźle którego dotyczą, dzięki temu możliwe jest przejście przy punkcie montowania od jednego systemu plików do drugiego.


Schemat algorytmu namei()


Podzial algorytmu na funkcje pomocnicze w pliku źródłowym

Przybliżymy teraz zawartość pliku źródłowego - z wydzieleniem odpowiednich funkcji pomocniczych używanych przez namei().


Sposoby wykorzystania algorytmu namei()

Sam algorytm namei() jest wykorzystywany tylko przez niektóre funkcje systemowe - te w najprostszy sposób korzystające z przekształcania nazw ścieżkowych w i-węzły (np. chmod). Bardziej zaawansowane funkcje np. do otwierania pliku, obsługi katalogów (rename, mkdir, rmdir itp.) wykorzystują dir_namei(), która zwraca i-węzeł katalogu i nazwę pliku w tym katalogu. Można potem zmodyfikować wpis w pliku identyfikowanym zwróconym i-węzłem na pozycji odpowiadającej zwróconej nazwie. Funkcja open() korzysta z rozbudowanej wersji namei(), która jest oddzielną funkcją open_namei(). W niej właśnie dokonują się sprawdzenia, czy plik o który chodzi może być czytany, czy musi zostać utworzony, a może jest gniazdem i nie jest przechowywany na dysku (open_namei() korzysta również z dir_namei()).


Zadanie

Zadanie polega na dorobieniu nowych możliwości przy podawaniu nazwy ścieżkowej. Szczególne znaczenie mają "..." i "....". Pierwszy z nich daje możliwość odwołania się do katalogu o dwa wyżej, drugi o trzy poziomy wyżej. W celu zaimplementowania tej zmiany należy zmodyfikować funkcję lookup() zwracającą i-węzeł rozpatrywanej pozycji w konkretnym katalogu (opis powyżej) - tu: "..." i "....". Dla tych pozycji należy uważać na punkt zamontowania systemu plików i kilkakrotnie (dwa lub trzy razy) wołać funkcję lookup() dla konkretnego systemu plików (z parametrem name="..").

Innym pomysłem na zmianę w jądrze jest wstępne rozpatrywanie nazwy ścieżkowej przez funkcję dir_namei(). Można by zoptymalizować ją ponieważ pozycje ".." (oraz dodatkowe "..." i "....") mają sens jedynie na początku nazwy ścieżkowej. W związku z tym proponuję najpierw przeanalizować nazwę ścieżkową i wyodrębnić w niej początkowe pozycje z kropkami, pozycje z kropkami umieszczone wewnątrz nazwy ścieżkowej (tzn. po innych pozycjach) powinny się znosić z tymi pozycjami.

Przykład: "../../../ala/kot/../pies/xxx" odnosi się do tego samego pliku co wpis "../../../ala/pies/xxx" - wewnętrzne dwie kropki zniosły się z "kot". Dopiero tak zmodyfikowana nazwa ścieżkowa powinna być poddawana działaniu algorytmu dir_namei(), albo w wypadku występowania wewnętrznych wpisów ".." można zwracać błąd.

Dodatkowo można przenieść sprawdzanie przekraczania punktu zamontowania z lookup() do dir_namei() i dokonywać tego tylko dla początkowych wpisów równych "..". Gdy skończą się pozycje tej postaci, można już nie sprawdzać punktu zamontowania, bo nie poruszamy się w górę drzewa.


Bibilografia


Autor: Paweł Mielańczuk