Do spisu tresci tematu 6

6.13.2 Funkcja umount()




Spis tresci


Wprowadzenie

Funkcja umount() wykonuje czynnosc odwrotna niz funkcja mount() - odmontowuje system plikow, zainstalowany przez uzytkownika lub w czasie startu systemu (jesli bylo to zaznaczone w pliku /etc/fstab), z istniejacej hierarchii plikow.

Struktury danych

Funkcja umount() uzywa takich struktur danych jak funkcja mount().

Algorytm umount

DEFINICJA: umount(char *name)
    WYNIK: 0 w przypadku sukcesu
           blad w przeciwnym przypadku
Argumentem funkcji moze byc zarowno punkt zamontowania, jak i nazwa urzadzenia.
Kody bledow sa takie same jak w przypadku funkcji mount().

Implementacja funkcji:

{
    if (uzytkownik nie ma uprawnien superuzytkownika)
        return -EPERM;
    pobierz i-wezel;
    if (i-wezel nalezy do urzadzenia rzeczywistego)
        if (nie ma dostepu do urzadzenia)
            return -EACCES;
    else
        if (i-wezel nie jest punktem zamontowania)
            return -EINVAL;
    pobierz i-wezel korzenia odmontowywanego systemu plikow;
    if (glowny numer urzadzenia >= MAX_BLKDEV)
        return -ENXIO;
    if (odmontowujemy korzen glownego systemu plikow) { /* bedziemy przemontowywac */
                                                        /* tylko do odczytu */
        if (nie mozna pobrac superbloku)
            return -ENOENT;
        if (system plikow nie jest zamontowany tylko do odczytu) {
            wylacz wszystkie rodzaje quoty;
            synchronizuj urzadzenie;
            zmien flagi superbloku danego systemu plikow; /* porownaj z mount() */
            zmien flagi superbloku;
            znajdz odpowiednia pozycje w tablicy montowania;
            zmien flagi w strukturze vfsmount;
            synchronizuj urzadzenie;
        }
        return 0;
    }
    if (nie mozna pobrac superbloku)
        return -ENOENT;
    wylacz wszystkie rodzaje quoty;
    if (ktos uzywa systemu plikow)
        return -EBUSY;
    przypisz NULL na punkt zamontowania i korzen systemu plikow w strukturze superblock;
    zsynchronizuj bufory zajmowane przez superblok danego systemu plikow;
    zwolnij bufory zajmowane przez superblok danego systemu plikow;
    usun odpowiedznia strukture z listy vfsmnt;
    synchronizuj urzadzenie;
    if (odmontowujemy wirtualny system plikow)
        zwolnij pozycje w tablicy unnamed_dev_in_use;
    synchronizuj urzadzenie;
    return 0;
}
W opisie funkcji pominiete zostaly operacje zwalniania i-wezla i strony w przestrzeni adresowej jadra.

Bibliografia

  1. Maurice J. Bach: Budowa systemu operacyjnego UNIX
  2. Pliki zrodlowe Linuxa:
  3. Manual do funkcji systemowej umount() (man 2 mount)

Pytania i odpowiedzi

Jesli chcesz zadac mi jakies pytanie musisz wyslac do mnie e-mail.

1. Jakie struktury danych znalezione w plikach zrodlowych sa najwazniejsze?

Patrz opis struktur danych funkcji systemowej mount().

2. Jakie sa (w tej konkretnej wersji Linuxa) ograniczenia na rozne zasoby systemowe?

Znalazlem dwa istotne ograniczenia:

3. Jakie pliki zrodlowe byly wykorzystane przy opracowaniu tematu?

Patrz bibliografia funkcji systemowej mount().

4. Jakie rozwiazania programistyczne znalezione w plikach zrodlowych sa najciekawsze?

Po pierwsze ciekawym pomyslem jest uzycie zmiennej mru_vfsmnt, ktora przechowuje ostatni system plikow, na ktorym byla wykonywana jakas operacja. Przy przegladaniu listy zamontowanych systemow plikow, przed korzystaniem z listy vfsmntlist najpierw sprawdzana jest ta zmienna.
Druga ciekawostka jest przekazywanie do funkcji do_umount() parametru calkowitego unmount_root przyjmujacago dla zwyklego odmontowywania systemu plikow wartosci 0. Oznacza to, ze jesli ktos (np. administrator systemu) wykona funkcje umount("/"), to jest to rownowazne wykonaniu funkcji mount() z ustawionymi flagami MS_RDONLY i MS_REMOUNT. Parametr ten przyjmuje wartosc 1 przy wywolywaniu z funkcji change_root.


Autor: Pawel Kot