From 6de4c5aafcb1b6a8ecd4f22aa887a1cb4cbb4e6d Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT service" Date: Tue, 3 Feb 2009 03:54:10 +0100 Subject: [PATCH] mountlist: use fsblkcnt_t when available (fixes #179) When defined 64bit interface to filesystem we do not get overflow when detect FS size. --- ChangeLog | 4 ++++ src/mountlist.c | 16 ++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2299890e3..49619ed95 100644 --- a/ChangeLog +++ b/ChangeLog @@ -31,6 +31,10 @@ * lib/mc.lib: added patch on #219 by angel_il * vfs/extfs/u7z: patch from mandriva (#194) +2009-02-03 Enrico Weigelt, metux ITS + + * src/mountlist.c: fixed #179 (invalid block scale routine, problems with 32bit overflow) + 2009-02-02 Enrico Weigelt, metux ITS * vfs/extfs/iso9660.in: added iso9660 fix by cppgx (#86) diff --git a/src/mountlist.c b/src/mountlist.c index bd9e8d9e5..0f8b20745 100644 --- a/src/mountlist.c +++ b/src/mountlist.c @@ -135,11 +135,11 @@ struct mount_entry struct fs_usage { - long fsu_blocks; /* Total blocks. */ - long fsu_bfree; /* Free blocks available to superuser. */ - long fsu_bavail; /* Free blocks available to non-superuser. */ - long fsu_files; /* Total file nodes. */ - long fsu_ffree; /* Free file nodes. */ + fsblkcnt_t fsu_blocks; /* Total blocks. */ + fsblkcnt_t fsu_bfree; /* Free blocks available to superuser. */ + fsblkcnt_t fsu_bavail; /* Free blocks available to non-superuser. */ + fsfilcnt_t fsu_files; /* Total file nodes. */ + fsfilcnt_t fsu_ffree; /* Free file nodes. */ }; static int get_fs_usage (char *path, struct fs_usage *fsp); @@ -756,8 +756,8 @@ my_statfs (struct my_statfs *myfs_stats, const char *path) BLOCKS FROMSIZE-byte blocks, rounding away from zero. TOSIZE must be positive. Return -1 if FROMSIZE is not positive. */ -static long -fs_adjust_blocks (long blocks, int fromsize, int tosize) +static fsblkcnt_t +fs_adjust_blocks (fsblkcnt_t blocks, int fromsize, int tosize) { if (tosize <= 0) abort (); @@ -769,7 +769,7 @@ fs_adjust_blocks (long blocks, int fromsize, int tosize) else if (fromsize > tosize) /* E.g., from 2048 to 512. */ return blocks * (fromsize / tosize); else /* E.g., from 256 to 512. */ - return (blocks + (blocks < 0 ? -1 : 1)) / (tosize / fromsize); + return blocks / (tosize / fromsize); } #if defined(_AIX) && defined(_I386)