summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Barker <pbarker@konsulko.com>2021-01-19 16:26:08 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-01-20 22:46:18 +0000
commitf85a4a1462bc2105f7c62f2b09c1d092c7677ada (patch)
treec530351fad0a50c5539acd4f4e87fa1d7f13df09
parent7a2545013cfed710011ab470ed30422e79622dca (diff)
downloadpoky-f85a4a1462bc2105f7c62f2b09c1d092c7677ada.tar.gz
wic: Update pseudo db when excluding content from rootfs
To exclude content from the rootfs, wic makes a copy (using hardlinks if possible) of the rootfs directory and associated pseudo db, then removes files & directories as needed. However if these files and directories are removed using the python functions os.remove and shutil.rmtree, the copied pseudo db will not be updated correctly. For files copied from the original rootfs, if hardlinks were used successfully when copying the rootfs this should mean that the relevant inodes can't be reused and so the risk of pseudo aborts should be avoided. However, this logic doesn't apply for directories (as they can't be hardlinked) or for files added via the '--include-path' argument (as they weren't present in the original rootfs) and so there remains some risk of inodes being reused and the pseudo db becoming corrupted. To fix this, use the 'rm' command under pseudo when removing files & directories from the copied rootfs to ensure that the copied pseudo db is updated. (From OE-Core rev: d5db7e268947f0392c2126137571a44acd29ccd6) Signed-off-by: Paul Barker <pbarker@konsulko.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--scripts/lib/wic/plugins/source/rootfs.py13
1 files changed, 8 insertions, 5 deletions
diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py
index f1db83f8a1..afb1eb9202 100644
--- a/scripts/lib/wic/plugins/source/rootfs.py
+++ b/scripts/lib/wic/plugins/source/rootfs.py
@@ -199,17 +199,20 @@ class RootfsPlugin(SourcePlugin):
199 if not os.path.lexists(full_path): 199 if not os.path.lexists(full_path):
200 continue 200 continue
201 201
202 if new_pseudo:
203 pseudo = cls.__get_pseudo(native_sysroot, new_rootfs, new_pseudo)
204 else:
205 pseudo = None
202 if path.endswith(os.sep): 206 if path.endswith(os.sep):
203 # Delete content only. 207 # Delete content only.
204 for entry in os.listdir(full_path): 208 for entry in os.listdir(full_path):
205 full_entry = os.path.join(full_path, entry) 209 full_entry = os.path.join(full_path, entry)
206 if os.path.isdir(full_entry) and not os.path.islink(full_entry): 210 rm_cmd = "rm -rf %s" % (full_entry)
207 shutil.rmtree(full_entry) 211 exec_native_cmd(rm_cmd, native_sysroot, pseudo)
208 else:
209 os.remove(full_entry)
210 else: 212 else:
211 # Delete whole directory. 213 # Delete whole directory.
212 shutil.rmtree(full_path) 214 rm_cmd = "rm -rf %s" % (full_path)
215 exec_native_cmd(rm_cmd, native_sysroot, pseudo)
213 216
214 part.prepare_rootfs(cr_workdir, oe_builddir, 217 part.prepare_rootfs(cr_workdir, oe_builddir,
215 new_rootfs or part.rootfs_dir, native_sysroot, 218 new_rootfs or part.rootfs_dir, native_sysroot,