void init_special_inode(struct inode *inode, umode_t mode, int rdev) { inode->i_mode = mode; if (S_ISCHR(mode)) { // urządzenie znakowe inode->i_fop = &def_chr_fops; inode->i_rdev = to_kdev_t(rdev); inode->i_cdev = cdget(rdev); } else if (S_ISBLK(mode)) { // urządzenie blokowe inode->i_fop = &def_blk_fops; inode->i_rdev = to_kdev_t(rdev); inode->i_bdev = bdget(rdev); } else if (S_ISFIFO(mode)) // kolejka fifo inode->i_fop = &def_fifo_fops; else if (S_ISSOCK(mode)) // socket inode->i_fop = &bad_sock_fops; else printk(KERN_DEBUG "init_special_inode: bogus imode (%o)\n", mode); }
Zadaniem funkcji jest inicjalizacja części pól w strukturze inode odpowiedzialnych za późniejszą obsługę pliku, czyli:
struct block_device *bdget(dev_t dev) struct char_device *cdget(dev_t dev)
Algorytmy cdget i bdget mają za zadanie odszukanie struktury
opisującej urządzenie na podstawie jego numeru głównego i podrzędnego
(zapisanych w dev_t dev). Do tego celu używają tablic hashujących
bdev_hashtable
[4]i cdev_hashtable.
Jeśli w pamięci nie ma jeszcze
struktury dla odpowiedniego urządzenia, jest ona tworzona i inicjalizowana
domyślymi wartościami. Numer hashowania obliczany jest na podstawie numeru
głównego i podrzędnego urządzenia.