diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-22 20:00:32 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-22 20:00:32 -0400 |
commit | e9dd2b6837e26fe202708cce5ea4bb4ee3e3482e (patch) | |
tree | f42fd892495bfc4cbb740d06b016d267c9c42d00 /drivers/scsi/scsi_lib.c | |
parent | 4f3a29dadaf999a273f1e7fe2476595d0283eef3 (diff) | |
parent | b4627321e18582dcbdeb45d77df29d3177107c65 (diff) |
Merge branch 'for-2.6.37/core' of git://git.kernel.dk/linux-2.6-block
* 'for-2.6.37/core' of git://git.kernel.dk/linux-2.6-block: (39 commits)
cfq-iosched: Fix a gcc 4.5 warning and put some comments
block: Turn bvec_k{un,}map_irq() into static inline functions
block: fix accounting bug on cross partition merges
block: Make the integrity mapped property a bio flag
block: Fix double free in blk_integrity_unregister
block: Ensure physical block size is unsigned int
blkio-throttle: Fix possible multiplication overflow in iops calculations
blkio-throttle: limit max iops value to UINT_MAX
blkio-throttle: There is no need to convert jiffies to milli seconds
blkio-throttle: Fix link failure failure on i386
blkio: Recalculate the throttled bio dispatch time upon throttle limit change
blkio: Add root group to td->tg_list
blkio: deletion of a cgroup was causes oops
blkio: Do not export throttle files if CONFIG_BLK_DEV_THROTTLING=n
block: set the bounce_pfn to the actual DMA limit rather than to max memory
block: revert bad fix for memory hotplug causing bounces
Fix compile error in blk-exec.c for !CONFIG_DETECT_HUNG_TASK
block: set the bounce_pfn to the actual DMA limit rather than to max memory
block: Prevent hang_check firing during long I/O
cfq: improve fsync performance for small files
...
Fix up trivial conflicts due to __rcu sparse annotation in include/linux/genhd.h
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r-- | drivers/scsi/scsi_lib.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index ee02d3838a0a..8041fe1ab179 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -968,11 +968,13 @@ static int scsi_init_sgtable(struct request *req, struct scsi_data_buffer *sdb, | |||
968 | */ | 968 | */ |
969 | int scsi_init_io(struct scsi_cmnd *cmd, gfp_t gfp_mask) | 969 | int scsi_init_io(struct scsi_cmnd *cmd, gfp_t gfp_mask) |
970 | { | 970 | { |
971 | int error = scsi_init_sgtable(cmd->request, &cmd->sdb, gfp_mask); | 971 | struct request *rq = cmd->request; |
972 | |||
973 | int error = scsi_init_sgtable(rq, &cmd->sdb, gfp_mask); | ||
972 | if (error) | 974 | if (error) |
973 | goto err_exit; | 975 | goto err_exit; |
974 | 976 | ||
975 | if (blk_bidi_rq(cmd->request)) { | 977 | if (blk_bidi_rq(rq)) { |
976 | struct scsi_data_buffer *bidi_sdb = kmem_cache_zalloc( | 978 | struct scsi_data_buffer *bidi_sdb = kmem_cache_zalloc( |
977 | scsi_sdb_cache, GFP_ATOMIC); | 979 | scsi_sdb_cache, GFP_ATOMIC); |
978 | if (!bidi_sdb) { | 980 | if (!bidi_sdb) { |
@@ -980,28 +982,28 @@ int scsi_init_io(struct scsi_cmnd *cmd, gfp_t gfp_mask) | |||
980 | goto err_exit; | 982 | goto err_exit; |
981 | } | 983 | } |
982 | 984 | ||
983 | cmd->request->next_rq->special = bidi_sdb; | 985 | rq->next_rq->special = bidi_sdb; |
984 | error = scsi_init_sgtable(cmd->request->next_rq, bidi_sdb, | 986 | error = scsi_init_sgtable(rq->next_rq, bidi_sdb, GFP_ATOMIC); |
985 | GFP_ATOMIC); | ||
986 | if (error) | 987 | if (error) |
987 | goto err_exit; | 988 | goto err_exit; |
988 | } | 989 | } |
989 | 990 | ||
990 | if (blk_integrity_rq(cmd->request)) { | 991 | if (blk_integrity_rq(rq)) { |
991 | struct scsi_data_buffer *prot_sdb = cmd->prot_sdb; | 992 | struct scsi_data_buffer *prot_sdb = cmd->prot_sdb; |
992 | int ivecs, count; | 993 | int ivecs, count; |
993 | 994 | ||
994 | BUG_ON(prot_sdb == NULL); | 995 | BUG_ON(prot_sdb == NULL); |
995 | ivecs = blk_rq_count_integrity_sg(cmd->request); | 996 | ivecs = blk_rq_count_integrity_sg(rq->q, rq->bio); |
996 | 997 | ||
997 | if (scsi_alloc_sgtable(prot_sdb, ivecs, gfp_mask)) { | 998 | if (scsi_alloc_sgtable(prot_sdb, ivecs, gfp_mask)) { |
998 | error = BLKPREP_DEFER; | 999 | error = BLKPREP_DEFER; |
999 | goto err_exit; | 1000 | goto err_exit; |
1000 | } | 1001 | } |
1001 | 1002 | ||
1002 | count = blk_rq_map_integrity_sg(cmd->request, | 1003 | count = blk_rq_map_integrity_sg(rq->q, rq->bio, |
1003 | prot_sdb->table.sgl); | 1004 | prot_sdb->table.sgl); |
1004 | BUG_ON(unlikely(count > ivecs)); | 1005 | BUG_ON(unlikely(count > ivecs)); |
1006 | BUG_ON(unlikely(count > queue_max_integrity_segments(rq->q))); | ||
1005 | 1007 | ||
1006 | cmd->prot_sdb = prot_sdb; | 1008 | cmd->prot_sdb = prot_sdb; |
1007 | cmd->prot_sdb->table.nents = count; | 1009 | cmd->prot_sdb->table.nents = count; |
@@ -1625,6 +1627,14 @@ struct request_queue *__scsi_alloc_queue(struct Scsi_Host *shost, | |||
1625 | blk_queue_max_segments(q, min_t(unsigned short, shost->sg_tablesize, | 1627 | blk_queue_max_segments(q, min_t(unsigned short, shost->sg_tablesize, |
1626 | SCSI_MAX_SG_CHAIN_SEGMENTS)); | 1628 | SCSI_MAX_SG_CHAIN_SEGMENTS)); |
1627 | 1629 | ||
1630 | if (scsi_host_prot_dma(shost)) { | ||
1631 | shost->sg_prot_tablesize = | ||
1632 | min_not_zero(shost->sg_prot_tablesize, | ||
1633 | (unsigned short)SCSI_MAX_PROT_SG_SEGMENTS); | ||
1634 | BUG_ON(shost->sg_prot_tablesize < shost->sg_tablesize); | ||
1635 | blk_queue_max_integrity_segments(q, shost->sg_prot_tablesize); | ||
1636 | } | ||
1637 | |||
1628 | blk_queue_max_hw_sectors(q, shost->max_sectors); | 1638 | blk_queue_max_hw_sectors(q, shost->max_sectors); |
1629 | blk_queue_bounce_limit(q, scsi_calculate_bounce_limit(shost)); | 1639 | blk_queue_bounce_limit(q, scsi_calculate_bounce_limit(shost)); |
1630 | blk_queue_segment_boundary(q, shost->dma_boundary); | 1640 | blk_queue_segment_boundary(q, shost->dma_boundary); |