Commit f2f5fd68 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Andrei Vagin

page-xfer: Sanitize xfer core routine

Make it call .write_pagemap once and decide whether or not to
call .write_pages based on the flags caluculated in one place
as well.
Acked-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent daf8b4f7
...@@ -434,6 +434,19 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp, ...@@ -434,6 +434,19 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp,
return 0; return 0;
} }
static inline u32 ppb_xfer_flags(struct page_xfer *xfer, struct page_pipe_buf *ppb)
{
if (ppb->flags & PPB_LAZY)
/*
* Pages that can be lazily restored are always marked as such.
* In the case we actually transfer them into image mark them
* as present as well.
*/
return (xfer->transfer_lazy ? PE_PRESENT : 0) | PE_LAZY;
else
return PE_PRESENT;
}
int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp) int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp)
{ {
struct page_pipe_buf *ppb; struct page_pipe_buf *ppb;
...@@ -449,7 +462,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp) ...@@ -449,7 +462,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp)
for (i = 0; i < ppb->nr_segs; i++) { for (i = 0; i < ppb->nr_segs; i++) {
struct iovec iov = ppb->iov[i]; struct iovec iov = ppb->iov[i];
u32 flags = PE_PRESENT; u32 flags;
ret = dump_holes(xfer, pp, &cur_hole, iov.iov_base); ret = dump_holes(xfer, pp, &cur_hole, iov.iov_base);
if (ret) if (ret)
...@@ -460,19 +473,12 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp) ...@@ -460,19 +473,12 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp)
pr_debug("\tp %p [%u]\n", iov.iov_base, pr_debug("\tp %p [%u]\n", iov.iov_base,
(unsigned int)(iov.iov_len / PAGE_SIZE)); (unsigned int)(iov.iov_len / PAGE_SIZE));
if (ppb->flags & PPB_LAZY) { flags = ppb_xfer_flags(xfer, ppb);
if (!xfer->transfer_lazy) {
if (xfer->write_pagemap(xfer, &iov, PE_LAZY))
return -1;
continue;
} else {
flags |= PE_LAZY;
}
}
if (xfer->write_pagemap(xfer, &iov, flags)) if (xfer->write_pagemap(xfer, &iov, flags))
return -1; return -1;
if (xfer->write_pages(xfer, ppb->p[0], iov.iov_len)) if ((flags & PE_PRESENT) && xfer->write_pages(xfer,
ppb->p[0], iov.iov_len))
return -1; return -1;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment