aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-01-25 20:19:08 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2008-01-25 20:19:08 -0500
commit9b73e76f3cf63379dcf45fcd4f112f5812418d0a (patch)
tree4e6bef87cd0cd6d848fc39a5ae25b981dbbe035b /block
parent50d9a126240f9961cfdd063336bbeb91f77a7dce (diff)
parent23c3e290fb9ce38cabc2822b47583fc8702411bf (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (200 commits) [SCSI] usbstorage: use last_sector_bug flag universally [SCSI] libsas: abstract STP task status into a function [SCSI] ultrastor: clean up inline asm warnings [SCSI] aic7xxx: fix firmware build [SCSI] aacraid: fib context lock for management ioctls [SCSI] ch: remove forward declarations [SCSI] ch: fix device minor number management bug [SCSI] ch: handle class_device_create failure properly [SCSI] NCR5380: fix section mismatch [SCSI] sg: fix /proc/scsi/sg/devices when no SCSI devices [SCSI] IB/iSER: add logical unit reset support [SCSI] don't use __GFP_DMA for sense buffers if not required [SCSI] use dynamically allocated sense buffer [SCSI] scsi.h: add macro for enclosure bit of inquiry data [SCSI] sd: add fix for devices with last sector access problems [SCSI] fix pcmcia compile problem [SCSI] aacraid: add Voodoo Lite class of cards. [SCSI] aacraid: add new driver features flags [SCSI] qla2xxx: Update version number to 8.02.00-k7. [SCSI] qla2xxx: Issue correct MBC_INITIALIZE_FIRMWARE command. ...
Diffstat (limited to 'block')
-rw-r--r--block/bsg.c14
-rw-r--r--block/ll_rw_blk.c24
2 files changed, 36 insertions, 2 deletions
diff --git a/block/bsg.c b/block/bsg.c
index 8e181ab3afb9..69b0a9d33306 100644
--- a/block/bsg.c
+++ b/block/bsg.c
@@ -445,6 +445,15 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr,
445 else 445 else
446 hdr->dout_resid = rq->data_len; 446 hdr->dout_resid = rq->data_len;
447 447
448 /*
449 * If the request generated a negative error number, return it
450 * (providing we aren't already returning an error); if it's
451 * just a protocol response (i.e. non negative), that gets
452 * processed above.
453 */
454 if (!ret && rq->errors < 0)
455 ret = rq->errors;
456
448 blk_rq_unmap_user(bio); 457 blk_rq_unmap_user(bio);
449 blk_put_request(rq); 458 blk_put_request(rq);
450 459
@@ -837,6 +846,7 @@ static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
837{ 846{
838 struct bsg_device *bd = file->private_data; 847 struct bsg_device *bd = file->private_data;
839 int __user *uarg = (int __user *) arg; 848 int __user *uarg = (int __user *) arg;
849 int ret;
840 850
841 switch (cmd) { 851 switch (cmd) {
842 /* 852 /*
@@ -889,12 +899,12 @@ static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
889 if (rq->next_rq) 899 if (rq->next_rq)
890 bidi_bio = rq->next_rq->bio; 900 bidi_bio = rq->next_rq->bio;
891 blk_execute_rq(bd->queue, NULL, rq, 0); 901 blk_execute_rq(bd->queue, NULL, rq, 0);
892 blk_complete_sgv4_hdr_rq(rq, &hdr, bio, bidi_bio); 902 ret = blk_complete_sgv4_hdr_rq(rq, &hdr, bio, bidi_bio);
893 903
894 if (copy_to_user(uarg, &hdr, sizeof(hdr))) 904 if (copy_to_user(uarg, &hdr, sizeof(hdr)))
895 return -EFAULT; 905 return -EFAULT;
896 906
897 return 0; 907 return ret;
898 } 908 }
899 /* 909 /*
900 * block device ioctls 910 * block device ioctls
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
index 5ccec8aa964b..3d0422f48453 100644
--- a/block/ll_rw_blk.c
+++ b/block/ll_rw_blk.c
@@ -760,6 +760,30 @@ void blk_queue_dma_alignment(struct request_queue *q, int mask)
760EXPORT_SYMBOL(blk_queue_dma_alignment); 760EXPORT_SYMBOL(blk_queue_dma_alignment);
761 761
762/** 762/**
763 * blk_queue_update_dma_alignment - update dma length and memory alignment
764 * @q: the request queue for the device
765 * @mask: alignment mask
766 *
767 * description:
768 * update required memory and length aligment for direct dma transactions.
769 * If the requested alignment is larger than the current alignment, then
770 * the current queue alignment is updated to the new value, otherwise it
771 * is left alone. The design of this is to allow multiple objects
772 * (driver, device, transport etc) to set their respective
773 * alignments without having them interfere.
774 *
775 **/
776void blk_queue_update_dma_alignment(struct request_queue *q, int mask)
777{
778 BUG_ON(mask > PAGE_SIZE);
779
780 if (mask > q->dma_alignment)
781 q->dma_alignment = mask;
782}
783
784EXPORT_SYMBOL(blk_queue_update_dma_alignment);
785
786/**
763 * blk_queue_find_tag - find a request by its tag and queue 787 * blk_queue_find_tag - find a request by its tag and queue
764 * @q: The request queue for the device 788 * @q: The request queue for the device
765 * @tag: The tag of the request 789 * @tag: The tag of the request