diff options
Diffstat (limited to 'drivers/block/xen-blkback/blkback.c')
-rw-r--r-- | drivers/block/xen-blkback/blkback.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index dba55e3a4a86..c73910cc28c9 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c | |||
@@ -175,8 +175,14 @@ static int xen_vbd_translate(struct phys_req *req, struct xen_blkif *blkif, | |||
175 | if ((operation != READ) && vbd->readonly) | 175 | if ((operation != READ) && vbd->readonly) |
176 | goto out; | 176 | goto out; |
177 | 177 | ||
178 | if (unlikely((req->sector_number + req->nr_sects) > vbd_sz(vbd))) | 178 | if (likely(req->nr_sects)) { |
179 | goto out; | 179 | blkif_sector_t end = req->sector_number + req->nr_sects; |
180 | |||
181 | if (unlikely(end < req->sector_number)) | ||
182 | goto out; | ||
183 | if (unlikely(end > vbd_sz(vbd))) | ||
184 | goto out; | ||
185 | } | ||
180 | 186 | ||
181 | req->dev = vbd->pdevice; | 187 | req->dev = vbd->pdevice; |
182 | req->bdev = vbd->bdev; | 188 | req->bdev = vbd->bdev; |
@@ -538,11 +544,6 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif, | |||
538 | case BLKIF_OP_FLUSH_DISKCACHE: | 544 | case BLKIF_OP_FLUSH_DISKCACHE: |
539 | blkif->st_f_req++; | 545 | blkif->st_f_req++; |
540 | operation = WRITE_FLUSH; | 546 | operation = WRITE_FLUSH; |
541 | /* | ||
542 | * The frontend likes to set this to -1, which xen_vbd_translate | ||
543 | * is alergic too. | ||
544 | */ | ||
545 | req->u.rw.sector_number = 0; | ||
546 | break; | 547 | break; |
547 | case BLKIF_OP_WRITE_BARRIER: | 548 | case BLKIF_OP_WRITE_BARRIER: |
548 | default: | 549 | default: |