Untitled
unknown
plain_text
3 years ago
2.0 kB
11
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...