From 3d6392cfbd7dc11f23058e3493683afab4ac13a3 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Mon, 9 Jul 2007 12:38:05 +0200 Subject: bsg: support for full generic block layer SG v3 Signed-off-by: Jens Axboe --- include/linux/blkdev.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'include/linux/blkdev.h') diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index fae138bd2207..53002d40efa2 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -41,6 +41,8 @@ struct elevator_queue; typedef struct elevator_queue elevator_t; struct request_pm_state; struct blk_trace; +struct request; +struct sg_io_hdr; #define BLKDEV_MIN_RQ 4 #define BLKDEV_MAX_RQ 128 /* Default maximum */ @@ -607,6 +609,11 @@ extern unsigned long blk_max_low_pfn, blk_max_pfn; #define BLK_BOUNCE_ANY ((u64)blk_max_pfn << PAGE_SHIFT) #define BLK_BOUNCE_ISA (ISA_DMA_THRESHOLD) +/* + * default timeout for SG_IO if none specified + */ +#define BLK_DEFAULT_SG_TIMEOUT (60 * HZ) + #ifdef CONFIG_MMU extern int init_emergency_isa_pool(void); extern void blk_queue_bounce(request_queue_t *q, struct bio **bio); @@ -680,6 +687,11 @@ extern int blk_execute_rq(request_queue_t *, struct gendisk *, struct request *, int); extern void blk_execute_rq_nowait(request_queue_t *, struct gendisk *, struct request *, int, rq_end_io_fn *); +extern int blk_fill_sghdr_rq(request_queue_t *, struct request *, + struct sg_io_hdr *, int); +extern int blk_unmap_sghdr_rq(struct request *, struct sg_io_hdr *); +extern int blk_complete_sghdr_rq(struct request *, struct sg_io_hdr *, + struct bio *); static inline request_queue_t *bdev_get_queue(struct block_device *bdev) { -- cgit v1.3-8-gc7d7 From 337ad41deae1b56e56731246322a93251df86e79 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Wed, 20 Dec 2006 11:18:54 +0100 Subject: block: export blk_verify_command for SG v4 blk_fill_sghdr_rq doesn't work for SG v4 so verify_command needed to be exported. Signed-off-by: FUJITA Tomonori Signed-off-by: Jens Axboe --- block/scsi_ioctl.c | 7 ++++--- include/linux/blkdev.h | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'include/linux/blkdev.h') diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index daded70ffbb1..db53b2c268d3 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -112,7 +112,7 @@ static int sg_emulated_host(request_queue_t *q, int __user *p) #define safe_for_read(cmd) [cmd] = CMD_READ_SAFE #define safe_for_write(cmd) [cmd] = CMD_WRITE_SAFE -static int verify_command(unsigned char *cmd, int has_write_perm) +int blk_verify_command(unsigned char *cmd, int has_write_perm) { static unsigned char cmd_type[256] = { @@ -212,6 +212,7 @@ static int verify_command(unsigned char *cmd, int has_write_perm) /* Otherwise fail it with an "Operation not permitted" */ return -EPERM; } +EXPORT_SYMBOL_GPL(blk_verify_command); int blk_fill_sghdr_rq(request_queue_t *q, struct request *rq, struct sg_io_hdr *hdr, int has_write_perm) @@ -220,7 +221,7 @@ int blk_fill_sghdr_rq(request_queue_t *q, struct request *rq, if (copy_from_user(rq->cmd, hdr->cmdp, hdr->cmd_len)) return -EFAULT; - if (verify_command(rq->cmd, has_write_perm)) + if (blk_verify_command(rq->cmd, has_write_perm)) return -EPERM; /* @@ -457,7 +458,7 @@ int sg_scsi_ioctl(struct file *file, struct request_queue *q, if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len)) goto error; - err = verify_command(rq->cmd, file->f_mode & FMODE_WRITE); + err = blk_verify_command(rq->cmd, file->f_mode & FMODE_WRITE); if (err) goto error; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 53002d40efa2..f6bc0d03ffad 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -692,6 +692,7 @@ extern int blk_fill_sghdr_rq(request_queue_t *, struct request *, extern int blk_unmap_sghdr_rq(struct request *, struct sg_io_hdr *); extern int blk_complete_sghdr_rq(struct request *, struct sg_io_hdr *, struct bio *); +extern int blk_verify_command(unsigned char *, int); static inline request_queue_t *bdev_get_queue(struct block_device *bdev) { -- cgit v1.3-8-gc7d7 From 45e79a3acdcf54113b3d7b23e9e64e6541dbfeb5 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Mon, 9 Jul 2007 12:39:20 +0200 Subject: bsg: add a request_queue argument to scsi_cmd_ioctl() bsg uses scsi_cmd_ioctl() for some SCSI/sg ioctl commands. scsi_cmd_ioctl() gets a request queue from a gendisk arguement. This prevents bsg being bound to SCSI devices that don't have a gendisk (like OSD). This adds a request_queue argument to scsi_cmd_ioctl(). The SCSI/sg ioctl commands doesn't use a gendisk so it's safe for any SCSI devices to use scsi_cmd_ioctl(). Signed-off-by: FUJITA Tomonori Signed-off-by: Jens Axboe --- block/bsg.c | 2 +- block/scsi_ioctl.c | 10 +++------- drivers/block/ub.c | 2 +- drivers/cdrom/cdrom.c | 3 ++- drivers/ide/ide.c | 2 +- drivers/scsi/sd.c | 2 +- drivers/scsi/st.c | 3 ++- include/linux/blkdev.h | 3 ++- 8 files changed, 13 insertions(+), 14 deletions(-) (limited to 'include/linux/blkdev.h') diff --git a/block/bsg.c b/block/bsg.c index c85d961ee41e..0427ece9b6d8 100644 --- a/block/bsg.c +++ b/block/bsg.c @@ -900,7 +900,7 @@ bsg_ioctl(struct inode *inode, struct file *file, unsigned int cmd, case SG_EMULATED_HOST: case SCSI_IOCTL_SEND_COMMAND: { void __user *uarg = (void __user *) arg; - return scsi_cmd_ioctl(file, bd->disk, cmd, uarg); + return scsi_cmd_ioctl(file, bd->queue, bd->disk, cmd, uarg); } case SG_IO: { struct request *rq; diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index db53b2c268d3..a26ba07955fe 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -548,16 +548,12 @@ static inline int blk_send_start_stop(request_queue_t *q, struct gendisk *bd_dis return __blk_send_generic(q, bd_disk, GPCMD_START_STOP_UNIT, data); } -int scsi_cmd_ioctl(struct file *file, struct gendisk *bd_disk, unsigned int cmd, void __user *arg) +int scsi_cmd_ioctl(struct file *file, struct request_queue *q, + struct gendisk *bd_disk, unsigned int cmd, void __user *arg) { - request_queue_t *q; int err; - q = bd_disk->queue; - if (!q) - return -ENXIO; - - if (blk_get_queue(q)) + if (!q || blk_get_queue(q)) return -ENXIO; switch (cmd) { diff --git a/drivers/block/ub.c b/drivers/block/ub.c index 18c8b6c0db20..8b13d7d2cb63 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c @@ -1709,7 +1709,7 @@ static int ub_bd_ioctl(struct inode *inode, struct file *filp, struct gendisk *disk = inode->i_bdev->bd_disk; void __user *usermem = (void __user *) arg; - return scsi_cmd_ioctl(filp, disk, cmd, usermem); + return scsi_cmd_ioctl(filp, disk->queue, disk, cmd, usermem); } /* diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index aa5468f487ba..499019bf8f40 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c @@ -2695,11 +2695,12 @@ int cdrom_ioctl(struct file * file, struct cdrom_device_info *cdi, { void __user *argp = (void __user *)arg; int ret; + struct gendisk *disk = ip->i_bdev->bd_disk; /* * Try the generic SCSI command ioctl's first. */ - ret = scsi_cmd_ioctl(file, ip->i_bdev->bd_disk, cmd, argp); + ret = scsi_cmd_ioctl(file, disk->queue, disk, cmd, argp); if (ret != -ENOTTY) return ret; diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 9ae60a7400a2..8cd7694593c9 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c @@ -1052,7 +1052,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device int err, (*setfunc)(ide_drive_t *, int); u8 *val; - err = scsi_cmd_ioctl(file, bdev->bd_disk, cmd, p); + err = scsi_cmd_ioctl(file, bdev->bd_disk->queue, bdev->bd_disk, cmd, p); if (err != -ENOTTY) return err; diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 448d316f12d7..424d557284a9 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -684,7 +684,7 @@ static int sd_ioctl(struct inode * inode, struct file * filp, case SCSI_IOCTL_GET_BUS_NUMBER: return scsi_ioctl(sdp, cmd, p); default: - error = scsi_cmd_ioctl(filp, disk, cmd, p); + error = scsi_cmd_ioctl(filp, disk->queue, disk, cmd, p); if (error != -ENOTTY) return error; } diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 55bfeccf68a2..a4f7b8465773 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -3549,7 +3549,8 @@ static int st_ioctl(struct inode *inode, struct file *file, !capable(CAP_SYS_RAWIO)) i = -EPERM; else - i = scsi_cmd_ioctl(file, STp->disk, cmd_in, p); + i = scsi_cmd_ioctl(file, STp->disk->queue, + STp->disk, cmd_in, p); if (i != -ENOTTY) return i; break; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index f6bc0d03ffad..2746632c2267 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -644,7 +644,8 @@ extern void blk_requeue_request(request_queue_t *, struct request *); extern void blk_plug_device(request_queue_t *); extern int blk_remove_plug(request_queue_t *); extern void blk_recount_segments(request_queue_t *, struct bio *); -extern int scsi_cmd_ioctl(struct file *, struct gendisk *, unsigned int, void __user *); +extern int scsi_cmd_ioctl(struct file *, struct request_queue *, + struct gendisk *, unsigned int, void __user *); extern int sg_scsi_ioctl(struct file *, struct request_queue *, struct gendisk *, struct scsi_ioctl_command __user *); -- cgit v1.3-8-gc7d7 From d351af01b9307566135cb0f355ca65d0952c10b5 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Mon, 9 Jul 2007 12:40:35 +0200 Subject: bsg: bind bsg to request_queue instead of gendisk This patch binds bsg devices to request_queue instead of gendisk. Any objects (like transport entities) can define own request_handler and create own bsg device. Signed-off-by: FUJITA Tomonori Signed-off-by: Jens Axboe --- block/bsg.c | 37 +++++++++++++++++-------------------- block/ll_rw_blk.c | 4 ++-- include/linux/blkdev.h | 5 +++++ include/linux/bsg.h | 10 +++++----- include/linux/genhd.h | 2 -- 5 files changed, 29 insertions(+), 29 deletions(-) (limited to 'include/linux/blkdev.h') diff --git a/block/bsg.c b/block/bsg.c index 0427ece9b6d8..4ea4bedb413f 100644 --- a/block/bsg.c +++ b/block/bsg.c @@ -34,7 +34,6 @@ static char bsg_version[] = "block layer sg (bsg) 0.4"; struct bsg_device { - struct gendisk *disk; request_queue_t *queue; spinlock_t lock; struct list_head busy_list; @@ -46,7 +45,7 @@ struct bsg_device { int done_cmds; wait_queue_head_t wq_done; wait_queue_head_t wq_free; - char name[BDEVNAME_SIZE]; + char name[BUS_ID_SIZE]; int max_queue; unsigned long flags; }; @@ -375,7 +374,7 @@ static void bsg_add_command(struct bsg_device *bd, request_queue_t *q, dprintk("%s: queueing rq %p, bc %p\n", bd->name, rq, bc); rq->end_io_data = bc; - blk_execute_rq_nowait(q, bd->disk, rq, 1, bsg_rq_end_io); + blk_execute_rq_nowait(q, NULL, rq, 1, bsg_rq_end_io); } static inline struct bsg_command *bsg_next_done_cmd(struct bsg_device *bd) @@ -741,7 +740,7 @@ out: } static struct bsg_device *bsg_add_device(struct inode *inode, - struct gendisk *disk, + struct request_queue *rq, struct file *file) { struct bsg_device *bd = NULL; @@ -753,17 +752,16 @@ static struct bsg_device *bsg_add_device(struct inode *inode, if (!bd) return ERR_PTR(-ENOMEM); - bd->disk = disk; - bd->queue = disk->queue; - kobject_get(&disk->queue->kobj); + bd->queue = rq; + kobject_get(&rq->kobj); bsg_set_block(bd, file); atomic_set(&bd->ref_count, 1); bd->minor = iminor(inode); mutex_lock(&bsg_mutex); - hlist_add_head(&bd->dev_list,&bsg_device_list[bsg_list_idx(bd->minor)]); + hlist_add_head(&bd->dev_list, &bsg_device_list[bsg_list_idx(bd->minor)]); - strncpy(bd->name, disk->disk_name, sizeof(bd->name) - 1); + strncpy(bd->name, rq->bsg_dev.class_dev->class_id, sizeof(bd->name) - 1); dprintk("bound to <%s>, max queue %d\n", format_dev_t(buf, inode->i_rdev), bd->max_queue); @@ -817,7 +815,7 @@ static struct bsg_device *bsg_get_device(struct inode *inode, struct file *file) if (!bcd) return ERR_PTR(-ENODEV); - return bsg_add_device(inode, bcd->disk, file); + return bsg_add_device(inode, bcd->queue, file); } static int bsg_open(struct inode *inode, struct file *file) @@ -900,7 +898,7 @@ bsg_ioctl(struct inode *inode, struct file *file, unsigned int cmd, case SG_EMULATED_HOST: case SCSI_IOCTL_SEND_COMMAND: { void __user *uarg = (void __user *) arg; - return scsi_cmd_ioctl(file, bd->queue, bd->disk, cmd, uarg); + return scsi_cmd_ioctl(file, bd->queue, NULL, cmd, uarg); } case SG_IO: { struct request *rq; @@ -915,7 +913,7 @@ bsg_ioctl(struct inode *inode, struct file *file, unsigned int cmd, return PTR_ERR(rq); bio = rq->bio; - blk_execute_rq(bd->queue, bd->disk, rq, 0); + blk_execute_rq(bd->queue, NULL, rq, 0); blk_complete_sgv4_hdr_rq(rq, &hdr, bio); if (copy_to_user(uarg, &hdr, sizeof(hdr))) @@ -945,24 +943,23 @@ static struct file_operations bsg_fops = { .owner = THIS_MODULE, }; -void bsg_unregister_disk(struct gendisk *disk) +void bsg_unregister_queue(struct request_queue *q) { - struct bsg_class_device *bcd = &disk->bsg_dev; + struct bsg_class_device *bcd = &q->bsg_dev; if (!bcd->class_dev) return; mutex_lock(&bsg_mutex); - sysfs_remove_link(&bcd->disk->queue->kobj, "bsg"); + sysfs_remove_link(&q->kobj, "bsg"); class_device_destroy(bsg_class, MKDEV(BSG_MAJOR, bcd->minor)); bcd->class_dev = NULL; list_del_init(&bcd->list); mutex_unlock(&bsg_mutex); } -int bsg_register_disk(struct gendisk *disk) +int bsg_register_queue(struct request_queue *q, char *name) { - request_queue_t *q = disk->queue; struct bsg_class_device *bcd; dev_t dev; @@ -972,7 +969,7 @@ int bsg_register_disk(struct gendisk *disk) if (!q->request_fn) return 0; - bcd = &disk->bsg_dev; + bcd = &q->bsg_dev; memset(bcd, 0, sizeof(*bcd)); INIT_LIST_HEAD(&bcd->list); @@ -980,8 +977,8 @@ int bsg_register_disk(struct gendisk *disk) dev = MKDEV(BSG_MAJOR, bsg_device_nr); bcd->minor = bsg_device_nr; bsg_device_nr++; - bcd->disk = disk; - bcd->class_dev = class_device_create(bsg_class, NULL, dev, bcd->dev, "%s", disk->disk_name); + bcd->queue = q; + bcd->class_dev = class_device_create(bsg_class, NULL, dev, bcd->dev, "%s", name); if (!bcd->class_dev) goto err; list_add_tail(&bcd->list, &bsg_class_list); diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index 3795e0708a22..74a5498c29a1 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c @@ -4091,7 +4091,7 @@ int blk_register_queue(struct gendisk *disk) return ret; } - ret = bsg_register_disk(disk); + ret = bsg_register_queue(q, disk->disk_name); if (ret) { elv_unregister_queue(q); kobject_unregister(&q->kobj); @@ -4106,7 +4106,7 @@ void blk_unregister_queue(struct gendisk *disk) request_queue_t *q = disk->queue; if (q && q->request_fn) { - bsg_unregister_disk(disk); + bsg_unregister_queue(q); elv_unregister_queue(q); kobject_uevent(&q->kobj, KOBJ_REMOVE); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 2746632c2267..24b474e05a44 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -470,6 +471,10 @@ struct request_queue unsigned int bi_size; struct mutex sysfs_lock; + +#if defined(CONFIG_BLK_DEV_BSG) + struct bsg_class_device bsg_dev; +#endif }; #define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */ diff --git a/include/linux/bsg.h b/include/linux/bsg.h index 2154a6dfbd53..0475a6d3ff6a 100644 --- a/include/linux/bsg.h +++ b/include/linux/bsg.h @@ -47,16 +47,16 @@ struct bsg_class_device { struct class_device *class_dev; struct device *dev; int minor; - struct gendisk *disk; struct list_head list; + struct request_queue *queue; }; -extern int bsg_register_disk(struct gendisk *); -extern void bsg_unregister_disk(struct gendisk *); +extern int bsg_register_queue(struct request_queue *, char *); +extern void bsg_unregister_queue(struct request_queue *); #else struct bsg_class_device { }; -#define bsg_register_disk(disk) (0) -#define bsg_unregister_disk(disk) do { } while (0) +#define bsg_register_queue(disk, name) (0) +#define bsg_unregister_queue(disk) do { } while (0) #endif #endif /* __KERNEL__ */ diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 8c43d7032612..9756fc102a83 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -67,7 +67,6 @@ struct partition { #include #include #include -#include struct partition { unsigned char boot_ind; /* 0x80 - active */ @@ -92,7 +91,6 @@ struct hd_struct { #ifdef CONFIG_FAIL_MAKE_REQUEST int make_it_fail; #endif - struct bsg_class_device bsg_dev; }; #define GENHD_FL_REMOVABLE 1 -- cgit v1.3-8-gc7d7 From abae1fde63fcdd2a3abaa0d7930938d8326f83d2 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Mon, 16 Jul 2007 08:52:14 +0200 Subject: add a struct request pointer to the request structure This adds a struct request pointer to the request structure for the second data phase (bidi for now). A request queue supporting bidi requests sets QUEUE_FLAG_BIDI. This prevents sending bidi requests to a non-bidi queue. Signed-off-by: FUJITA Tomonori Signed-off-by: Jens Axboe --- block/ll_rw_blk.c | 1 + include/linux/blkdev.h | 5 +++++ 2 files changed, 6 insertions(+) (limited to 'include/linux/blkdev.h') diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index ef42bb2b12b6..11e4235d0b0c 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c @@ -256,6 +256,7 @@ static void rq_init(request_queue_t *q, struct request *rq) rq->end_io = NULL; rq->end_io_data = NULL; rq->completion_data = NULL; + rq->next_rq = NULL; } /** diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 24b474e05a44..b32564a1e105 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -317,6 +317,9 @@ struct request { */ rq_end_io_fn *end_io; void *end_io_data; + + /* for bidi */ + struct request *next_rq; }; /* @@ -486,6 +489,7 @@ struct request_queue #define QUEUE_FLAG_REENTER 6 /* Re-entrancy avoidance */ #define QUEUE_FLAG_PLUGGED 7 /* queue is plugged */ #define QUEUE_FLAG_ELVSWITCH 8 /* don't use elevator, just do FIFO */ +#define QUEUE_FLAG_BIDI 9 /* queue supports bidi requests */ enum { /* @@ -550,6 +554,7 @@ enum { #define blk_sorted_rq(rq) ((rq)->cmd_flags & REQ_SORTED) #define blk_barrier_rq(rq) ((rq)->cmd_flags & REQ_HARDBARRIER) #define blk_fua_rq(rq) ((rq)->cmd_flags & REQ_FUA) +#define blk_bidi_rq(rq) ((rq)->next_rq != NULL) #define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist) -- cgit v1.3-8-gc7d7 From 2a7326b5bbafac4c96bcdb944b2a773593030b96 Mon Sep 17 00:00:00 2001 From: Christoph Lameter Date: Tue, 17 Jul 2007 04:03:37 -0700 Subject: CONFIG_BOUNCE to avoid useless inclusion of bounce buffer logic The bounce buffer logic is included on systems that do not need it. If a system does not have zones like ZONE_DMA and ZONE_HIGHMEM that can lead to the use of bounce buffers then there is no need to reserve memory pools etc etc. This is true f.e. for SGI Altix. Also nicifies the Makefile and gets rid of the tricky "and" there. Signed-off-by: Christoph Lameter Acked-by: Jens Axboe Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- include/linux/blkdev.h | 2 +- mm/Kconfig | 4 ++++ mm/Makefile | 4 +--- 3 files changed, 6 insertions(+), 4 deletions(-) (limited to 'include/linux/blkdev.h') diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index b32564a1e105..f78965fc6426 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -624,7 +624,7 @@ extern unsigned long blk_max_low_pfn, blk_max_pfn; */ #define BLK_DEFAULT_SG_TIMEOUT (60 * HZ) -#ifdef CONFIG_MMU +#ifdef CONFIG_BOUNCE extern int init_emergency_isa_pool(void); extern void blk_queue_bounce(request_queue_t *q, struct bio **bio); #else diff --git a/mm/Kconfig b/mm/Kconfig index 086af703da43..86187221e78f 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -163,6 +163,10 @@ config ZONE_DMA_FLAG default "0" if !ZONE_DMA default "1" +config BOUNCE + def_bool y + depends on BLOCK && MMU && (ZONE_DMA || HIGHMEM) + config NR_QUICK int depends on QUICKLIST diff --git a/mm/Makefile b/mm/Makefile index a9148ea329aa..245e33ab00c4 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -13,9 +13,7 @@ obj-y := bootmem.o filemap.o mempool.o oom_kill.o fadvise.o \ prio_tree.o util.o mmzone.o vmstat.o backing-dev.o \ $(mmu-y) -ifeq ($(CONFIG_MMU)$(CONFIG_BLOCK),yy) -obj-y += bounce.o -endif +obj-$(CONFIG_BOUNCE) += bounce.o obj-$(CONFIG_SWAP) += page_io.o swap_state.o swapfile.o thrash.o obj-$(CONFIG_HUGETLBFS) += hugetlb.o obj-$(CONFIG_NUMA) += mempolicy.o -- cgit v1.3-8-gc7d7 From 41e1703b9b88cf9b5e91cdd2f7dcded3ec3917cb Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Sun, 22 Jul 2007 10:06:50 +0900 Subject: [SCSI] bsg: unexport sg v3 helper functions blk_fill_sghdr_rq, blk_unmap_sghdr_rq, and blk_complete_sghdr_rq were exported for bsg, however bsg was changed to support only sg v4. Signed-off-by: FUJITA Tomonori Signed-off-by: James Bottomley --- block/scsi_ioctl.c | 13 +++++-------- include/linux/blkdev.h | 5 ----- 2 files changed, 5 insertions(+), 13 deletions(-) (limited to 'include/linux/blkdev.h') diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index a26ba07955fe..7bfebd574e55 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -214,8 +214,8 @@ int blk_verify_command(unsigned char *cmd, int has_write_perm) } EXPORT_SYMBOL_GPL(blk_verify_command); -int blk_fill_sghdr_rq(request_queue_t *q, struct request *rq, - struct sg_io_hdr *hdr, int has_write_perm) +static int blk_fill_sghdr_rq(request_queue_t *q, struct request *rq, + struct sg_io_hdr *hdr, int has_write_perm) { memset(rq->cmd, 0, BLK_MAX_CDB); /* ATAPI hates garbage after CDB */ @@ -238,22 +238,20 @@ int blk_fill_sghdr_rq(request_queue_t *q, struct request *rq, return 0; } -EXPORT_SYMBOL_GPL(blk_fill_sghdr_rq); /* * unmap a request that was previously mapped to this sg_io_hdr. handles * both sg and non-sg sg_io_hdr. */ -int blk_unmap_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr) +static int blk_unmap_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr) { blk_rq_unmap_user(rq->bio); blk_put_request(rq); return 0; } -EXPORT_SYMBOL_GPL(blk_unmap_sghdr_rq); -int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, - struct bio *bio) +static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, + struct bio *bio) { int r, ret = 0; @@ -287,7 +285,6 @@ int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, return r; } -EXPORT_SYMBOL_GPL(blk_complete_sghdr_rq); static int sg_io(struct file *file, request_queue_t *q, struct gendisk *bd_disk, struct sg_io_hdr *hdr) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index f78965fc6426..695e34964cb7 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -698,11 +698,6 @@ extern int blk_execute_rq(request_queue_t *, struct gendisk *, struct request *, int); extern void blk_execute_rq_nowait(request_queue_t *, struct gendisk *, struct request *, int, rq_end_io_fn *); -extern int blk_fill_sghdr_rq(request_queue_t *, struct request *, - struct sg_io_hdr *, int); -extern int blk_unmap_sghdr_rq(struct request *, struct sg_io_hdr *); -extern int blk_complete_sghdr_rq(struct request *, struct sg_io_hdr *, - struct bio *); extern int blk_verify_command(unsigned char *, int); static inline request_queue_t *bdev_get_queue(struct block_device *bdev) -- cgit v1.3-8-gc7d7