aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
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