mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
[BLOCK] blkback: Fix potential grant entry leaks on error
As it stands grant entries for the actual data are mapped in bulk. If one of the earlier entries fail to be mapped, it can cause all subsequent entries to be leaked if they were successfully mapped. This patch changes it so that we will continue to reap grant entries even when an error is detected. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
1 parent
9f29e9da09
commit
94e4fb8a1d
1 file changed
+9
-1
@@ -392,10 +392,15 @@ static void dispatch_rw_block_io(blkif_t *blkif,
|
||||
for (i = 0; i < nseg; i++) {
|
||||
if (unlikely(map[i].status != 0)) {
|
||||
DPRINTK("invalid buffer -- could not remap it\n");
|
||||
goto fail_flush;
|
||||
map[i].handle = BLKBACK_INVALID_HANDLE;
|
||||
ret |= 1;
|
||||
}
|
||||
|
||||
pending_handle(pending_req, i) = map[i].handle;
|
||||
|
||||
if (ret)
|
||||
continue;
|
||||
|
||||
set_phys_to_machine(__pa(vaddr(
|
||||
pending_req, i)) >> PAGE_SHIFT,
|
||||
FOREIGN_FRAME(map[i].dev_bus_addr >> PAGE_SHIFT));
|
||||
@@ -403,6 +408,9 @@ static void dispatch_rw_block_io(blkif_t *blkif,
|
||||
(req->seg[i].first_sect << 9);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
goto fail_flush;
|
||||
|
||||
if (vbd_translate(&preq, blkif, operation) != 0) {
|
||||
DPRINTK("access denied: %s of [%llu,%llu] on dev=%04x\n",
|
||||
operation == READ ? "read" : "write",
|
||||
|
||||