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.