[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xen-cvs
Subject:    [Xen-changelog] [linux-2.6.18-xen] scsifront: fix address arithmetic
From:       Xen patchbot-linux-2.6.18-xen <patchbot () xen ! org>
Date:       2012-11-22 16:55:03
Message-ID: E1Tba3M-0004dt-0G () xenbits ! xen ! org
[Download RAW message or body]

# HG changeset patch
# User Jan Beulich <jbeulich@suse.com>
# Date 1353602530 -3600
# Node ID 55dc1c7f8290fdbc33f77410ce470a636d65fc48
# Parent  f09889eaf6527f4ea0cc922e7d02da3bb7f919b5
scsifront: fix address arithmetic

Incrementing the result of page_to_phys() is not the same as invoking
it on the incremented page pointer.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
---


diff -r f09889eaf652 -r 55dc1c7f8290 drivers/xen/scsifront/scsifront.c
--- a/drivers/xen/scsifront/scsifront.c	Wed Nov 14 12:10:04 2012 +0100
+++ b/drivers/xen/scsifront/scsifront.c	Thu Nov 22 17:42:10 2012 +0100
@@ -247,7 +247,6 @@ static int map_data_for_request(struct v
 	int err, i, ref, ref_cnt = 0;
 	int write = (sc->sc_data_direction == DMA_TO_DEVICE);
 	int nr_pages, off, len, bytes;
-	unsigned long buffer_pfn;
 	unsigned int data_len = 0;
 
 	if (sc->sc_data_direction == DMA_NONE || !sc->request_bufflen)
@@ -276,8 +275,6 @@ static int map_data_for_request(struct v
 			len = sg[i].length;
 			data_len += len;
 
-			buffer_pfn = page_to_phys(page) >> PAGE_SHIFT;
-
 			while (len > 0) {
 				bytes = min_t(unsigned int, len, PAGE_SIZE - off);
 				
@@ -285,14 +282,14 @@ static int map_data_for_request(struct v
 				BUG_ON(ref == -ENOSPC);
 
 				gnttab_grant_foreign_access_ref(ref, info->dev->otherend_id,
-					buffer_pfn, write);
+					page_to_phys(page) >> PAGE_SHIFT, write);
 
 				info->shadow[id].gref[ref_cnt]  = ref;
 				ring_req->seg[ref_cnt].gref     = ref;
 				ring_req->seg[ref_cnt].offset   = (uint16_t)off;
 				ring_req->seg[ref_cnt].length   = (uint16_t)bytes;
 
-				buffer_pfn++;
+				page++;
 				len -= bytes;
 				off = 0;
 				ref_cnt++;
@@ -312,8 +309,6 @@ static int map_data_for_request(struct v
 			goto big_to_sg;
 		}
 
-		buffer_pfn = page_to_phys(page) >> PAGE_SHIFT;
-
 		off = offset_in_page((unsigned long)sc->request_buffer);
 		for (i = 0; i < nr_pages; i++) {
 			bytes = PAGE_SIZE - off;
@@ -325,14 +320,14 @@ static int map_data_for_request(struct v
 			BUG_ON(ref == -ENOSPC);
 
 			gnttab_grant_foreign_access_ref(ref, info->dev->otherend_id,
-				buffer_pfn, write);
+				page_to_phys(page) >> PAGE_SHIFT, write);
 
 			info->shadow[id].gref[i] = ref;
 			ring_req->seg[i].gref     = ref;
 			ring_req->seg[i].offset   = (uint16_t)off;
 			ring_req->seg[i].length   = (uint16_t)bytes;
 
-			buffer_pfn++;
+			page++;
 			len -= bytes;
 			off = 0;
 			ref_cnt++;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xen.org
http://lists.xensource.com/xen-changelog
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic