aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/blkdev.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/blkdev.h')
-rw-r--r--include/linux/blkdev.h105
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
27struct request_queue; 27struct request_queue;
28struct elevator_queue; 28struct elevator_queue;
29typedef struct elevator_queue elevator_t;
30struct request_pm_state; 29struct request_pm_state;
31struct blk_trace; 30struct blk_trace;
32struct request; 31struct request;
@@ -87,7 +86,9 @@ enum {
87 */ 86 */
88enum rq_flag_bits { 87enum 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
449static inline int queue_is_locked(struct request_queue *q) 453static 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
658extern int init_emergency_isa_pool(void); 677extern int init_emergency_isa_pool(void);
@@ -708,10 +727,10 @@ extern void blk_plug_device(struct request_queue *);
708extern void blk_plug_device_unlocked(struct request_queue *); 727extern void blk_plug_device_unlocked(struct request_queue *);
709extern int blk_remove_plug(struct request_queue *); 728extern int blk_remove_plug(struct request_queue *);
710extern void blk_recount_segments(struct request_queue *, struct bio *); 729extern void blk_recount_segments(struct request_queue *, struct bio *);
711extern int scsi_cmd_ioctl(struct file *, struct request_queue *, 730extern int scsi_cmd_ioctl(struct request_queue *, struct gendisk *, fmode_t,
712 struct gendisk *, unsigned int, void __user *); 731 unsigned int, void __user *);
713extern int sg_scsi_ioctl(struct file *, struct request_queue *, 732extern 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
799extern 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,
811extern unsigned int blk_rq_bytes(struct request *rq); 832extern unsigned int blk_rq_bytes(struct request *rq);
812extern unsigned int blk_rq_cur_bytes(struct request *rq); 833extern unsigned int blk_rq_cur_bytes(struct request *rq);
813 834
814static 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 *);
848extern void blk_queue_rq_timeout(struct request_queue *, unsigned int); 864extern void blk_queue_rq_timeout(struct request_queue *, unsigned int);
849extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); 865extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev);
850extern int blk_queue_ordered(struct request_queue *, unsigned, prepare_flush_fn *); 866extern int blk_queue_ordered(struct request_queue *, unsigned, prepare_flush_fn *);
851extern int blk_do_ordered(struct request_queue *, struct request **); 867extern bool blk_do_ordered(struct request_queue *, struct request **);
852extern unsigned blk_ordered_cur_seq(struct request_queue *); 868extern unsigned blk_ordered_cur_seq(struct request_queue *);
853extern unsigned blk_ordered_req_seq(struct request *); 869extern unsigned blk_ordered_req_seq(struct request *);
854extern void blk_ordered_complete_seq(struct request_queue *, unsigned, int); 870extern bool blk_ordered_complete_seq(struct request_queue *, unsigned, int);
855 871
856extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); 872extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *);
857extern void blk_dump_rq_flags(struct request *, char *); 873extern void blk_dump_rq_flags(struct request *, char *);
858extern void generic_unplug_device(struct request_queue *); 874extern void generic_unplug_device(struct request_queue *);
859extern void __generic_unplug_device(struct request_queue *);
860extern long nr_blockdev_pages(void); 875extern long nr_blockdev_pages(void);
861 876
862int blk_get_queue(struct request_queue *); 877int 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*/
904extern int blk_verify_command(struct blk_cmd_filter *filter, 919extern 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);
921extern void blk_unregister_filter(struct gendisk *disk);
906extern void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter); 922extern 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
917static inline int queue_hardsect_size(struct request_queue *q) 935static inline int queue_hardsect_size(struct request_queue *q)
@@ -968,7 +986,6 @@ static inline void put_dev_sector(Sector p)
968 986
969struct work_struct; 987struct work_struct;
970int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); 988int kblockd_schedule_work(struct request_queue *q, struct work_struct *work);
971void 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
1068struct 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
1082extern 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