diff options
Diffstat (limited to 'include/linux/blkdev.h')
| -rw-r--r-- | include/linux/blkdev.h | 105 |
1 files changed, 69 insertions, 36 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index a92d9e4ea96..7035cec583b 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -26,7 +26,6 @@ struct scsi_ioctl_command; | |||
| 26 | 26 | ||
| 27 | struct request_queue; | 27 | struct request_queue; |
| 28 | struct elevator_queue; | 28 | struct elevator_queue; |
| 29 | typedef struct elevator_queue elevator_t; | ||
| 30 | struct request_pm_state; | 29 | struct request_pm_state; |
| 31 | struct blk_trace; | 30 | struct blk_trace; |
| 32 | struct request; | 31 | struct request; |
| @@ -87,7 +86,9 @@ enum { | |||
| 87 | */ | 86 | */ |
| 88 | enum rq_flag_bits { | 87 | enum rq_flag_bits { |
| 89 | __REQ_RW, /* not set, read. set, write */ | 88 | __REQ_RW, /* not set, read. set, write */ |
| 90 | __REQ_FAILFAST, /* no low level driver retries */ | 89 | __REQ_FAILFAST_DEV, /* no driver retries of device errors */ |
| 90 | __REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */ | ||
| 91 | __REQ_FAILFAST_DRIVER, /* no driver retries of driver errors */ | ||
| 91 | __REQ_DISCARD, /* request to discard sectors */ | 92 | __REQ_DISCARD, /* request to discard sectors */ |
| 92 | __REQ_SORTED, /* elevator knows about this request */ | 93 | __REQ_SORTED, /* elevator knows about this request */ |
| 93 | __REQ_SOFTBARRIER, /* may not be passed by ioscheduler */ | 94 | __REQ_SOFTBARRIER, /* may not be passed by ioscheduler */ |
| @@ -111,8 +112,10 @@ enum rq_flag_bits { | |||
| 111 | }; | 112 | }; |
| 112 | 113 | ||
| 113 | #define REQ_RW (1 << __REQ_RW) | 114 | #define REQ_RW (1 << __REQ_RW) |
| 115 | #define REQ_FAILFAST_DEV (1 << __REQ_FAILFAST_DEV) | ||
| 116 | #define REQ_FAILFAST_TRANSPORT (1 << __REQ_FAILFAST_TRANSPORT) | ||
| 117 | #define REQ_FAILFAST_DRIVER (1 << __REQ_FAILFAST_DRIVER) | ||
| 114 | #define REQ_DISCARD (1 << __REQ_DISCARD) | 118 | #define REQ_DISCARD (1 << __REQ_DISCARD) |
| 115 | #define REQ_FAILFAST (1 << __REQ_FAILFAST) | ||
| 116 | #define REQ_SORTED (1 << __REQ_SORTED) | 119 | #define REQ_SORTED (1 << __REQ_SORTED) |
| 117 | #define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER) | 120 | #define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER) |
| 118 | #define REQ_HARDBARRIER (1 << __REQ_HARDBARRIER) | 121 | #define REQ_HARDBARRIER (1 << __REQ_HARDBARRIER) |
| @@ -309,7 +312,7 @@ struct request_queue | |||
| 309 | */ | 312 | */ |
| 310 | struct list_head queue_head; | 313 | struct list_head queue_head; |
| 311 | struct request *last_merge; | 314 | struct request *last_merge; |
| 312 | elevator_t *elevator; | 315 | struct elevator_queue *elevator; |
| 313 | 316 | ||
| 314 | /* | 317 | /* |
| 315 | * the queue request freelist, one for reads and one for writes | 318 | * the queue request freelist, one for reads and one for writes |
| @@ -445,6 +448,7 @@ struct request_queue | |||
| 445 | #define QUEUE_FLAG_FAIL_IO 12 /* fake timeout */ | 448 | #define QUEUE_FLAG_FAIL_IO 12 /* fake timeout */ |
| 446 | #define QUEUE_FLAG_STACKABLE 13 /* supports request stacking */ | 449 | #define QUEUE_FLAG_STACKABLE 13 /* supports request stacking */ |
| 447 | #define QUEUE_FLAG_NONROT 14 /* non-rotational device (SSD) */ | 450 | #define QUEUE_FLAG_NONROT 14 /* non-rotational device (SSD) */ |
| 451 | #define QUEUE_FLAG_VIRT QUEUE_FLAG_NONROT /* paravirt device */ | ||
| 448 | 452 | ||
| 449 | static inline int queue_is_locked(struct request_queue *q) | 453 | static inline int queue_is_locked(struct request_queue *q) |
| 450 | { | 454 | { |
| @@ -518,22 +522,32 @@ enum { | |||
| 518 | * TAG_FLUSH : ordering by tag w/ pre and post flushes | 522 | * TAG_FLUSH : ordering by tag w/ pre and post flushes |
| 519 | * TAG_FUA : ordering by tag w/ pre flush and FUA write | 523 | * TAG_FUA : ordering by tag w/ pre flush and FUA write |
| 520 | */ | 524 | */ |
| 521 | QUEUE_ORDERED_NONE = 0x00, | 525 | QUEUE_ORDERED_BY_DRAIN = 0x01, |
| 522 | QUEUE_ORDERED_DRAIN = 0x01, | 526 | QUEUE_ORDERED_BY_TAG = 0x02, |
| 523 | QUEUE_ORDERED_TAG = 0x02, | 527 | QUEUE_ORDERED_DO_PREFLUSH = 0x10, |
| 524 | 528 | QUEUE_ORDERED_DO_BAR = 0x20, | |
| 525 | QUEUE_ORDERED_PREFLUSH = 0x10, | 529 | QUEUE_ORDERED_DO_POSTFLUSH = 0x40, |
| 526 | QUEUE_ORDERED_POSTFLUSH = 0x20, | 530 | QUEUE_ORDERED_DO_FUA = 0x80, |
| 527 | QUEUE_ORDERED_FUA = 0x40, | 531 | |
| 528 | 532 | QUEUE_ORDERED_NONE = 0x00, | |
| 529 | QUEUE_ORDERED_DRAIN_FLUSH = QUEUE_ORDERED_DRAIN | | 533 | |
| 530 | QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_POSTFLUSH, | 534 | QUEUE_ORDERED_DRAIN = QUEUE_ORDERED_BY_DRAIN | |
| 531 | QUEUE_ORDERED_DRAIN_FUA = QUEUE_ORDERED_DRAIN | | 535 | QUEUE_ORDERED_DO_BAR, |
| 532 | QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_FUA, | 536 | QUEUE_ORDERED_DRAIN_FLUSH = QUEUE_ORDERED_DRAIN | |
| 533 | QUEUE_ORDERED_TAG_FLUSH = QUEUE_ORDERED_TAG | | 537 | QUEUE_ORDERED_DO_PREFLUSH | |
| 534 | QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_POSTFLUSH, | 538 | QUEUE_ORDERED_DO_POSTFLUSH, |
| 535 | QUEUE_ORDERED_TAG_FUA = QUEUE_ORDERED_TAG | | 539 | QUEUE_ORDERED_DRAIN_FUA = QUEUE_ORDERED_DRAIN | |
| 536 | QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_FUA, | 540 | QUEUE_ORDERED_DO_PREFLUSH | |
| 541 | QUEUE_ORDERED_DO_FUA, | ||
| 542 | |||
| 543 | QUEUE_ORDERED_TAG = QUEUE_ORDERED_BY_TAG | | ||
| 544 | QUEUE_ORDERED_DO_BAR, | ||
| 545 | QUEUE_ORDERED_TAG_FLUSH = QUEUE_ORDERED_TAG | | ||
| 546 | QUEUE_ORDERED_DO_PREFLUSH | | ||
| 547 | QUEUE_ORDERED_DO_POSTFLUSH, | ||
| 548 | QUEUE_ORDERED_TAG_FUA = QUEUE_ORDERED_TAG | | ||
| 549 | QUEUE_ORDERED_DO_PREFLUSH | | ||
| 550 | QUEUE_ORDERED_DO_FUA, | ||
| 537 | 551 | ||
| 538 | /* | 552 | /* |
| 539 | * Ordered operation sequence | 553 | * Ordered operation sequence |
| @@ -560,7 +574,12 @@ enum { | |||
| 560 | #define blk_special_request(rq) ((rq)->cmd_type == REQ_TYPE_SPECIAL) | 574 | #define blk_special_request(rq) ((rq)->cmd_type == REQ_TYPE_SPECIAL) |
| 561 | #define blk_sense_request(rq) ((rq)->cmd_type == REQ_TYPE_SENSE) | 575 | #define blk_sense_request(rq) ((rq)->cmd_type == REQ_TYPE_SENSE) |
| 562 | 576 | ||
| 563 | #define blk_noretry_request(rq) ((rq)->cmd_flags & REQ_FAILFAST) | 577 | #define blk_failfast_dev(rq) ((rq)->cmd_flags & REQ_FAILFAST_DEV) |
| 578 | #define blk_failfast_transport(rq) ((rq)->cmd_flags & REQ_FAILFAST_TRANSPORT) | ||
| 579 | #define blk_failfast_driver(rq) ((rq)->cmd_flags & REQ_FAILFAST_DRIVER) | ||
| 580 | #define blk_noretry_request(rq) (blk_failfast_dev(rq) || \ | ||
| 581 | blk_failfast_transport(rq) || \ | ||
| 582 | blk_failfast_driver(rq)) | ||
| 564 | #define blk_rq_started(rq) ((rq)->cmd_flags & REQ_STARTED) | 583 | #define blk_rq_started(rq) ((rq)->cmd_flags & REQ_STARTED) |
| 565 | 584 | ||
| 566 | #define blk_account_rq(rq) (blk_rq_started(rq) && (blk_fs_request(rq) || blk_discard_rq(rq))) | 585 | #define blk_account_rq(rq) (blk_rq_started(rq) && (blk_fs_request(rq) || blk_discard_rq(rq))) |
| @@ -576,7 +595,6 @@ enum { | |||
| 576 | #define blk_fua_rq(rq) ((rq)->cmd_flags & REQ_FUA) | 595 | #define blk_fua_rq(rq) ((rq)->cmd_flags & REQ_FUA) |
| 577 | #define blk_discard_rq(rq) ((rq)->cmd_flags & REQ_DISCARD) | 596 | #define blk_discard_rq(rq) ((rq)->cmd_flags & REQ_DISCARD) |
| 578 | #define blk_bidi_rq(rq) ((rq)->next_rq != NULL) | 597 | #define blk_bidi_rq(rq) ((rq)->next_rq != NULL) |
| 579 | #define blk_empty_barrier(rq) (blk_barrier_rq(rq) && blk_fs_request(rq) && !(rq)->hard_nr_sectors) | ||
| 580 | /* rq->queuelist of dequeued request must be list_empty() */ | 598 | /* rq->queuelist of dequeued request must be list_empty() */ |
| 581 | #define blk_queued_rq(rq) (!list_empty(&(rq)->queuelist)) | 599 | #define blk_queued_rq(rq) (!list_empty(&(rq)->queuelist)) |
| 582 | 600 | ||
| @@ -653,6 +671,7 @@ extern unsigned long blk_max_low_pfn, blk_max_pfn; | |||
| 653 | * default timeout for SG_IO if none specified | 671 | * default timeout for SG_IO if none specified |
| 654 | */ | 672 | */ |
| 655 | #define BLK_DEFAULT_SG_TIMEOUT (60 * HZ) | 673 | #define BLK_DEFAULT_SG_TIMEOUT (60 * HZ) |
| 674 | #define BLK_MIN_SG_TIMEOUT (7 * HZ) | ||
| 656 | 675 | ||
| 657 | #ifdef CONFIG_BOUNCE | 676 | #ifdef CONFIG_BOUNCE |
| 658 | extern int init_emergency_isa_pool(void); | 677 | extern int init_emergency_isa_pool(void); |
| @@ -708,10 +727,10 @@ extern void blk_plug_device(struct request_queue *); | |||
| 708 | extern void blk_plug_device_unlocked(struct request_queue *); | 727 | extern void blk_plug_device_unlocked(struct request_queue *); |
| 709 | extern int blk_remove_plug(struct request_queue *); | 728 | extern int blk_remove_plug(struct request_queue *); |
| 710 | extern void blk_recount_segments(struct request_queue *, struct bio *); | 729 | extern void blk_recount_segments(struct request_queue *, struct bio *); |
| 711 | extern int scsi_cmd_ioctl(struct file *, struct request_queue *, | 730 | extern int scsi_cmd_ioctl(struct request_queue *, struct gendisk *, fmode_t, |
| 712 | struct gendisk *, unsigned int, void __user *); | 731 | unsigned int, void __user *); |
| 713 | extern int sg_scsi_ioctl(struct file *, struct request_queue *, | 732 | extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t, |
| 714 | struct gendisk *, struct scsi_ioctl_command __user *); | 733 | struct scsi_ioctl_command __user *); |
| 715 | 734 | ||
| 716 | /* | 735 | /* |
| 717 | * Temporary export, until SCSI gets fixed up. | 736 | * Temporary export, until SCSI gets fixed up. |
| @@ -777,6 +796,8 @@ static inline void blk_run_address_space(struct address_space *mapping) | |||
| 777 | blk_run_backing_dev(mapping->backing_dev_info, NULL); | 796 | blk_run_backing_dev(mapping->backing_dev_info, NULL); |
| 778 | } | 797 | } |
| 779 | 798 | ||
| 799 | extern void blkdev_dequeue_request(struct request *req); | ||
| 800 | |||
| 780 | /* | 801 | /* |
| 781 | * blk_end_request() and friends. | 802 | * blk_end_request() and friends. |
| 782 | * __blk_end_request() and end_request() must be called with | 803 | * __blk_end_request() and end_request() must be called with |
| @@ -811,11 +832,6 @@ extern void blk_update_request(struct request *rq, int error, | |||
| 811 | extern unsigned int blk_rq_bytes(struct request *rq); | 832 | extern unsigned int blk_rq_bytes(struct request *rq); |
| 812 | extern unsigned int blk_rq_cur_bytes(struct request *rq); | 833 | extern unsigned int blk_rq_cur_bytes(struct request *rq); |
| 813 | 834 | ||
| 814 | static inline void blkdev_dequeue_request(struct request *req) | ||
| 815 | { | ||
| 816 | elv_dequeue_request(req->q, req); | ||
| 817 | } | ||
| 818 | |||
| 819 | /* | 835 | /* |
| 820 | * Access functions for manipulating queue properties | 836 | * Access functions for manipulating queue properties |
| 821 | */ | 837 | */ |
| @@ -848,15 +864,14 @@ extern void blk_queue_rq_timed_out(struct request_queue *, rq_timed_out_fn *); | |||
| 848 | extern void blk_queue_rq_timeout(struct request_queue *, unsigned int); | 864 | extern void blk_queue_rq_timeout(struct request_queue *, unsigned int); |
| 849 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); | 865 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); |
| 850 | extern int blk_queue_ordered(struct request_queue *, unsigned, prepare_flush_fn *); | 866 | extern int blk_queue_ordered(struct request_queue *, unsigned, prepare_flush_fn *); |
| 851 | extern int blk_do_ordered(struct request_queue *, struct request **); | 867 | extern bool blk_do_ordered(struct request_queue *, struct request **); |
| 852 | extern unsigned blk_ordered_cur_seq(struct request_queue *); | 868 | extern unsigned blk_ordered_cur_seq(struct request_queue *); |
| 853 | extern unsigned blk_ordered_req_seq(struct request *); | 869 | extern unsigned blk_ordered_req_seq(struct request *); |
| 854 | extern void blk_ordered_complete_seq(struct request_queue *, unsigned, int); | 870 | extern bool blk_ordered_complete_seq(struct request_queue *, unsigned, int); |
| 855 | 871 | ||
| 856 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); | 872 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); |
| 857 | extern void blk_dump_rq_flags(struct request *, char *); | 873 | extern void blk_dump_rq_flags(struct request *, char *); |
| 858 | extern void generic_unplug_device(struct request_queue *); | 874 | extern void generic_unplug_device(struct request_queue *); |
| 859 | extern void __generic_unplug_device(struct request_queue *); | ||
| 860 | extern long nr_blockdev_pages(void); | 875 | extern long nr_blockdev_pages(void); |
| 861 | 876 | ||
| 862 | int blk_get_queue(struct request_queue *); | 877 | int blk_get_queue(struct request_queue *); |
| @@ -902,7 +917,8 @@ static inline int sb_issue_discard(struct super_block *sb, | |||
| 902 | * command filter functions | 917 | * command filter functions |
| 903 | */ | 918 | */ |
| 904 | extern int blk_verify_command(struct blk_cmd_filter *filter, | 919 | extern int blk_verify_command(struct blk_cmd_filter *filter, |
| 905 | unsigned char *cmd, int has_write_perm); | 920 | unsigned char *cmd, fmode_t has_write_perm); |
| 921 | extern void blk_unregister_filter(struct gendisk *disk); | ||
| 906 | extern void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter); | 922 | extern void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter); |
| 907 | 923 | ||
| 908 | #define MAX_PHYS_SEGMENTS 128 | 924 | #define MAX_PHYS_SEGMENTS 128 |
| @@ -912,6 +928,8 @@ extern void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter); | |||
| 912 | 928 | ||
| 913 | #define MAX_SEGMENT_SIZE 65536 | 929 | #define MAX_SEGMENT_SIZE 65536 |
| 914 | 930 | ||
| 931 | #define BLK_SEG_BOUNDARY_MASK 0xFFFFFFFFUL | ||
| 932 | |||
| 915 | #define blkdev_entry_to_request(entry) list_entry((entry), struct request, queuelist) | 933 | #define blkdev_entry_to_request(entry) list_entry((entry), struct request, queuelist) |
| 916 | 934 | ||
| 917 | static inline int queue_hardsect_size(struct request_queue *q) | 935 | static inline int queue_hardsect_size(struct request_queue *q) |
| @@ -968,7 +986,6 @@ static inline void put_dev_sector(Sector p) | |||
| 968 | 986 | ||
| 969 | struct work_struct; | 987 | struct work_struct; |
| 970 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); | 988 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); |
| 971 | void kblockd_flush_work(struct work_struct *work); | ||
| 972 | 989 | ||
| 973 | #define MODULE_ALIAS_BLOCKDEV(major,minor) \ | 990 | #define MODULE_ALIAS_BLOCKDEV(major,minor) \ |
| 974 | MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) | 991 | MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) |
| @@ -1048,6 +1065,22 @@ static inline int blk_integrity_rq(struct request *rq) | |||
| 1048 | 1065 | ||
| 1049 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ | 1066 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ |
| 1050 | 1067 | ||
| 1068 | struct block_device_operations { | ||
| 1069 | int (*open) (struct block_device *, fmode_t); | ||
| 1070 | int (*release) (struct gendisk *, fmode_t); | ||
| 1071 | int (*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | ||
| 1072 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | ||
| 1073 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | ||
| 1074 | int (*direct_access) (struct block_device *, sector_t, | ||
| 1075 | void **, unsigned long *); | ||
| 1076 | int (*media_changed) (struct gendisk *); | ||
| 1077 | int (*revalidate_disk) (struct gendisk *); | ||
| 1078 | int (*getgeo)(struct block_device *, struct hd_geometry *); | ||
| 1079 | struct module *owner; | ||
| 1080 | }; | ||
| 1081 | |||
| 1082 | extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int, | ||
| 1083 | unsigned long); | ||
| 1051 | #else /* CONFIG_BLOCK */ | 1084 | #else /* CONFIG_BLOCK */ |
| 1052 | /* | 1085 | /* |
| 1053 | * stubs for when the block layer is configured out | 1086 | * stubs for when the block layer is configured out |
