Commit a355affd authored by Tikhomirov Pavel's avatar Tikhomirov Pavel Committed by Pavel Emelyanov

v2 deduplication: add separate function for punch to use on restore

Signed-off-by: 's avatarTikhomirov Pavel <snorcht@gmail.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 9b491e5c
...@@ -101,6 +101,19 @@ exit: ...@@ -101,6 +101,19 @@ exit:
return 0; return 0;
} }
int punch_hole(int fd, unsigned long off, unsigned long len)
{
int ret;
pr_debug("Punch!/%lu/%lu/\n", off, len);
ret = fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
off, len);
if (ret != 0) {
pr_perror("Error punching hole");
return -1;
}
return 0;
}
int dedup_one_iovec(struct page_read *pr, struct iovec *iov) int dedup_one_iovec(struct page_read *pr, struct iovec *iov)
{ {
unsigned long off; unsigned long off;
...@@ -133,14 +146,11 @@ int dedup_one_iovec(struct page_read *pr, struct iovec *iov) ...@@ -133,14 +146,11 @@ int dedup_one_iovec(struct page_read *pr, struct iovec *iov)
piov_end = (unsigned long)piov.iov_base + piov.iov_len; piov_end = (unsigned long)piov.iov_base + piov.iov_len;
off_real = lseek(pr->fd_pg, 0, SEEK_CUR); off_real = lseek(pr->fd_pg, 0, SEEK_CUR);
if (!pr->pe->in_parent) { if (!pr->pe->in_parent) {
pr_debug("Punch!/%lu/%lu/\n", off_real, min(piov_end, iov_end) - off); ret = punch_hole(pr->fd_pg, off_real, min(piov_end, iov_end) - off);
ret = fallocate(pr->fd_pg, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, if (ret == -1)
off_real, min(piov_end, iov_end) - off); return ret;
if (ret != 0) {
pr_perror("Error punching hole : %d", errno);
return -1;
}
} }
prp = pr->parent; prp = pr->parent;
if (prp) { if (prp) {
/* recursively */ /* recursively */
......
...@@ -73,4 +73,5 @@ extern void pagemap2iovec(PagemapEntry *pe, struct iovec *iov); ...@@ -73,4 +73,5 @@ extern void pagemap2iovec(PagemapEntry *pe, struct iovec *iov);
extern int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn); extern int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn);
extern int dedup_one_iovec(struct page_read *pr, struct iovec *iov); extern int dedup_one_iovec(struct page_read *pr, struct iovec *iov);
extern int punch_hole(int fd, unsigned long off, unsigned long len);
#endif /* __CR_PAGE_READ_H__ */ #endif /* __CR_PAGE_READ_H__ */
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