Untitled
unknown
plain_text
2 years ago
2.0 kB
6
Indexable
#include<linux/module.h> #include <linux/fs.h> #include <linux/genhd.h> #include <linux/blkdev.h> #include<linux/vmalloc.h> #define NAZWA "mojblok" #define LICZBA_SEKTOROW 1000 static int numer_gl = 0; static int numer_pod = 1; /* Deklaracja struktur opisujących urządzenie */ static struct gendisk *moj_disk; static struct request_queue *moj_queue; static struct block_device_operations moj_fops; static void moj_request(struct request_queue *q) { struct request *rq; while((rq = blk_fetch_request(q)) != NULL) { //kod do obsługi żądania __blk_end_request_all(rq, 0); } } static int __init blok_init(void) { int statn; numer_gl = register_blkdev(numer_gl, NAZWA); if (numer_gl < 0) { pr_alert("blad przydzialu numeru"); return -EBUSY; } pr_info("Numer dla urzadzenia: %d\n",numer_gl); /* Alokacja pamięci dla struktur opisujących urządzenie */ moj_disk = alloc_disk(numer_pod); moj_queue = blk_init_queue(moj_request,NULL); if(!moj_disk || !moj_queue){ pr_alert("Blad alokacji pamieci"); return -ENOMEM; } /* Inicjalizacja struktur opisujących urządzenie */ moj_disk->major = numer_gl; moj_disk->first_minor = 0; moj_disk->fops = &moj_fops; moj_disk->queue = moj_queue; moj_disk->private_data = NULL; sprintf(moj_disk->disk_name, "mojblok%d", 0); set_capacity(moj_disk, LICZBA_SEKTOROW); add_disk(moj_disk); return 0; } static void __exit blok_exit(void) { /* Zwalnianie pamięci i usuwanie urządzenia */ del_gendisk(moj_disk); put_disk(moj_disk); blk_cleanup_queue(moj_queue); unregister_blkdev(numer_gl, NAZWA); } module_init(blok_init); module_exit(blok_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("A.Ch."); MODULE_DESCRIPTION("Urzadzenie blokowe."); MODULE_VERSION("0.057");
Editor is loading...