Advertisement
Regazi

Untitled

Jun 21st, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. #include<linux/module.h>
  2. #include<linux/genhd.h>
  3. #include<linux/vmalloc.h>
  4. #include<linux/fs.h>
  5. #include<linux/bio.h>
  6. #include<linux/blkdev.h>
  7.  
  8. static unsigned long mem = 4*1024*1024
  9. ;
  10.  
  11. module_param(mem,long,0644);
  12. MODULE_PARM_DESC(mem,"parameter");
  13.  
  14. static int sector_size = 512;
  15. static int major = 0;
  16. static struct sbd_struct
  17. {
  18. struct gendisk *gd;
  19. void *memory;
  20. } sbd_dev;
  21.  
  22. static inline int transfer_single_bio(struct bio *bio)
  23. {
  24. struct bvec_iter iter;
  25. struct bio_vec vector;
  26. sector_t sector = bio->bi_iter.bi_sector;
  27. bool wirte = bio_data_dir(bio) == WRITE;
  28.  
  29. bio_for_each_segment(vector,bio,iter) {
  30. unsigned int len = vector.bv_len;
  31. void *addr = kmap(vector.bv_page);
  32. if(wirte)
  33. memcpy(sbd_dev.memory+sector*sector_size,addr+vector.bv_offset,len);
  34. else
  35. memcpy(addr+vector.bv_offset,sbd_dev.memory+sector*sector_size,len);
  36. kunmap(addr);
  37. sector += len >> 9;
  38. }
  39. return 0;
  40. }
  41.  
  42. static blk_qc_t make_request(struct request_queue *q, struct bio *bio)
  43. {
  44. int result=0;
  45.  
  46. if(bio_end_sector(bio)>get_capacity(bio->bi_bdev->bd_disk))
  47. goto mrerr0;
  48.  
  49. result = transfer_single_bio(bio);
  50. if(unlikely(result!=0))
  51. goto mrerr0;
  52.  
  53. bio_endio(bio);
  54. return BLK_QC_T_NONE;
  55. mrerr0:
  56. bio_io_error(bio);
  57. return BLK_QC_T_NONE;
  58. }
  59.  
  60. static struct block_device_operations block_methods = {
  61. .owner = THIS_MODULE
  62. };
  63.  
  64.  
  65. static int __init sbd_constructor(void)
  66. {
  67. pr_info("mem= %ld \n",mem);
  68. sbd_dev.memory = vmalloc(mem);
  69. if(!sbd_dev.memory) {
  70. pr_alert("Memory allocation error!\n");
  71. goto ier1;
  72. }
  73. sbd_dev.gd = alloc_disk(1);
  74. if(!sbd_dev.gd) {
  75. pr_alert("General disk structure allocation error!\n");
  76. goto ier2;
  77. }
  78. major = register_blkdev(major,"sbd");
  79. if(major<=0) {
  80. pr_alert("Major number allocation error!\n");
  81. goto ier3;
  82. }
  83. pr_info("[sbd] Major number allocated: %d.\n",major);
  84. sbd_dev.gd->major = major;
  85. sbd_dev.gd->first_minor = 0;
  86. sbd_dev.gd->fops = &block_methods;
  87. sbd_dev.gd->private_data = NULL;
  88. sbd_dev.gd->flags|=GENHD_FL_SUPPRESS_PARTITION_INFO;
  89. strcpy(sbd_dev.gd->disk_name,"sbd");
  90. set_capacity(sbd_dev.gd,(mem)>>9);
  91. sbd_dev.gd->queue = blk_alloc_queue(GFP_KERNEL);
  92. if(!sbd_dev.gd->queue) {
  93. pr_alert("Request queue allocation error!\n");
  94. goto ier4;
  95. }
  96. blk_queue_make_request(sbd_dev.gd->queue,make_request);
  97. pr_info("[sbd] Gendisk initialized.\n");
  98. add_disk(sbd_dev.gd);
  99. return 0;
  100. ier4:
  101. unregister_blkdev(major,"sbd");
  102. ier3:
  103. put_disk(sbd_dev.gd);
  104. ier2:
  105. vfree(sbd_dev.memory);
  106. ier1:
  107. return -ENOMEM;
  108. }
  109.  
  110. static void __exit sbd_desctructor(void)
  111. {
  112. del_gendisk(sbd_dev.gd);
  113. blk_cleanup_queue(sbd_dev.gd->queue);
  114. unregister_blkdev(major,"sbd");
  115. put_disk(sbd_dev.gd);
  116. vfree(sbd_dev.memory);
  117. }
  118.  
  119. module_init(sbd_constructor);
  120. module_exit(sbd_desctructor);
  121.  
  122. MODULE_LICENSE("GPL");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement