From a62058256f2c1bbc00757dfe89d505d5c6eb9906 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 4 Jul 2024 15:21:39 +0200 Subject: [PATCH 21/21] Avoid dev/inode check on btrfs with --sanity-level=3 With --sanity-level=3 or higher the aspacemgr sanity checks the device/inode numbers from /proc/self/maps to the file stat results. These don't match on btrfs. So detect when a file is on a btrfs volume and ignore the check in that case. https://bugs.kde.org/show_bug.cgi?id=317127 (cherry picked from commit 3b06d458ffc5cc8de8d701926e5d86979185fa04) --- NEWS | 1 + coregrind/m_aspacemgr/aspacemgr-linux.c | 13 +++++++++++++ include/vki/vki-linux.h | 6 ++++++ 3 files changed, 20 insertions(+) diff --git a/NEWS b/NEWS index d1419b9d3c12..c5fbc8699db8 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ The following bugs have been fixed or resolved on this branch. 202770 open fd at exit --log-socket=127.0.0.1:1500 with --track-fds=yes 311655 --log-file=FILE leads to apparent fd leak +317127 Fedora18/x86_64 --sanity-level=3 : aspacem segment mismatch 337388 fcntl works on Valgrind's own file descriptors 391148 Unhandled AVX instruction vmovq %xmm9,%xmm1 444781 MIPS: wrong syscall numbers used diff --git a/coregrind/m_aspacemgr/aspacemgr-linux.c b/coregrind/m_aspacemgr/aspacemgr-linux.c index 83875e89b445..fb788e923eb4 100644 --- a/coregrind/m_aspacemgr/aspacemgr-linux.c +++ b/coregrind/m_aspacemgr/aspacemgr-linux.c @@ -883,6 +883,19 @@ static void sync_check_mapping_callback ( Addr addr, SizeT len, UInt prot, /* hack apparently needed on MontaVista Linux */ if (filename && VG_(strstr)(filename, "/.lib-ro/")) cmp_devino = False; + + /* On linux systems we want to avoid dev/inode check on btrfs, + we can use the statfs call for that, except on nanomips + (which also doesn't have a sys_fstatfs syswrap). + See https://bugs.kde.org/show_bug.cgi?id=317127 */ +#if !defined(VGP_nanomips_linux) + struct vki_statfs statfs = {0}; + SysRes res = VG_(do_syscall2)(__NR_statfs, (UWord)filename, + (UWord)&statfs); + if (!sr_isError(res) && statfs.f_type == VKI_BTRFS_SUPER_MAGIC) { + cmp_devino = False; + } +#endif #endif /* If we are doing sloppy execute permission checks then we diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index be3d76690cee..ccdb808af7a6 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -5455,6 +5455,12 @@ struct vki_open_how { #define VKI_CLOSE_RANGE_UNSHARE (1U << 1) #define VKI_CLOSE_RANGE_CLOEXEC (1U << 2) +//---------------------------------------------------------------------- +// From linux/magic.h +//---------------------------------------------------------------------- + +#define VKI_BTRFS_SUPER_MAGIC 0x9123683E + /*--------------------------------------------------------------------*/ /*--- end ---*/ /*--------------------------------------------------------------------*/ -- 2.45.2