diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/bsg.c | 14 | ||||
-rw-r--r-- | block/ll_rw_blk.c | 24 |
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) | |||
760 | EXPORT_SYMBOL(blk_queue_dma_alignment); | 760 | EXPORT_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 | **/ | ||
776 | void 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 | |||
784 | EXPORT_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 |