Untitled

 avatar
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...