diff --git a/meta/recipes-extended/libarchive/libarchive/run-ptest b/meta/recipes-extended/libarchive/libarchive/run-ptest
index d6b4c3f934..4af767b29a 100755
--- a/meta/recipes-extended/libarchive/libarchive/run-ptest
+++ b/meta/recipes-extended/libarchive/libarchive/run-ptest
@@ -1,13 +1,24 @@
 #!/bin/sh
 
+PTEST_DIR=$(cd "$(dirname "$0")" && pwd)
+
 # The fuzz tests run 1000 randomised iterations per archive format and are
 # meant for dedicated fuzzing infrastructure, not routine ptest runs. They
 # regularly time out in the time/memory constrained autobuilder QEMU targets
 # (e.g. test_fuzz_iso9660). Skip them via the upstream escape hatch.
 export SKIP_TEST_FUZZ=1
 
+# The bsdcpio odc/newc format tests verify archive headers byte-by-byte
+# including inode and device numbers. On ext4 root filesystems inode numbers
+# can exceed the odc 6-octal-digit (262143) or newc 8-hex-digit (4294967295)
+# field widths, causing intermittent assertion failures. Run all tests from
+# a tmpfs where inode numbers start fresh and small.
+WORKDIR=$(mktemp -d)
+mount -t tmpfs tmpfs "$WORKDIR"
+cd "$WORKDIR"
+
 for t in libarchive_test bsdtar_test bsdcpio_test bsdcat_test bsdunzip_test; do
-    ./$t
+    "$PTEST_DIR"/$t
     if [ $? -eq 0 ]; then
         echo "PASS: $t"
     else
@@ -15,3 +26,6 @@ for t in libarchive_test bsdtar_test bsdcpio_test bsdcat_test bsdunzip_test; do
     fi
 done
 
+cd "$PTEST_DIR"
+umount "$WORKDIR"
+rmdir "$WORKDIR"
