From 47b9f6a12d471086ceb11c8e2893450074e50543 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Sat, 20 Feb 2021 13:15:55 -0800 Subject: Fix df on macOS. On Linux, struct statvfs' f_bsize and f_frsize seem to be interchangeable. On macOS, they're wildly different. f_bsize is the "preferred length of I/O requests for files on this file system" (corresponding to statfs::f_iosize), and f_frsize is the "size in bytes of the minimum unit of allocation on this file system" (corresponding to statfs::f_bsize. POSIX appears to say nothing about the interpretation of these fields, but man7.org's statvfs(2) page is quite clear that statvfs::f_blocks, for example, is in units of f_frsize, not f_bsize. This is the only place in the tree where we use statvfs::f_bsize (other than the stat(1) output that's supposed to be f_bsize and that has a corresponding f_frsize dual anyway. I've removed the Apple-specific #define f_frsize in portability.h because that seems to have been from my previous attempt to understand what was going on here. The output of the relevant stat(1) fields on macOS are the same before/after this patch. This makes toybox df's output match the system's df on a MacBook Pro running macOS 11.2.1. Tested on a Raspberry Pi 400 running Linux too, where I see no change in the output before/after this patch. --- lib/portability.h | 4 ---- 1 file changed, 4 deletions(-) (limited to 'lib') diff --git a/lib/portability.h b/lib/portability.h index bbba12d8..b3646473 100644 --- a/lib/portability.h +++ b/lib/portability.h @@ -346,10 +346,6 @@ struct xnotify *xnotify_init(int max); int xnotify_add(struct xnotify *not, int fd, char *path); int xnotify_wait(struct xnotify *not, char **path); -#ifdef __APPLE__ -#define f_frsize f_iosize -#endif - int sig_to_num(char *s); char *num_to_sig(int sig); -- cgit v1.2.3