Do spisu tresci tematu 6

6.14.2 Funkcja Unlink()




Spis tresci


Wywolanie

int unlink(sciezka)
   char *sciezka;    /* nazwa pliku

/* W przypadku powodzenia zwraca 0, bledu -1 */

Informacje ogolne

Funkcja systemowa unlink usuwa dowiazanie do pliku z katalogu oraz zmniejsza o jeden licznik dowiazan do tego pliku przechowywany w i-wezle.
Jesli w rezultacie tej operacji licznik przyjmie wartosc zero, to zostanie usuniety rowniez sam plik. Oznacza to udostepnienie zajmowanej przez niego przestrzeni dyskowej innym plikom (dodanie jej do listy wolnych blokow) oraz zwolnienie samego i-wezla.
Jezeli licznik dowiazan osiagnie wartosc zero, podczas gdy dany plik jest nadal uzywany (tzn. otwarty) przez inny proces, to usuniecie pliku bedzie wstrzymywane do czasu jego zamkniecia.



Struktury danych


Wprowadzenie

Glowna struktura danych na ktorej dokonywane sa operacje dla funkcji unlink jest sturktura i-wezla (inode).


Struktura inode (przypomnienie)

Oto dokladna definicja struktury inode z pliku include/linux/fs.h:

struct inode {
	kdev_t		i_dev;
	unsigned long	i_ino;
	umode_t		i_mode;
	nlink_t		i_nlink;
	uid_t		i_uid;
	gid_t		i_gid;
	kdev_t		i_rdev;
	off_t		i_size;
	time_t		i_atime;
	time_t		i_mtime;
	time_t		i_ctime;
	unsigned long	i_blksize;
	unsigned long	i_blocks;
	unsigned long	i_version;
	unsigned long	i_nrpages;
	struct semaphore i_sem;
	struct inode_operations *i_op;
	struct super_block *i_sb;
	struct wait_queue *i_wait;
	struct file_lock *i_flock;
	struct vm_area_struct *i_mmap;
	struct page *i_pages;
	struct dquot *i_dquot[MAXQUOTAS];
	struct inode *i_next, *i_prev;
	struct inode *i_hash_next, *i_hash_prev;
	struct inode *i_bound_to, *i_bound_by;
	struct inode *i_mount;
	unsigned short i_count;
	unsigned short i_flags;
	unsigned char i_lock;
	unsigned char i_dirt;
	unsigned char i_pipe;
	unsigned char i_sock;
	unsigned char i_seek;
	unsigned char i_update;
	unsigned short i_writecount;
	union {
		struct pipe_inode_info pipe_i;
		struct minix_inode_info minix_i;
		struct ext_inode_info ext_i;
		struct ext2_inode_info ext2_i;
		struct hpfs_inode_info hpfs_i;
		struct msdos_inode_info msdos_i;
		struct umsdos_inode_info umsdos_i;
		struct iso_inode_info isofs_i;
		struct nfs_inode_info nfs_i;
		struct xiafs_inode_info xiafs_i;
		struct sysv_inode_info sysv_i;
		struct affs_inode_info affs_i;
		struct ufs_inode_info ufs_i;
		struct socket socket_i;
		void * generic_ip;
	} u;
};


Implementacja


Wprowadzenie

Kod zrodlowy tej funkcji znajduje sie w pliku linux/fs/namei.c, a czesc zalezaca bezposrednio od konkretnego systemu plikow w jednym z podkatalogow w katalogu lunux/fs. Opisany nizej algorytm opiera sie na systemie plikow ext2. I algorytm jest zdefiniowany w pliku linux/fs/ext2/namei.c.
Procedura sys_unlink (opisana ponizej) jest wykonywana w trybie jadra systemu.

Funkcja sys_unlink()

DEFINICJA: asmlinkage int sys_unlink(pathname)
              const char *pathname;

    WYNIK: 0 w przypadku sukcesu, -1 wpp.

{
 Kopiuj plik do wolnej przestrzeni adresowej jadra;
 Wywolaj funkcje do_unlink();
 Zwolnij zarezerwowane strony przestrzeni jadra systemu;
}

Funkcja do_unlink()

DEFINICJA: int do_unlink(name)
              const char *name;

    WYNIK: 0 w przypadku sukcesu, -1 wpp.

{
 Zwroc i-wezel katalogu macierzystego danego pliku(dir_namei);
 Sprawdz czy plik nie jest tylko do odczyty(IS_RDONLY);
 Sprawdz czy w katalogu jest prawo do pisania(MAY_WRITE)
    i wykonywania(MAY_EXEC);
 Sprawdz czy i-wezel katalogu moze byc modyfikowany(IS_APPEND);
 Sprawdz czy dostepna jest operacja unlink;
 Wywolaj funkcje charakterystyczna dla systemu plikow
    (w naszym przypadku ext2_unlink);
}

Funkcja ext2_unlink()

DEFINICJA: int ext2_unlink(dir, name, len)
              struct inode *dir;
              const char *name;
              int len;

    WYNIK: 0 w przypadku sukcesu, -1 wpp.

{
 Powtarzaj:
   Znajdz plik o poszukiwanej nazwie i zwroc bufor;
   Pobierz i-wezel katalogu macierzystego znalezionego pliku;
   Sprawdz czy katalog lub urzytkownik ma prawo do usuniecia dowiazania;
   Sprawdz czy mozna modyfikowac i-wezel lub czy jest modyfikowany
     jezeli tak zwroc blad;
 Jezeli i-wezel katalogu znalezionego pliku jest rozny
   od i-wezla katalogu macierzystego szukanego pliku to wroc do Powtarzaj
 
 Sprawdz czy jezeli urzytkownik bierzacy nie ma praw do usuniecia 
   dowiazania i urzytkownik nie jest superurzytkownikiem, to czy 
   jest wlascicielem pliku lub katalogu macirzystego;
 Usun dane o pliku z tablicy plikow;
 Zapisz informacje z bufora na plik i czekaj az operacja sie zakonczy;
 Zmien czas zmian w i-wezle katalogu bierzacym;
 Zmien czas zmian w i-wezle pliku na ustalony wczesniej dla katalogu;
 Zwolnij bufor;
 Zwolnij i-wezel pliku;
 Zwolnij i-wezel katalogu;
}


Bibliografia

  1. Pliki zrodlowe Linuxa:
  2. Bach J.M., Budowa systemu operacyjnego Unix
  3. Rochkind M.J., Programowanie w systemie Unix dla zaawansowanych


Pytania i odpowiedzi

Prosze kierowac pytania pod moim adresem dotyczace danego tematu na ktore postaram sie odpowiedziec. Odpowiedzi prosze szukac wlasnie w tym miejscu.


Autor: Piotr Kawczynski