blk.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:10k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _BLK_H
  2. #define _BLK_H
  3. #include <linux/blkdev.h>
  4. #include <linux/locks.h>
  5. #include <linux/config.h>
  6. #include <linux/spinlock.h>
  7. /*
  8.  * Spinlock for protecting the request queue which
  9.  * is mucked around with in interrupts on potentially
  10.  * multiple CPU's..
  11.  */
  12. extern spinlock_t io_request_lock;
  13. /*
  14.  * Initialization functions.
  15.  */
  16. extern int isp16_init(void);
  17. extern int cdu31a_init(void);
  18. extern int acsi_init(void);
  19. extern int mcd_init(void);
  20. extern int mcdx_init(void);
  21. extern int sbpcd_init(void);
  22. extern int aztcd_init(void);
  23. extern int sony535_init(void);
  24. extern int gscd_init(void);
  25. extern int cm206_init(void);
  26. extern int optcd_init(void);
  27. extern int sjcd_init(void);
  28. extern int cdi_init(void);
  29. extern int hd_init(void);
  30. extern int ide_init(void);
  31. extern int xd_init(void);
  32. extern int mfm_init(void);
  33. extern int loop_init(void);
  34. extern int md_init(void);
  35. extern int ap_init(void);
  36. extern int ddv_init(void);
  37. extern int z2_init(void);
  38. extern int swim3_init(void);
  39. extern int swimiop_init(void);
  40. extern int amiga_floppy_init(void);
  41. extern int atari_floppy_init(void);
  42. extern int ez_init(void);
  43. extern int bpcd_init(void);
  44. extern int ps2esdi_init(void);
  45. extern int jsfd_init(void);
  46. extern int viodasd_init(void);
  47. extern int viocd_init(void);
  48. #if defined(CONFIG_ARCH_S390)
  49. extern int dasd_init(void);
  50. extern int xpram_init(void);
  51. extern int tapeblock_init(void);
  52. #endif /* CONFIG_ARCH_S390 */
  53. extern void set_device_ro(kdev_t dev,int flag);
  54. void add_blkdev_randomness(int major);
  55. extern int floppy_init(void);
  56. extern int rd_doload; /* 1 = load ramdisk, 0 = don't load */
  57. extern int rd_prompt; /* 1 = prompt for ramdisk, 0 = don't prompt */
  58. extern int rd_image_start; /* starting block # of image */
  59. #ifdef CONFIG_BLK_DEV_INITRD
  60. #define INITRD_MINOR 250 /* shouldn't collide with /dev/ram* too soon ... */
  61. extern unsigned long initrd_start,initrd_end;
  62. extern int initrd_below_start_ok; /* 1 if it is not an error if initrd_start < memory_start */
  63. void initrd_init(void);
  64. #endif
  65.  
  66. /*
  67.  * end_request() and friends. Must be called with the request queue spinlock
  68.  * acquired. All functions called within end_request() _must_be_ atomic.
  69.  *
  70.  * Several drivers define their own end_request and call
  71.  * end_that_request_first() and end_that_request_last()
  72.  * for parts of the original function. This prevents
  73.  * code duplication in drivers.
  74.  */
  75. static inline void blkdev_dequeue_request(struct request * req)
  76. {
  77. list_del(&req->queue);
  78. }
  79. int end_that_request_first(struct request *req, int uptodate, char *name);
  80. void end_that_request_last(struct request *req);
  81. #if defined(MAJOR_NR) || defined(IDE_DRIVER)
  82. #undef DEVICE_ON
  83. #undef DEVICE_OFF
  84. /*
  85.  * Add entries as needed.
  86.  */
  87. #ifdef IDE_DRIVER
  88. #define DEVICE_NR(device) (MINOR(device) >> PARTN_BITS)
  89. #define DEVICE_NAME "ide"
  90. #elif (MAJOR_NR == RAMDISK_MAJOR)
  91. /* ram disk */
  92. #define DEVICE_NAME "ramdisk"
  93. #define DEVICE_NR(device) (MINOR(device))
  94. #define DEVICE_NO_RANDOM
  95. #elif (MAJOR_NR == Z2RAM_MAJOR)
  96. /* Zorro II Ram */
  97. #define DEVICE_NAME "Z2RAM"
  98. #define DEVICE_REQUEST do_z2_request
  99. #define DEVICE_NR(device) (MINOR(device))
  100. #elif (MAJOR_NR == FLOPPY_MAJOR)
  101. static void floppy_off(unsigned int nr);
  102. #define DEVICE_NAME "floppy"
  103. #define DEVICE_INTR do_floppy
  104. #define DEVICE_REQUEST do_fd_request
  105. #define DEVICE_NR(device) ( (MINOR(device) & 3) | ((MINOR(device) & 0x80 ) >> 5 ))
  106. #define DEVICE_OFF(device) floppy_off(DEVICE_NR(device))
  107. #elif (MAJOR_NR == HD_MAJOR)
  108. /* Hard disk:  timeout is 6 seconds. */
  109. #define DEVICE_NAME "hard disk"
  110. #define DEVICE_INTR do_hd
  111. #define TIMEOUT_VALUE (6*HZ)
  112. #define DEVICE_REQUEST do_hd_request
  113. #define DEVICE_NR(device) (MINOR(device)>>6)
  114. #elif (SCSI_DISK_MAJOR(MAJOR_NR))
  115. #define DEVICE_NAME "scsidisk"
  116. #define TIMEOUT_VALUE (2*HZ)
  117. #define DEVICE_NR(device) (((MAJOR(device) & SD_MAJOR_MASK) << (8 - 4)) + (MINOR(device) >> 4))
  118. /* Kludge to use the same number for both char and block major numbers */
  119. #elif  (MAJOR_NR == MD_MAJOR) && defined(MD_DRIVER)
  120. #define DEVICE_NAME "Multiple devices driver"
  121. #define DEVICE_REQUEST do_md_request
  122. #define DEVICE_NR(device) (MINOR(device))
  123. #elif (MAJOR_NR == SCSI_TAPE_MAJOR)
  124. #define DEVICE_NAME "scsitape"
  125. #define DEVICE_INTR do_st  
  126. #define DEVICE_NR(device) (MINOR(device) & 0x7f)
  127. #elif (MAJOR_NR == OSST_MAJOR)
  128. #define DEVICE_NAME "onstream" 
  129. #define DEVICE_INTR do_osst
  130. #define DEVICE_NR(device) (MINOR(device) & 0x7f) 
  131. #define DEVICE_ON(device) 
  132. #define DEVICE_OFF(device) 
  133. #elif (MAJOR_NR == SCSI_CDROM_MAJOR)
  134. #define DEVICE_NAME "CD-ROM"
  135. #define DEVICE_NR(device) (MINOR(device))
  136. #elif (MAJOR_NR == XT_DISK_MAJOR)
  137. #define DEVICE_NAME "xt disk"
  138. #define DEVICE_REQUEST do_xd_request
  139. #define DEVICE_NR(device) (MINOR(device) >> 6)
  140. #elif (MAJOR_NR == PS2ESDI_MAJOR)
  141. #define DEVICE_NAME "PS/2 ESDI"
  142. #define DEVICE_REQUEST do_ps2esdi_request
  143. #define DEVICE_NR(device) (MINOR(device) >> 6)
  144. #elif (MAJOR_NR == CDU31A_CDROM_MAJOR)
  145. #define DEVICE_NAME "CDU31A"
  146. #define DEVICE_REQUEST do_cdu31a_request
  147. #define DEVICE_NR(device) (MINOR(device))
  148. #elif (MAJOR_NR == ACSI_MAJOR) && (defined(CONFIG_ATARI_ACSI) || defined(CONFIG_ATARI_ACSI_MODULE))
  149. #define DEVICE_NAME "ACSI"
  150. #define DEVICE_INTR do_acsi
  151. #define DEVICE_REQUEST do_acsi_request
  152. #define DEVICE_NR(device) (MINOR(device) >> 4)
  153. #elif (MAJOR_NR == MITSUMI_CDROM_MAJOR)
  154. #define DEVICE_NAME "Mitsumi CD-ROM"
  155. /* #define DEVICE_INTR do_mcd */
  156. #define DEVICE_REQUEST do_mcd_request
  157. #define DEVICE_NR(device) (MINOR(device))
  158. #elif (MAJOR_NR == MITSUMI_X_CDROM_MAJOR)
  159. #define DEVICE_NAME "Mitsumi CD-ROM"
  160. /* #define DEVICE_INTR do_mcdx */
  161. #define DEVICE_REQUEST do_mcdx_request
  162. #define DEVICE_NR(device) (MINOR(device))
  163. #elif (MAJOR_NR == MATSUSHITA_CDROM_MAJOR)
  164. #define DEVICE_NAME "Matsushita CD-ROM controller #1"
  165. #define DEVICE_REQUEST do_sbpcd_request
  166. #define DEVICE_NR(device) (MINOR(device))
  167. #elif (MAJOR_NR == MATSUSHITA_CDROM2_MAJOR)
  168. #define DEVICE_NAME "Matsushita CD-ROM controller #2"
  169. #define DEVICE_REQUEST do_sbpcd2_request
  170. #define DEVICE_NR(device) (MINOR(device))
  171. #elif (MAJOR_NR == MATSUSHITA_CDROM3_MAJOR)
  172. #define DEVICE_NAME "Matsushita CD-ROM controller #3"
  173. #define DEVICE_REQUEST do_sbpcd3_request
  174. #define DEVICE_NR(device) (MINOR(device))
  175. #elif (MAJOR_NR == MATSUSHITA_CDROM4_MAJOR)
  176. #define DEVICE_NAME "Matsushita CD-ROM controller #4"
  177. #define DEVICE_REQUEST do_sbpcd4_request
  178. #define DEVICE_NR(device) (MINOR(device))
  179. #elif (MAJOR_NR == AZTECH_CDROM_MAJOR)
  180. #define DEVICE_NAME "Aztech CD-ROM"
  181. #define DEVICE_REQUEST do_aztcd_request
  182. #define DEVICE_NR(device) (MINOR(device))
  183. #elif (MAJOR_NR == CDU535_CDROM_MAJOR)
  184. #define DEVICE_NAME "SONY-CDU535"
  185. #define DEVICE_INTR do_cdu535
  186. #define DEVICE_REQUEST do_cdu535_request
  187. #define DEVICE_NR(device) (MINOR(device))
  188. #elif (MAJOR_NR == GOLDSTAR_CDROM_MAJOR)
  189. #define DEVICE_NAME "Goldstar R420"
  190. #define DEVICE_REQUEST do_gscd_request
  191. #define DEVICE_NR(device) (MINOR(device))
  192. #elif (MAJOR_NR == CM206_CDROM_MAJOR)
  193. #define DEVICE_NAME "Philips/LMS CD-ROM cm206"
  194. #define DEVICE_REQUEST do_cm206_request
  195. #define DEVICE_NR(device) (MINOR(device))
  196. #elif (MAJOR_NR == OPTICS_CDROM_MAJOR)
  197. #define DEVICE_NAME "DOLPHIN 8000AT CD-ROM"
  198. #define DEVICE_REQUEST do_optcd_request
  199. #define DEVICE_NR(device) (MINOR(device))
  200. #elif (MAJOR_NR == SANYO_CDROM_MAJOR)
  201. #define DEVICE_NAME "Sanyo H94A CD-ROM"
  202. #define DEVICE_REQUEST do_sjcd_request
  203. #define DEVICE_NR(device) (MINOR(device))
  204. #elif (MAJOR_NR == APBLOCK_MAJOR)
  205. #define DEVICE_NAME "apblock"
  206. #define DEVICE_REQUEST ap_request
  207. #define DEVICE_NR(device) (MINOR(device))
  208. #elif (MAJOR_NR == DDV_MAJOR)
  209. #define DEVICE_NAME "ddv"
  210. #define DEVICE_REQUEST ddv_request
  211. #define DEVICE_NR(device) (MINOR(device)>>PARTN_BITS)
  212. #elif (MAJOR_NR == MFM_ACORN_MAJOR)
  213. #define DEVICE_NAME "mfm disk"
  214. #define DEVICE_INTR do_mfm
  215. #define DEVICE_REQUEST do_mfm_request
  216. #define DEVICE_NR(device) (MINOR(device) >> 6)
  217. #elif (MAJOR_NR == NBD_MAJOR)
  218. #define DEVICE_NAME "nbd"
  219. #define DEVICE_REQUEST do_nbd_request
  220. #define DEVICE_NR(device) (MINOR(device))
  221. #elif (MAJOR_NR == MDISK_MAJOR)
  222. #define DEVICE_NAME "mdisk"
  223. #define DEVICE_REQUEST mdisk_request
  224. #define DEVICE_NR(device) (MINOR(device))
  225. #elif (MAJOR_NR == DASD_MAJOR)
  226. #define DEVICE_NAME "dasd"
  227. #define DEVICE_REQUEST do_dasd_request
  228. #define DEVICE_NR(device) (MINOR(device) >> PARTN_BITS)
  229. #elif (MAJOR_NR == I2O_MAJOR)
  230. #define DEVICE_NAME "I2O block"
  231. #define DEVICE_REQUEST i2ob_request
  232. #define DEVICE_NR(device) (MINOR(device)>>4)
  233. #elif (MAJOR_NR == COMPAQ_SMART2_MAJOR)
  234. #define DEVICE_NAME "ida"
  235. #define TIMEOUT_VALUE (25*HZ)
  236. #define DEVICE_REQUEST do_ida_request
  237. #define DEVICE_NR(device) (MINOR(device) >> 4)
  238. #endif /* MAJOR_NR == whatever */
  239. /* provide DEVICE_xxx defaults, if not explicitly defined
  240.  * above in the MAJOR_NR==xxx if-elif tree */
  241. #ifndef DEVICE_ON
  242. #define DEVICE_ON(device) do {} while (0)
  243. #endif
  244. #ifndef DEVICE_OFF
  245. #define DEVICE_OFF(device) do {} while (0)
  246. #endif
  247. #if (MAJOR_NR != SCSI_TAPE_MAJOR) && (MAJOR_NR != OSST_MAJOR)
  248. #if !defined(IDE_DRIVER)
  249. #ifndef CURRENT
  250. #define CURRENT blkdev_entry_next_request(&blk_dev[MAJOR_NR].request_queue.queue_head)
  251. #endif
  252. #ifndef QUEUE_EMPTY
  253. #define QUEUE_EMPTY list_empty(&blk_dev[MAJOR_NR].request_queue.queue_head)
  254. #endif
  255. #ifndef DEVICE_NAME
  256. #define DEVICE_NAME "unknown"
  257. #endif
  258. #define CURRENT_DEV DEVICE_NR(CURRENT->rq_dev)
  259. #ifdef DEVICE_INTR
  260. static void (*DEVICE_INTR)(void) = NULL;
  261. #endif
  262. #define SET_INTR(x) (DEVICE_INTR = (x))
  263. #ifdef DEVICE_REQUEST
  264. static void (DEVICE_REQUEST)(request_queue_t *);
  265. #endif 
  266.   
  267. #ifdef DEVICE_INTR
  268. #define CLEAR_INTR SET_INTR(NULL)
  269. #else
  270. #define CLEAR_INTR
  271. #endif
  272. #define INIT_REQUEST 
  273. if (QUEUE_EMPTY) {
  274. CLEAR_INTR; 
  275. return; 
  276. if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) 
  277. panic(DEVICE_NAME ": request list destroyed"); 
  278. if (CURRENT->bh) { 
  279. if (!buffer_locked(CURRENT->bh)) 
  280. panic(DEVICE_NAME ": block not locked"); 
  281. }
  282. #endif /* !defined(IDE_DRIVER) */
  283. #ifndef LOCAL_END_REQUEST /* If we have our own end_request, we do not want to include this mess */
  284. #if ! SCSI_BLK_MAJOR(MAJOR_NR) && (MAJOR_NR != COMPAQ_SMART2_MAJOR)
  285. static inline void end_request(int uptodate) {
  286. struct request *req = CURRENT;
  287. if (end_that_request_first(req, uptodate, DEVICE_NAME))
  288. return;
  289. #ifndef DEVICE_NO_RANDOM
  290. add_blkdev_randomness(MAJOR(req->rq_dev));
  291. #endif
  292. DEVICE_OFF(req->rq_dev);
  293. blkdev_dequeue_request(req);
  294. end_that_request_last(req);
  295. }
  296. #endif /* ! SCSI_BLK_MAJOR(MAJOR_NR) */
  297. #endif /* LOCAL_END_REQUEST */
  298. #endif /* (MAJOR_NR != SCSI_TAPE_MAJOR) */
  299. #endif /* defined(MAJOR_NR) || defined(IDE_DRIVER) */
  300. #endif /* _BLK_H */