blkdev.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _LINUX_BLKDEV_H
  2. #define _LINUX_BLKDEV_H
  3. #include <linux/major.h>
  4. #include <linux/sched.h>
  5. #include <linux/genhd.h>
  6. #include <linux/tqueue.h>
  7. #include <linux/list.h>
  8. struct request_queue;
  9. typedef struct request_queue request_queue_t;
  10. struct elevator_s;
  11. typedef struct elevator_s elevator_t;
  12. /*
  13.  * Ok, this is an expanded form so that we can use the same
  14.  * request for paging requests.
  15.  */
  16. struct request {
  17. struct list_head queue;
  18. int elevator_sequence;
  19. volatile int rq_status; /* should split this into a few status bits */
  20. #define RQ_INACTIVE (-1)
  21. #define RQ_ACTIVE 1
  22. #define RQ_SCSI_BUSY 0xffff
  23. #define RQ_SCSI_DONE 0xfffe
  24. #define RQ_SCSI_DISCONNECTING 0xffe0
  25. kdev_t rq_dev;
  26. int cmd; /* READ or WRITE */
  27. int errors;
  28. unsigned long sector;
  29. unsigned long nr_sectors;
  30. unsigned long hard_sector, hard_nr_sectors;
  31. unsigned int nr_segments;
  32. unsigned int nr_hw_segments;
  33. unsigned long current_nr_sectors;
  34. void * special;
  35. char * buffer;
  36. struct completion * waiting;
  37. struct buffer_head * bh;
  38. struct buffer_head * bhtail;
  39. request_queue_t *q;
  40. };
  41. #include <linux/elevator.h>
  42. typedef int (merge_request_fn) (request_queue_t *q, 
  43. struct request  *req,
  44. struct buffer_head *bh,
  45. int);
  46. typedef int (merge_requests_fn) (request_queue_t *q, 
  47.  struct request  *req,
  48.  struct request  *req2,
  49.  int);
  50. typedef void (request_fn_proc) (request_queue_t *q);
  51. typedef request_queue_t * (queue_proc) (kdev_t dev);
  52. typedef int (make_request_fn) (request_queue_t *q, int rw, struct buffer_head *bh);
  53. typedef void (plug_device_fn) (request_queue_t *q, kdev_t device);
  54. typedef void (unplug_device_fn) (void *q);
  55. /*
  56.  * Default nr free requests per queue, ll_rw_blk will scale it down
  57.  * according to available RAM at init time
  58.  */
  59. #define QUEUE_NR_REQUESTS 8192
  60. struct request_list {
  61. unsigned int count;
  62. struct list_head free;
  63. };
  64. struct request_queue
  65. {
  66. /*
  67.  * the queue request freelist, one for reads and one for writes
  68.  */
  69. struct request_list rq[2];
  70. /*
  71.  * Together with queue_head for cacheline sharing
  72.  */
  73. struct list_head queue_head;
  74. elevator_t elevator;
  75. request_fn_proc * request_fn;
  76. merge_request_fn * back_merge_fn;
  77. merge_request_fn * front_merge_fn;
  78. merge_requests_fn * merge_requests_fn;
  79. make_request_fn * make_request_fn;
  80. plug_device_fn * plug_device_fn;
  81. /*
  82.  * The queue owner gets to use this for whatever they like.
  83.  * ll_rw_blk doesn't touch it.
  84.  */
  85. void * queuedata;
  86. /*
  87.  * This is used to remove the plug when tq_disk runs.
  88.  */
  89. struct tq_struct plug_tq;
  90. /*
  91.  * Boolean that indicates whether this queue is plugged or not.
  92.  */
  93. char plugged;
  94. /*
  95.  * Boolean that indicates whether current_request is active or
  96.  * not.
  97.  */
  98. char head_active;
  99. /*
  100.  * Is meant to protect the queue in the future instead of
  101.  * io_request_lock
  102.  */
  103. spinlock_t queue_lock;
  104. /*
  105.  * Tasks wait here for free request
  106.  */
  107. wait_queue_head_t wait_for_request;
  108. };
  109. struct blk_dev_struct {
  110. /*
  111.  * queue_proc has to be atomic
  112.  */
  113. request_queue_t request_queue;
  114. queue_proc *queue;
  115. void *data;
  116. };
  117. struct sec_size {
  118. unsigned block_size;
  119. unsigned block_size_bits;
  120. };
  121. /*
  122.  * Used to indicate the default queue for drivers that don't bother
  123.  * to implement multiple queues.  We have this access macro here
  124.  * so as to eliminate the need for each and every block device
  125.  * driver to know about the internal structure of blk_dev[].
  126.  */
  127. #define BLK_DEFAULT_QUEUE(_MAJOR)  &blk_dev[_MAJOR].request_queue
  128. extern struct sec_size * blk_sec[MAX_BLKDEV];
  129. extern struct blk_dev_struct blk_dev[MAX_BLKDEV];
  130. extern void grok_partitions(struct gendisk *dev, int drive, unsigned minors, long size);
  131. extern void register_disk(struct gendisk *dev, kdev_t first, unsigned minors, struct block_device_operations *ops, long size);
  132. extern void generic_make_request(int rw, struct buffer_head * bh);
  133. extern inline request_queue_t *blk_get_queue(kdev_t dev);
  134. extern void blkdev_release_request(struct request *);
  135. /*
  136.  * Access functions for manipulating queue properties
  137.  */
  138. extern void blk_init_queue(request_queue_t *, request_fn_proc *);
  139. extern void blk_cleanup_queue(request_queue_t *);
  140. extern void blk_queue_headactive(request_queue_t *, int);
  141. extern void blk_queue_make_request(request_queue_t *, make_request_fn *);
  142. extern void generic_unplug_device(void *);
  143. extern int * blk_size[MAX_BLKDEV];
  144. extern int * blksize_size[MAX_BLKDEV];
  145. extern int * hardsect_size[MAX_BLKDEV];
  146. extern int * max_readahead[MAX_BLKDEV];
  147. extern int * max_sectors[MAX_BLKDEV];
  148. extern int * max_segments[MAX_BLKDEV];
  149. #define MAX_SEGMENTS 128
  150. #define MAX_SECTORS 255
  151. #define PageAlignSize(size) (((size) + PAGE_SIZE -1) & PAGE_MASK)
  152. #define blkdev_entry_to_request(entry) list_entry((entry), struct request, queue)
  153. #define blkdev_entry_next_request(entry) blkdev_entry_to_request((entry)->next)
  154. #define blkdev_entry_prev_request(entry) blkdev_entry_to_request((entry)->prev)
  155. #define blkdev_next_request(req) blkdev_entry_to_request((req)->queue.next)
  156. #define blkdev_prev_request(req) blkdev_entry_to_request((req)->queue.prev)
  157. extern void drive_stat_acct (kdev_t dev, int rw,
  158. unsigned long nr_sectors, int new_io);
  159. static inline int get_hardsect_size(kdev_t dev)
  160. {
  161. int retval = 512;
  162. int major = MAJOR(dev);
  163. if (hardsect_size[major]) {
  164. int minor = MINOR(dev);
  165. if (hardsect_size[major][minor])
  166. retval = hardsect_size[major][minor];
  167. }
  168. return retval;
  169. }
  170. #define blk_finished_io(nsects) do { } while (0)
  171. #define blk_started_io(nsects) do { } while (0)
  172. static inline unsigned int blksize_bits(unsigned int size)
  173. {
  174. unsigned int bits = 8;
  175. do {
  176. bits++;
  177. size >>= 1;
  178. } while (size > 256);
  179. return bits;
  180. }
  181. static inline unsigned int block_size(kdev_t dev)
  182. {
  183. int retval = BLOCK_SIZE;
  184. int major = MAJOR(dev);
  185. if (blksize_size[major]) {
  186. int minor = MINOR(dev);
  187. if (blksize_size[major][minor])
  188. retval = blksize_size[major][minor];
  189. }
  190. return retval;
  191. }
  192. #endif