diff options
author | Ed Bartosh <ed.bartosh@linux.intel.com> | 2016-04-28 13:58:09 +0300 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-05-06 10:30:56 +0100 |
commit | bfde62bdc03152a4d3d383512479b974fa867f94 (patch) | |
tree | 160ab04bd61131fda7893247e301e363e0473460 | |
parent | 182639ddc9cda85c896a54c1c64fd1fb145071a1 (diff) | |
download | openembedded-core-bfde62bdc03152a4d3d383512479b974fa867f94.tar.gz openembedded-core-bfde62bdc03152a4d3d383512479b974fa867f94.tar.bz2 openembedded-core-bfde62bdc03152a4d3d383512479b974fa867f94.zip |
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]
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | scripts/lib/wic/filemap.py | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/scripts/lib/wic/filemap.py b/scripts/lib/wic/filemap.py index 1d04328322..f8b2ba71bb 100644 --- a/scripts/lib/wic/filemap.py +++ b/scripts/lib/wic/filemap.py @@ -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() |