diff options
author | Douglas Gilbert <dougg@torque.net> | 2006-08-19 00:11:34 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-08-26 10:25:06 -0400 |
commit | b2155d0417df9f2b4c0d396b6530b864d9f08623 (patch) | |
tree | 3e7683501f150b6eff19226da139cbd5f69d3b78 /drivers/scsi | |
parent | 48e2691f9c3bd6719e773f0b883449f4cef39585 (diff) |
[SCSI] sg: fix incorrect page problem
There's a problem where sg is executing a ->nopage operation on a
compound page, it actually calls get_page() on the first page in the
compound rather than the page which is being mapped. The fix is to
select the correct page by indexing into the compound.
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/sg.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 65eef33846bb..34f9343ed0af 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
@@ -18,8 +18,8 @@ | |||
18 | * | 18 | * |
19 | */ | 19 | */ |
20 | 20 | ||
21 | static int sg_version_num = 30533; /* 2 digits for each component */ | 21 | static int sg_version_num = 30534; /* 2 digits for each component */ |
22 | #define SG_VERSION_STR "3.5.33" | 22 | #define SG_VERSION_STR "3.5.34" |
23 | 23 | ||
24 | /* | 24 | /* |
25 | * D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes: | 25 | * D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes: |
@@ -60,7 +60,7 @@ static int sg_version_num = 30533; /* 2 digits for each component */ | |||
60 | 60 | ||
61 | #ifdef CONFIG_SCSI_PROC_FS | 61 | #ifdef CONFIG_SCSI_PROC_FS |
62 | #include <linux/proc_fs.h> | 62 | #include <linux/proc_fs.h> |
63 | static char *sg_version_date = "20050908"; | 63 | static char *sg_version_date = "20060818"; |
64 | 64 | ||
65 | static int sg_proc_init(void); | 65 | static int sg_proc_init(void); |
66 | static void sg_proc_cleanup(void); | 66 | static void sg_proc_cleanup(void); |
@@ -1164,7 +1164,7 @@ sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type) | |||
1164 | len = vma->vm_end - sa; | 1164 | len = vma->vm_end - sa; |
1165 | len = (len < sg->length) ? len : sg->length; | 1165 | len = (len < sg->length) ? len : sg->length; |
1166 | if (offset < len) { | 1166 | if (offset < len) { |
1167 | page = sg->page; | 1167 | page = virt_to_page(page_address(sg->page) + offset); |
1168 | get_page(page); /* increment page count */ | 1168 | get_page(page); /* increment page count */ |
1169 | break; | 1169 | break; |
1170 | } | 1170 | } |