blktrans.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Copyright © 2003-2010 David Woodhouse <[email protected]>
  4. */
  5. #ifndef __MTD_TRANS_H__
  6. #define __MTD_TRANS_H__
  7. #include <linux/mutex.h>
  8. #include <linux/kref.h>
  9. #include <linux/sysfs.h>
  10. struct hd_geometry;
  11. struct mtd_info;
  12. struct mtd_blktrans_ops;
  13. struct file;
  14. struct inode;
  15. struct mtd_blktrans_dev {
  16. struct mtd_blktrans_ops *tr;
  17. struct list_head list;
  18. struct mtd_info *mtd;
  19. struct mutex lock;
  20. int devnum;
  21. bool bg_stop;
  22. unsigned long size;
  23. int readonly;
  24. int open;
  25. struct kref ref;
  26. struct gendisk *disk;
  27. struct attribute_group *disk_attributes;
  28. struct request_queue *rq;
  29. struct list_head rq_list;
  30. struct blk_mq_tag_set *tag_set;
  31. spinlock_t queue_lock;
  32. void *priv;
  33. fmode_t file_mode;
  34. };
  35. struct mtd_blktrans_ops {
  36. char *name;
  37. int major;
  38. int part_bits;
  39. int blksize;
  40. int blkshift;
  41. /* Access functions */
  42. int (*readsect)(struct mtd_blktrans_dev *dev,
  43. unsigned long block, char *buffer);
  44. int (*writesect)(struct mtd_blktrans_dev *dev,
  45. unsigned long block, char *buffer);
  46. int (*discard)(struct mtd_blktrans_dev *dev,
  47. unsigned long block, unsigned nr_blocks);
  48. void (*background)(struct mtd_blktrans_dev *dev);
  49. /* Block layer ioctls */
  50. int (*getgeo)(struct mtd_blktrans_dev *dev, struct hd_geometry *geo);
  51. int (*flush)(struct mtd_blktrans_dev *dev);
  52. /* Called with mtd_table_mutex held; no race with add/remove */
  53. int (*open)(struct mtd_blktrans_dev *dev);
  54. void (*release)(struct mtd_blktrans_dev *dev);
  55. /* Called on {de,}registration and on subsequent addition/removal
  56. of devices, with mtd_table_mutex held. */
  57. void (*add_mtd)(struct mtd_blktrans_ops *tr, struct mtd_info *mtd);
  58. void (*remove_dev)(struct mtd_blktrans_dev *dev);
  59. struct list_head devs;
  60. struct list_head list;
  61. struct module *owner;
  62. };
  63. extern int register_mtd_blktrans(struct mtd_blktrans_ops *tr);
  64. extern int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr);
  65. extern int add_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
  66. extern int del_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
  67. extern int mtd_blktrans_cease_background(struct mtd_blktrans_dev *dev);
  68. /**
  69. * module_mtd_blktrans() - Helper macro for registering a mtd blktrans driver
  70. * @__mtd_blktrans: mtd_blktrans_ops struct
  71. *
  72. * Helper macro for mtd blktrans drivers which do not do anything special in
  73. * module init/exit. This eliminates a lot of boilerplate. Each module may only
  74. * use this macro once, and calling it replaces module_init() and module_exit()
  75. */
  76. #define module_mtd_blktrans(__mtd_blktrans) \
  77. module_driver(__mtd_blktrans, register_mtd_blktrans, \
  78. deregister_mtd_blktrans)
  79. #endif /* __MTD_TRANS_H__ */