umount()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.
umount() uzywa takich struktur danych jak funkcja
mount().
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.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.
fs/super.c
umount()
unnamed_dev_in_use
include/linux/fs.h
file_system_type
super_block
include/linux/mount.h
vfsmount
umount()
(man 2 mount)
mount().
unnamed_dev_in_use ma rozmiar 8 (256/(8*sizeof(unsigned int))).
super_blocks wynosi 64.
mount().
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.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.