aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-16 13:50:19 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-16 13:50:19 -0400
commite245befce7af0a1e1347079ed62695b059594bd4 (patch)
tree08270a503c8945b4e6ba142728dc289de2b55542 /include
parent14dc5249728ff699b1ca4dac01ad416a350a147a (diff)
parent58ff411e0d21592565ac9ab34f33a434f26e018b (diff)
Merge branch 'bsg' of git://git.kernel.dk/data/git/linux-2.6-block
* 'bsg' of git://git.kernel.dk/data/git/linux-2.6-block: (25 commits) bsg: Kconfig updates bsg: add SCSI transport-level request support bsg: add bidi support add a struct request pointer to the request structure bsg: fix the deadlock on discarding done commands bsg: fix a blocking read bug bsg: minor bug fixes improve bsg device allocation bind bsg to all SCSI devices bsg: bind bsg to request_queue instead of gendisk bsg: add a request_queue argument to scsi_cmd_ioctl() bsg: simplify __bsg_alloc_command failpath bsg: add cheasy error checks for sysfs stuff Add queue resizing support Replace s32, u32 and u64 with __s32, __u32 and __u64 in bsg.h for userspace bsg: silence a bogus gcc warning bsg: style cleanup bsg: use u32 etc instead of uint32_t bsg: add SG_IO to SG v4 bsg: replace SG v3 with SG v4 ...
Diffstat (limited to 'include')
-rw-r--r--include/linux/blkdev.h26
-rw-r--r--include/linux/bsg.h70
2 files changed, 95 insertions, 1 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index fae138bd2207..b32564a1e105 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -14,6 +14,7 @@
14#include <linux/bio.h> 14#include <linux/bio.h>
15#include <linux/module.h> 15#include <linux/module.h>
16#include <linux/stringify.h> 16#include <linux/stringify.h>
17#include <linux/bsg.h>
17 18
18#include <asm/scatterlist.h> 19#include <asm/scatterlist.h>
19 20
@@ -41,6 +42,8 @@ struct elevator_queue;
41typedef struct elevator_queue elevator_t; 42typedef struct elevator_queue elevator_t;
42struct request_pm_state; 43struct request_pm_state;
43struct blk_trace; 44struct blk_trace;
45struct request;
46struct sg_io_hdr;
44 47
45#define BLKDEV_MIN_RQ 4 48#define BLKDEV_MIN_RQ 4
46#define BLKDEV_MAX_RQ 128 /* Default maximum */ 49#define BLKDEV_MAX_RQ 128 /* Default maximum */
@@ -314,6 +317,9 @@ struct request {
314 */ 317 */
315 rq_end_io_fn *end_io; 318 rq_end_io_fn *end_io;
316 void *end_io_data; 319 void *end_io_data;
320
321 /* for bidi */
322 struct request *next_rq;
317}; 323};
318 324
319/* 325/*
@@ -468,6 +474,10 @@ struct request_queue
468 unsigned int bi_size; 474 unsigned int bi_size;
469 475
470 struct mutex sysfs_lock; 476 struct mutex sysfs_lock;
477
478#if defined(CONFIG_BLK_DEV_BSG)
479 struct bsg_class_device bsg_dev;
480#endif
471}; 481};
472 482
473#define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */ 483#define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */
@@ -479,6 +489,7 @@ struct request_queue
479#define QUEUE_FLAG_REENTER 6 /* Re-entrancy avoidance */ 489#define QUEUE_FLAG_REENTER 6 /* Re-entrancy avoidance */
480#define QUEUE_FLAG_PLUGGED 7 /* queue is plugged */ 490#define QUEUE_FLAG_PLUGGED 7 /* queue is plugged */
481#define QUEUE_FLAG_ELVSWITCH 8 /* don't use elevator, just do FIFO */ 491#define QUEUE_FLAG_ELVSWITCH 8 /* don't use elevator, just do FIFO */
492#define QUEUE_FLAG_BIDI 9 /* queue supports bidi requests */
482 493
483enum { 494enum {
484 /* 495 /*
@@ -543,6 +554,7 @@ enum {
543#define blk_sorted_rq(rq) ((rq)->cmd_flags & REQ_SORTED) 554#define blk_sorted_rq(rq) ((rq)->cmd_flags & REQ_SORTED)
544#define blk_barrier_rq(rq) ((rq)->cmd_flags & REQ_HARDBARRIER) 555#define blk_barrier_rq(rq) ((rq)->cmd_flags & REQ_HARDBARRIER)
545#define blk_fua_rq(rq) ((rq)->cmd_flags & REQ_FUA) 556#define blk_fua_rq(rq) ((rq)->cmd_flags & REQ_FUA)
557#define blk_bidi_rq(rq) ((rq)->next_rq != NULL)
546 558
547#define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist) 559#define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist)
548 560
@@ -607,6 +619,11 @@ extern unsigned long blk_max_low_pfn, blk_max_pfn;
607#define BLK_BOUNCE_ANY ((u64)blk_max_pfn << PAGE_SHIFT) 619#define BLK_BOUNCE_ANY ((u64)blk_max_pfn << PAGE_SHIFT)
608#define BLK_BOUNCE_ISA (ISA_DMA_THRESHOLD) 620#define BLK_BOUNCE_ISA (ISA_DMA_THRESHOLD)
609 621
622/*
623 * default timeout for SG_IO if none specified
624 */
625#define BLK_DEFAULT_SG_TIMEOUT (60 * HZ)
626
610#ifdef CONFIG_MMU 627#ifdef CONFIG_MMU
611extern int init_emergency_isa_pool(void); 628extern int init_emergency_isa_pool(void);
612extern void blk_queue_bounce(request_queue_t *q, struct bio **bio); 629extern void blk_queue_bounce(request_queue_t *q, struct bio **bio);
@@ -637,7 +654,8 @@ extern void blk_requeue_request(request_queue_t *, struct request *);
637extern void blk_plug_device(request_queue_t *); 654extern void blk_plug_device(request_queue_t *);
638extern int blk_remove_plug(request_queue_t *); 655extern int blk_remove_plug(request_queue_t *);
639extern void blk_recount_segments(request_queue_t *, struct bio *); 656extern void blk_recount_segments(request_queue_t *, struct bio *);
640extern int scsi_cmd_ioctl(struct file *, struct gendisk *, unsigned int, void __user *); 657extern int scsi_cmd_ioctl(struct file *, struct request_queue *,
658 struct gendisk *, unsigned int, void __user *);
641extern int sg_scsi_ioctl(struct file *, struct request_queue *, 659extern int sg_scsi_ioctl(struct file *, struct request_queue *,
642 struct gendisk *, struct scsi_ioctl_command __user *); 660 struct gendisk *, struct scsi_ioctl_command __user *);
643 661
@@ -680,6 +698,12 @@ extern int blk_execute_rq(request_queue_t *, struct gendisk *,
680 struct request *, int); 698 struct request *, int);
681extern void blk_execute_rq_nowait(request_queue_t *, struct gendisk *, 699extern void blk_execute_rq_nowait(request_queue_t *, struct gendisk *,
682 struct request *, int, rq_end_io_fn *); 700 struct request *, int, rq_end_io_fn *);
701extern int blk_fill_sghdr_rq(request_queue_t *, struct request *,
702 struct sg_io_hdr *, int);
703extern int blk_unmap_sghdr_rq(struct request *, struct sg_io_hdr *);
704extern int blk_complete_sghdr_rq(struct request *, struct sg_io_hdr *,
705 struct bio *);
706extern int blk_verify_command(unsigned char *, int);
683 707
684static inline request_queue_t *bdev_get_queue(struct block_device *bdev) 708static inline request_queue_t *bdev_get_queue(struct block_device *bdev)
685{ 709{
diff --git a/include/linux/bsg.h b/include/linux/bsg.h
new file mode 100644
index 000000000000..bd998ca6cb2e
--- /dev/null
+++ b/include/linux/bsg.h
@@ -0,0 +1,70 @@
1#ifndef BSG_H
2#define BSG_H
3
4#define BSG_PROTOCOL_SCSI 0
5
6#define BSG_SUB_PROTOCOL_SCSI_CMD 0
7#define BSG_SUB_PROTOCOL_SCSI_TMF 1
8#define BSG_SUB_PROTOCOL_SCSI_TRANSPORT 2
9
10struct sg_io_v4 {
11 __s32 guard; /* [i] 'Q' to differentiate from v3 */
12 __u32 protocol; /* [i] 0 -> SCSI , .... */
13 __u32 subprotocol; /* [i] 0 -> SCSI command, 1 -> SCSI task
14 management function, .... */
15
16 __u32 request_len; /* [i] in bytes */
17 __u64 request; /* [i], [*i] {SCSI: cdb} */
18 __u32 request_attr; /* [i] {SCSI: task attribute} */
19 __u32 request_tag; /* [i] {SCSI: task tag (only if flagged)} */
20 __u32 request_priority; /* [i] {SCSI: task priority} */
21 __u32 max_response_len; /* [i] in bytes */
22 __u64 response; /* [i], [*o] {SCSI: (auto)sense data} */
23
24 /* "din_" for data in (from device); "dout_" for data out (to device) */
25 __u32 dout_xfer_len; /* [i] bytes to be transferred to device */
26 __u32 din_xfer_len; /* [i] bytes to be transferred from device */
27 __u64 dout_xferp; /* [i], [*i] */
28 __u64 din_xferp; /* [i], [*o] */
29
30 __u32 timeout; /* [i] units: millisecond */
31 __u32 flags; /* [i] bit mask */
32 __u64 usr_ptr; /* [i->o] unused internally */
33 __u32 spare_in; /* [i] */
34
35 __u32 driver_status; /* [o] 0 -> ok */
36 __u32 transport_status; /* [o] 0 -> ok */
37 __u32 device_status; /* [o] {SCSI: command completion status} */
38 __u32 retry_delay; /* [o] {SCSI: status auxiliary information} */
39 __u32 info; /* [o] additional information */
40 __u32 duration; /* [o] time to complete, in milliseconds */
41 __u32 response_len; /* [o] bytes of response actually written */
42 __s32 din_resid; /* [o] actual_din_xfer_len - din_xfer_len */
43 __u32 generated_tag; /* [o] {SCSI: task tag that transport chose} */
44 __u32 spare_out; /* [o] */
45
46 __u32 padding;
47};
48
49#ifdef __KERNEL__
50
51#if defined(CONFIG_BLK_DEV_BSG)
52struct bsg_class_device {
53 struct class_device *class_dev;
54 struct device *dev;
55 int minor;
56 struct list_head list;
57 struct request_queue *queue;
58};
59
60extern int bsg_register_queue(struct request_queue *, const char *);
61extern void bsg_unregister_queue(struct request_queue *);
62#else
63struct bsg_class_device { };
64#define bsg_register_queue(disk, name) (0)
65#define bsg_unregister_queue(disk) do { } while (0)
66#endif
67
68#endif /* __KERNEL__ */
69
70#endif