filemap: add parameter 'length' to sparse_copy

Added parameter 'length' to specify amount of data
to write into destination file. This is useful when only
part of source file should be written into destination file.

(From OE-Core rev: cc44e2eb3b5027a3531e6349937a23d73313b3c6)

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
2017-06-13 14:21:51 +03:00
committed by Richard Purdie
parent ce7895a61c
commit 16562e7672

View File

@@ -530,7 +530,8 @@ def filemap(image, log=None):
except ErrorNotSupp: except ErrorNotSupp:
return FilemapSeek(image, log) return FilemapSeek(image, log)
def sparse_copy(src_fname, dst_fname, offset=0, skip=0, api=None): def sparse_copy(src_fname, dst_fname, offset=0, skip=0,
length=0, api=None):
"""Efficiently copy sparse file to or into another file.""" """Efficiently copy sparse file to or into another file."""
if not api: if not api:
api = filemap api = filemap
@@ -541,6 +542,7 @@ def sparse_copy(src_fname, dst_fname, offset=0, skip=0, api=None):
dst_file = open(dst_fname, 'wb') dst_file = open(dst_fname, 'wb')
dst_file.truncate(os.path.getsize(src_fname)) dst_file.truncate(os.path.getsize(src_fname))
written = 0
for first, last in fmap.get_mapped_ranges(0, fmap.blocks_cnt): for first, last in fmap.get_mapped_ranges(0, fmap.blocks_cnt):
start = first * fmap.block_size start = first * fmap.block_size
end = (last + 1) * fmap.block_size end = (last + 1) * fmap.block_size
@@ -561,7 +563,14 @@ def sparse_copy(src_fname, dst_fname, offset=0, skip=0, api=None):
while read < to_read: while read < to_read:
if read + chunk_size > to_read: if read + chunk_size > to_read:
chunk_size = to_read - read chunk_size = to_read - read
chunk = fmap._f_image.read(chunk_size) size = chunk_size
if length and written + size > length:
size = length - written
chunk = fmap._f_image.read(size)
dst_file.write(chunk) dst_file.write(chunk)
read += chunk_size read += size
written += size
if written == length:
dst_file.close()
return
dst_file.close() dst_file.close()