From: Toni Wilen Date: Fri, 19 Feb 2016 19:06:34 +0000 (+0200) Subject: Calculate directory harddrive size using host OS returned byte-based value, not block... X-Git-Tag: 3300~75 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=9cef75e269841ed658b3d1919ebc13c29c56b9f4;p=francis%2Fwinuae.git Calculate directory harddrive size using host OS returned byte-based value, not blocks. Adjust Amiga-side fake block size if drive is too large to prevent Amiga-side size reporting overflows. --- diff --git a/filesys.cpp b/filesys.cpp index 45e86587..2d8611a4 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -3283,8 +3283,8 @@ static void do_info(TrapContext *ctx, Unit *unit, dpacket *packet, uaecptr info, nr = unit->unit - cd_unit_offset; blocksize = ii.blocksize; if (ii.media) { - fsu.fsu_blocks = ii.blocks; - fsu.fsu_bavail = 0; + fsu.total = ii.blocks * ii.blocksize; + fsu.avail = 0; } } } else { @@ -3326,17 +3326,28 @@ static void do_info(TrapContext *ctx, Unit *unit, dpacket *packet, uaecptr info, put_long_host(buf + 28, 0); } else { if (fs && currprefs.filesys_limit) { - if (fsu.fsu_blocks > (uae_u64)currprefs.filesys_limit * 1024 / blocksize) { - uae_u32 oldblocks = fsu.fsu_blocks; - fsu.fsu_blocks = (uae_u32)((uae_u64)currprefs.filesys_limit * 1024 / blocksize); - fsu.fsu_bavail = (uae_u32)((uae_u64)fsu.fsu_bavail * fsu.fsu_blocks / oldblocks); + if (fsu.total > (uae_s64)currprefs.filesys_limit * 1024) { + uae_s64 oldtotal = fsu.total; + fsu.total = currprefs.filesys_limit * 1024; + fsu.avail = ((fsu.avail / 1024) * (fsu.total / 1024)) / (oldtotal / 1024); + fsu.avail *= 1024; } } - put_long_host(buf + 12, fsu.fsu_blocks); /* numblocks */ - put_long_host(buf + 16, fsu.fsu_blocks - fsu.fsu_bavail); /* inuse */ + uae_s64 numblocks = 0; + while (blocksize < 32768 || numblocks == 0) { + numblocks = fsu.total / blocksize; + if (numblocks <= 0x7fffffff) + break; + blocksize *= 2; + } + uae_s64 inuse = (fsu.total - fsu.avail + blocksize - 1) / blocksize; + + put_long_host(buf + 12, (uae_u32)numblocks); /* numblocks */ + put_long_host(buf + 16, (uae_u32)inuse); /* inuse */ + put_long_host(buf + 20, blocksize); /* bytesperblock */ put_long_host(buf + 24, dostype); /* disk type */ put_long_host(buf + 28, unit->volume >> 2); /* volume node */ - put_long_host(buf + 32, (trap_get_long(ctx, unit->volume + 28) || unit->keys) ? -1 : 0); /* inuse */ + put_long_host(buf + 32, (get_long(unit->volume + 28) || unit->keys) ? -1 : 0); /* inuse */ } trap_put_bytes(ctx, buf, info, sizeof buf); PUT_PCK_RES1 (packet, DOS_TRUE); @@ -8482,14 +8493,30 @@ static uae_u32 REGPARAM2 filesys_dev_storeinfo (TrapContext *ctx) trap_put_long(ctx, parmpacket + 76, uip[unit_no].bootpri); /* bootPri */ trap_put_long(ctx, parmpacket + 80, DISK_TYPE_DOS); /* DOS\0 */ if (type == FILESYS_VIRTUAL) { + // generate some sane-looking geometry if some program really cares.. + uae_s64 hicyl = 100; + uae_u32 heads = 16; + if (currprefs.filesys_limit) { + hicyl = ((currprefs.filesys_limit * 1024) / 512) / (heads * 127); + } else { + struct fs_usage fsu; + if (!get_fs_usage(uip->rootdir, 0, &fsu)) { + for (;;) { + hicyl = (fsu.total / 512) / (heads * 127); + if (hicyl < 65536 || heads == 64) + break; + heads *= 2; + } + } + } trap_put_long(ctx, parmpacket + 4, fsdevname); trap_put_long(ctx, parmpacket + 20, 512 >> 2); /* longwords per block */ - trap_put_long(ctx, parmpacket + 28, 15); /* heads */ + trap_put_long(ctx, parmpacket + 28, heads); /* heads */ trap_put_long(ctx, parmpacket + 32, 1); /* sectors per block */ trap_put_long(ctx, parmpacket + 36, 127); /* sectors per track */ trap_put_long(ctx, parmpacket + 40, 2); /* reserved blocks */ - trap_put_long(ctx, parmpacket + 52, 0); /* lowCyl */ - trap_put_long(ctx, parmpacket + 56, 1); /* hiCyl */ + trap_put_long(ctx, parmpacket + 52, 1); /* lowCyl */ + trap_put_long(ctx, parmpacket + 56, (uae_u32)hicyl); /* hiCyl */ } else { uae_u8 buf[512]; trap_put_long(ctx, parmpacket + 4, ROM_hardfile_resname); diff --git a/fsusage.cpp b/fsusage.cpp index 73af6458..455f0589 100644 --- a/fsusage.cpp +++ b/fsusage.cpp @@ -78,12 +78,9 @@ int get_fs_usage (const TCHAR *path, const TCHAR *disk, struct fs_usage *fsp) return -1; } - fsp->fsu_blocks = 0x7fffffff; - fsp->fsu_bavail = 0x7fffffff; - if (TotalNumberOfBytes.QuadPart / 1024 < (1 << 31)) - fsp->fsu_blocks = (unsigned long)(TotalNumberOfBytes.QuadPart / 1024); - if (FreeBytesAvailable.QuadPart / 1024 < (1 << 31)) - fsp->fsu_bavail = (unsigned long)(FreeBytesAvailable.QuadPart / 1024); + fsp->total = TotalNumberOfBytes.QuadPart; + fsp->avail = TotalNumberOfFreeBytes.QuadPart; + return 0; } diff --git a/include/fsusage.h b/include/fsusage.h index 0a11dd04..a1ec35f1 100644 --- a/include/fsusage.h +++ b/include/fsusage.h @@ -23,11 +23,8 @@ /* Space usage statistics for a filesystem. Blocks are 512-byte. */ struct fs_usage { - unsigned long fsu_blocks; /* Total blocks. */ - unsigned long fsu_bfree; /* Free blocks available to superuser. */ - unsigned long fsu_bavail; /* Free blocks available to non-superuser. */ - unsigned long fsu_files; /* Total file nodes. */ - unsigned long fsu_ffree; /* Free file nodes. */ + uae_u64 total; + uae_u64 avail; }; int get_fs_usage (const TCHAR *path, const TCHAR *disk, struct fs_usage *fsp); diff --git a/include/zarchive.h b/include/zarchive.h index 07ac17cd..ffb993d9 100644 --- a/include/zarchive.h +++ b/include/zarchive.h @@ -72,7 +72,6 @@ struct zvolume struct znode *parentz; struct zvolume *parent; uae_s64 size; - unsigned int blocks; unsigned int id; uae_s64 archivesize; unsigned int method;