#include #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME "block_dev" #define MAJOR_NUM 100 MODULE_LICENSE("GPL"); atomic_t Device_Open = ATOMIC_INIT(0); struct block_dev { struct request_queue *queue ; spinlock_t lock; }; struct block_dev *dev; static void bdd_request(request_queue_t *q) { struct request *req; int write ; while ((req = elv_next_request(q)) != NULL) { if (! blk_fs_request(req)) { printk (KERN_ALERT "Skip non-fs request\n"); end_request(req, 0); continue; } write=rq_data_dir(req); if(write==0) printk(KERN_ALERT "Reading Device ....."); else printk(KERN_ALERT "Writing Device ....."); end_request(req, 1); } } static int device_open(struct inode *inode, struct file *file) { printk(KERN_ALERT "OPENING DEVICE.....\n"); atomic_inc(&Device_Open); try_module_get(THIS_MODULE); return 0; } static int device_release(struct inode *inode, struct file *file) { printk(KERN_ALERT "RELEASING DEVICE....\n"); atomic_dec(&Device_Open); module_put(THIS_MODULE); return 0; } static struct block_device_operations bdd_ops = { .open = device_open, .release = device_release, }; static int init_function(void) { int ret_val; dev = (struct block_dev*)kmalloc(sizeof(struct block_dev),GFP_KERNEL); ret_val=register_blkdev(MAJOR_NUM,DEVICE_NAME); if(ret_val<0) { printk(KERN_ALERT "Sorry, registering the block device"); return ret_val; } printk(KERN_ALERT "Initialization\n"); dev->queue=blk_init_queue(bdd_request,&dev->lock); return 0; } static void exit_function(void) { int ret_val; ret_val=unregister_blkdev(MAJOR_NUM,DEVICE_NAME); printk(KERN_ALERT "Exit\n"); if(ret_val<0) { printk(KERN_ALERT "Sorry, Error in Unregistering the block device"); } } module_init(init_function); module_exit(exit_function);