wic: add sparse_copy API

In order to make wic images sparse sparse_copy function has been
copied from meta-ostro:
https://github.com/kad/meta-ostro/blob/master/meta-ostro/lib/image-dsk.py
This function uses filemap APIs to copy source sparse file into
destination file preserving sparseness.

The function has been modified to satisfy wic requirements:
parameter 'skip' has been added.

[YOCTO #9099]

(From OE-Core rev: bfde62bdc03152a4d3d383512479b974fa867f94)

Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Ed Bartosh 2016-04-28 13:58:09 +03:00 committed by Richard Purdie
parent a468d4bc57
commit 4b971568e1
1 changed files with 30 additions and 0 deletions

View File

@ -529,3 +529,33 @@ def filemap(image, log=None):
return FilemapFiemap(image, log)
except ErrorNotSupp:
return FilemapSeek(image, log)
def sparse_copy(src_fname, dst_fname, offset=0, skip=0):
"""Efficiently copy sparse file to or into another file."""
fmap = filemap(src_fname)
try:
dst_file = open(dst_fname, 'r+b')
except IOError:
dst_file = open(dst_fname, 'wb')
for first, last in fmap.get_mapped_ranges(0, fmap.blocks_cnt):
start = first * fmap.block_size
end = (last + 1) * fmap.block_size
if start < skip < end:
start = skip
fmap._f_image.seek(start, os.SEEK_SET)
dst_file.seek(offset + start, os.SEEK_SET)
chunk_size = 1024 * 1024
to_read = end - start
read = 0
while read < to_read:
if read + chunk_size > to_read:
chunk_size = to_read - read
chunk = fmap._f_image.read(chunk_size)
dst_file.write(chunk)
read += chunk_size
dst_file.close()