/*
* linux: 4.5.2
*/
#include <linux/module.h>
#include <linux/blkdev.h>
#include <linux/vmalloc.h>
#define BLKDEV_NAME "test_blkdev"
#define GENDISK_NAME "test_gendisk"
#define NSECTORS 1024
#define RAMDISK_MINORS 1
struct ramdisk_dev {
struct gendisk *gd;
unsigned char *data;
};
static blk_qc_t ramdisk_make_request(struct request_queue *q, struct bio *bio)
{
struct ramdisk_dev *dev = q->queuedata;
struct bio_vec bvec;
struct bvec_iter iter;
unsigned long byte_offset = bio->bi_iter.bi_sector << 9; // !!!!!!
bio_for_each_segment(bvec, bio, iter) {
unsigned char * const buffer = __bio_kmap_atomic(bio, iter);
unsigned long const cur_bv_len = bio_cur_bytes(bio); // can be divided by 512
if (byte_offset + cur_bv_len > (NSECTORS << 9)) {
printk (KERN_NOTICE "Beyond-end r/w (%ld %ld)\n", byte_offset, cur_bv_len);
goto err_b