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 przypadkuArgumentem 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
.