diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-08 19:27:31 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-08 19:27:31 -0500 |
commit | cd764695b67386a81964f68e9c66efd9f13f4d29 (patch) | |
tree | 504e961ab6bad164c41f4b9c1ff00c0ce7f645ee /fs | |
parent | 97d61b8e3aef163a75f80f4762794c154572293d (diff) | |
parent | ffda8c7dc492e2170bb263f7c56f286992ceb54b (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: (45 commits)
[SCSI] qla2xxx: Update version number to 8.03.00-k1.
[SCSI] qla2xxx: Add ISP81XX support.
[SCSI] qla2xxx: Use proper request/response queues with MQ instantiations.
[SCSI] qla2xxx: Correct MQ-chain information retrieval during a firmware dump.
[SCSI] qla2xxx: Collapse EFT/FCE copy procedures during a firmware dump.
[SCSI] qla2xxx: Don't pollute kernel logs with ZIO/RIO status messages.
[SCSI] qla2xxx: Don't fallback to interrupt-polling during re-initialization with MSI-X enabled.
[SCSI] qla2xxx: Remove support for reading/writing HW-event-log.
[SCSI] cxgb3i: add missing include
[SCSI] scsi_lib: fix DID_RESET status problems
[SCSI] fc transport: restore missing dev_loss_tmo callback to LLDD
[SCSI] aha152x_cs: Fix regression that keeps driver from using shared interrupts
[SCSI] sd: Correctly handle 6-byte commands with DIX
[SCSI] sd: DIF: Fix tagging on platforms with signed char
[SCSI] sd: DIF: Show app tag on error
[SCSI] Fix error handling for DIF/DIX
[SCSI] scsi_lib: don't decrement busy counters when inserting commands
[SCSI] libsas: fix test for negative unsigned and typos
[SCSI] a2091, gvp11: kill warn_unused_result warnings
[SCSI] fusion: Move a dereference below a NULL test
...
Fixed up trivial conflict due to moving the async part of sd_probe
around in the async probes vs using dev_set_name() in naming.
Diffstat (limited to 'fs')
-rw-r--r-- | fs/bio.c | 36 |
1 files changed, 22 insertions, 14 deletions
@@ -788,6 +788,7 @@ struct bio *bio_copy_user_iov(struct request_queue *q, | |||
788 | int i, ret; | 788 | int i, ret; |
789 | int nr_pages = 0; | 789 | int nr_pages = 0; |
790 | unsigned int len = 0; | 790 | unsigned int len = 0; |
791 | unsigned int offset = map_data ? map_data->offset & ~PAGE_MASK : 0; | ||
791 | 792 | ||
792 | for (i = 0; i < iov_count; i++) { | 793 | for (i = 0; i < iov_count; i++) { |
793 | unsigned long uaddr; | 794 | unsigned long uaddr; |
@@ -814,35 +815,42 @@ struct bio *bio_copy_user_iov(struct request_queue *q, | |||
814 | bio->bi_rw |= (!write_to_vm << BIO_RW); | 815 | bio->bi_rw |= (!write_to_vm << BIO_RW); |
815 | 816 | ||
816 | ret = 0; | 817 | ret = 0; |
817 | i = 0; | 818 | |
819 | if (map_data) { | ||
820 | nr_pages = 1 << map_data->page_order; | ||
821 | i = map_data->offset / PAGE_SIZE; | ||
822 | } | ||
818 | while (len) { | 823 | while (len) { |
819 | unsigned int bytes; | 824 | unsigned int bytes = PAGE_SIZE; |
820 | 825 | ||
821 | if (map_data) | 826 | bytes -= offset; |
822 | bytes = 1U << (PAGE_SHIFT + map_data->page_order); | ||
823 | else | ||
824 | bytes = PAGE_SIZE; | ||
825 | 827 | ||
826 | if (bytes > len) | 828 | if (bytes > len) |
827 | bytes = len; | 829 | bytes = len; |
828 | 830 | ||
829 | if (map_data) { | 831 | if (map_data) { |
830 | if (i == map_data->nr_entries) { | 832 | if (i == map_data->nr_entries * nr_pages) { |
831 | ret = -ENOMEM; | 833 | ret = -ENOMEM; |
832 | break; | 834 | break; |
833 | } | 835 | } |
834 | page = map_data->pages[i++]; | 836 | |
835 | } else | 837 | page = map_data->pages[i / nr_pages]; |
838 | page += (i % nr_pages); | ||
839 | |||
840 | i++; | ||
841 | } else { | ||
836 | page = alloc_page(q->bounce_gfp | gfp_mask); | 842 | page = alloc_page(q->bounce_gfp | gfp_mask); |
837 | if (!page) { | 843 | if (!page) { |
838 | ret = -ENOMEM; | 844 | ret = -ENOMEM; |
839 | break; | 845 | break; |
846 | } | ||
840 | } | 847 | } |
841 | 848 | ||
842 | if (bio_add_pc_page(q, bio, page, bytes, 0) < bytes) | 849 | if (bio_add_pc_page(q, bio, page, bytes, offset) < bytes) |
843 | break; | 850 | break; |
844 | 851 | ||
845 | len -= bytes; | 852 | len -= bytes; |
853 | offset = 0; | ||
846 | } | 854 | } |
847 | 855 | ||
848 | if (ret) | 856 | if (ret) |
@@ -851,7 +859,7 @@ struct bio *bio_copy_user_iov(struct request_queue *q, | |||
851 | /* | 859 | /* |
852 | * success | 860 | * success |
853 | */ | 861 | */ |
854 | if (!write_to_vm) { | 862 | if (!write_to_vm && (!map_data || !map_data->null_mapped)) { |
855 | ret = __bio_copy_iov(bio, bio->bi_io_vec, iov, iov_count, 0, 0); | 863 | ret = __bio_copy_iov(bio, bio->bi_io_vec, iov, iov_count, 0, 0); |
856 | if (ret) | 864 | if (ret) |
857 | goto cleanup; | 865 | goto cleanup; |