Skip to content

Commit 462ab6e

Browse files
authored
Fix Android device issues related to filesystem/IO (#58586)
- Use F_SETLK64 for fcntl to fix an issue where 32bit arm Android apps would get the wrong flag - Add numerical magic numbers for missing file systems to Interop.UnixFileSystemTypes so they are correctly recognized - Make ping test a bit more forgiving if the process returns a few milliseconds _before_ the timeout
1 parent ba1f318 commit 462ab6e

4 files changed

Lines changed: 18 additions & 3 deletions

File tree

src/libraries/Common/src/Interop/Unix/System.Native/Interop.MountPoints.FormatInfo.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ private static DriveType GetDriveType(string fileSystemName)
8080
// This list is based primarily on "man fs", "man mount", "mntent.h", "/proc/filesystems", coreutils "stat.c",
8181
// and "wiki.debian.org/FileSystem". It can be extended over time as we find additional file systems that should
8282
// be recognized as a particular drive type.
83+
// Keep this in sync with the UnixFileSystemTypes enum in Interop.UnixFileSystemTypes.cs
8384
switch (fileSystemName)
8485
{
8586
case "cddafs":

src/libraries/Common/src/Interop/Unix/System.Native/Interop.UnixFileSystemTypes.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ internal enum UnixFileSystemTypes : long
2828
befs = 0x42465331,
2929
bdevfs = 0x62646576,
3030
bfs = 0x1BADFACE,
31+
bpf_fs = 0xCAFE4A11,
3132
binfmt_misc = 0x42494E4D,
3233
bootfs = 0xA56D3FF9,
3334
btrfs = 0x9123683E,
@@ -53,6 +54,7 @@ internal enum UnixFileSystemTypes : long
5354
ext2 = 0xEF53,
5455
ext3 = 0xEF53,
5556
ext4 = 0xEF53,
57+
f2fs = 0xF2F52010,
5658
fat = 0x4006,
5759
fd = 0xF00D1E,
5860
fhgfs = 0x19830326,
@@ -122,6 +124,7 @@ internal enum UnixFileSystemTypes : long
122124
sysv2 = 0x012FF7B6,
123125
sysv4 = 0x012FF7B5,
124126
tmpfs = 0x01021994,
127+
tracefs = 0x74726163,
125128
ubifs = 0x24051905,
126129
udf = 0x15013346,
127130
ufs = 0x00011954,

src/libraries/Native/Unix/System.Native/pal_io.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1427,6 +1427,7 @@ int64_t SystemNative_GetFileSystemType(intptr_t fd)
14271427
else if (strcmp(statfsArgs.f_basetype, "befs") == 0) result = 0x42465331;
14281428
else if (strcmp(statfsArgs.f_basetype, "bdevfs") == 0) result = 0x62646576;
14291429
else if (strcmp(statfsArgs.f_basetype, "bfs") == 0) result = 0x1BADFACE;
1430+
else if (strcmp(statfsArgs.f_basetype, "bpf_fs") == 0) result = 0xCAFE4A11;
14301431
else if (strcmp(statfsArgs.f_basetype, "binfmt_misc") == 0) result = 0x42494E4D;
14311432
else if (strcmp(statfsArgs.f_basetype, "bootfs") == 0) result = 0xA56D3FF9;
14321433
else if (strcmp(statfsArgs.f_basetype, "btrfs") == 0) result = 0x9123683E;
@@ -1452,6 +1453,7 @@ int64_t SystemNative_GetFileSystemType(intptr_t fd)
14521453
else if (strcmp(statfsArgs.f_basetype, "ext2") == 0) result = 0xEF53;
14531454
else if (strcmp(statfsArgs.f_basetype, "ext3") == 0) result = 0xEF53;
14541455
else if (strcmp(statfsArgs.f_basetype, "ext4") == 0) result = 0xEF53;
1456+
else if (strcmp(statfsArgs.f_basetype, "f2fs") == 0) result = 0xF2F52010;
14551457
else if (strcmp(statfsArgs.f_basetype, "fat") == 0) result = 0x4006;
14561458
else if (strcmp(statfsArgs.f_basetype, "fd") == 0) result = 0xF00D1E;
14571459
else if (strcmp(statfsArgs.f_basetype, "fhgfs") == 0) result = 0x19830326;
@@ -1519,6 +1521,7 @@ int64_t SystemNative_GetFileSystemType(intptr_t fd)
15191521
else if (strcmp(statfsArgs.f_basetype, "sysv2") == 0) result = 0x012FF7B6;
15201522
else if (strcmp(statfsArgs.f_basetype, "sysv4") == 0) result = 0x012FF7B5;
15211523
else if (strcmp(statfsArgs.f_basetype, "tmpfs") == 0) result = 0x01021994;
1524+
else if (strcmp(statfsArgs.f_basetype, "tracefs") == 0) result = 0x74726163;
15221525
else if (strcmp(statfsArgs.f_basetype, "ubifs") == 0) result = 0x24051905;
15231526
else if (strcmp(statfsArgs.f_basetype, "udf") == 0) result = 0x15013346;
15241527
else if (strcmp(statfsArgs.f_basetype, "ufs") == 0) result = 0x00011954;
@@ -1560,13 +1563,21 @@ int32_t SystemNative_LockFileRegion(intptr_t fd, int64_t offset, int64_t length,
15601563
struct flock lockArgs;
15611564
#endif
15621565

1566+
#if defined(TARGET_ANDROID) && defined(HAVE_FLOCK64)
1567+
// On Android, fcntl is always implemented by fcntl64 but before https://github.com/aosp-mirror/platform_bionic/commit/09e77f35ab8d291bf88302bb9673aaa518c6bcb0
1568+
// there was no remapping of F_SETLK to F_SETLK64 when _FILE_OFFSET_BITS=64 (which we set in eng/native/configurecompiler.cmake) so we need to always pass F_SETLK64
1569+
int command = F_SETLK64;
1570+
#else
1571+
int command = F_SETLK;
1572+
#endif
1573+
15631574
lockArgs.l_type = unixLockType;
15641575
lockArgs.l_whence = SEEK_SET;
15651576
lockArgs.l_start = (off_t)offset;
15661577
lockArgs.l_len = (off_t)length;
15671578

15681579
int32_t ret;
1569-
while ((ret = fcntl (ToFileDescriptor(fd), F_SETLK, &lockArgs)) < 0 && errno == EINTR);
1580+
while ((ret = fcntl (ToFileDescriptor(fd), command, &lockArgs)) < 0 && errno == EINTR);
15701581
return ret;
15711582
}
15721583

src/libraries/System.Net.Ping/tests/FunctionalTests/UnixPingUtilityTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ public static void TimeoutIsRespected(int timeout)
3737
p.Start();
3838
p.WaitForExit();
3939

40-
//ensure that the process takes longer than or equal to 'timeout'
41-
Assert.True(stopWatch.ElapsedMilliseconds >= timeout);
40+
//ensure that the process takes longer than or within 10ms of 'timeout', with a 5s maximum
41+
Assert.InRange(stopWatch.ElapsedMilliseconds, timeout - 10, 5000);
4242
}
4343

4444
[ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsThreadingSupported))]

0 commit comments

Comments
 (0)