diff options
| -rw-r--r-- | drivers/block/xen-blkback/blkback.c | 5 | ||||
| -rw-r--r-- | drivers/block/xen-blkback/common.h | 17 | ||||
| -rw-r--r-- | drivers/block/xen-blkback/xenbus.c | 9 | 
3 files changed, 22 insertions, 9 deletions
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 6a685aec6994..809634ce3b67 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -961,7 +961,7 @@ static int xen_blkbk_parse_indirect(struct blkif_request *req,  		seg[n].nsec = segments[i].last_sect -  			segments[i].first_sect + 1;  		seg[n].offset = (segments[i].first_sect << 9); -		if ((segments[i].last_sect >= (PAGE_SIZE >> 9)) || +		if ((segments[i].last_sect >= (XEN_PAGE_SIZE >> 9)) ||  		    (segments[i].last_sect < segments[i].first_sect)) {  			rc = -EINVAL;  			goto unmap; @@ -1210,6 +1210,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,  	req_operation = req->operation == BLKIF_OP_INDIRECT ?  			req->u.indirect.indirect_op : req->operation; +  	if ((req->operation == BLKIF_OP_INDIRECT) &&  	    (req_operation != BLKIF_OP_READ) &&  	    (req_operation != BLKIF_OP_WRITE)) { @@ -1268,7 +1269,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,  			seg[i].nsec = req->u.rw.seg[i].last_sect -  				req->u.rw.seg[i].first_sect + 1;  			seg[i].offset = (req->u.rw.seg[i].first_sect << 9); -			if ((req->u.rw.seg[i].last_sect >= (PAGE_SIZE >> 9)) || +			if ((req->u.rw.seg[i].last_sect >= (XEN_PAGE_SIZE >> 9)) ||  			    (req->u.rw.seg[i].last_sect <  			     req->u.rw.seg[i].first_sect))  				goto fail_response; diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h index 45a044a53d1e..68e87a037b99 100644 --- a/drivers/block/xen-blkback/common.h +++ b/drivers/block/xen-blkback/common.h @@ -39,6 +39,7 @@  #include <asm/pgalloc.h>  #include <asm/hypervisor.h>  #include <xen/grant_table.h> +#include <xen/page.h>  #include <xen/xenbus.h>  #include <xen/interface/io/ring.h>  #include <xen/interface/io/blkif.h> @@ -51,12 +52,20 @@ extern unsigned int xen_blkif_max_ring_order;   */  #define MAX_INDIRECT_SEGMENTS 256 -#define SEGS_PER_INDIRECT_FRAME \ -	(PAGE_SIZE/sizeof(struct blkif_request_segment)) +/* + * Xen use 4K pages. The guest may use different page size (4K or 64K) + * Number of Xen pages per segment + */ +#define XEN_PAGES_PER_SEGMENT   (PAGE_SIZE / XEN_PAGE_SIZE) + +#define XEN_PAGES_PER_INDIRECT_FRAME \ +	(XEN_PAGE_SIZE/sizeof(struct blkif_request_segment)) +#define SEGS_PER_INDIRECT_FRAME	\ +	(XEN_PAGES_PER_INDIRECT_FRAME / XEN_PAGES_PER_SEGMENT) +  #define MAX_INDIRECT_PAGES \  	((MAX_INDIRECT_SEGMENTS + SEGS_PER_INDIRECT_FRAME - 1)/SEGS_PER_INDIRECT_FRAME) -#define INDIRECT_PAGES(_segs) \ -	((_segs + SEGS_PER_INDIRECT_FRAME - 1)/SEGS_PER_INDIRECT_FRAME) +#define INDIRECT_PAGES(_segs) DIV_ROUND_UP(_segs, XEN_PAGES_PER_INDIRECT_FRAME)  /* Not a real protocol.  Used to generate ring structs which contain   * the elements common to all protocols only.  This way we get a diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c index 767657565de6..01c6b41de4e5 100644 --- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c @@ -176,21 +176,24 @@ static int xen_blkif_map(struct xen_blkif *blkif, grant_ref_t *gref,  	{  		struct blkif_sring *sring;  		sring = (struct blkif_sring *)blkif->blk_ring; -		BACK_RING_INIT(&blkif->blk_rings.native, sring, PAGE_SIZE * nr_grefs); +		BACK_RING_INIT(&blkif->blk_rings.native, sring, +			       XEN_PAGE_SIZE * nr_grefs);  		break;  	}  	case BLKIF_PROTOCOL_X86_32:  	{  		struct blkif_x86_32_sring *sring_x86_32;  		sring_x86_32 = (struct blkif_x86_32_sring *)blkif->blk_ring; -		BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, PAGE_SIZE * nr_grefs); +		BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, +			       XEN_PAGE_SIZE * nr_grefs);  		break;  	}  	case BLKIF_PROTOCOL_X86_64:  	{  		struct blkif_x86_64_sring *sring_x86_64;  		sring_x86_64 = (struct blkif_x86_64_sring *)blkif->blk_ring; -		BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, PAGE_SIZE * nr_grefs); +		BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, +			       XEN_PAGE_SIZE * nr_grefs);  		break;  	}  	default:  | 
