Print this page
7178 tmpfs incorrectly calculates amount of free space
Reviewed by: Alexander Stetsenko <astetsenko@racktopsystems.com>

*** 19,28 **** --- 19,29 ---- * CDDL HEADER END */ /* * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, Joyent, Inc. All rights reserved. + * Copyright 2016 RackTop Systems. */ #include <sys/types.h> #include <sys/param.h> #include <sys/sysmacros.h>
*** 584,597 **** ASSERT(k_anoninfo.ani_max >= k_anoninfo.ani_phys_resv); blocks = (ulong_t)CURRENT_TOTAL_AVAILABLE_SWAP; mutex_exit(&anoninfo_lock); /* ! * If tm_anonmax for this mount is less than the available swap space ! * (minus the amount tmpfs can't use), use that instead ! */ ! if (blocks > tmpfs_minfree) sbp->f_bfree = MIN(blocks - tmpfs_minfree, tm->tm_anonmax - tm->tm_anonmem); else sbp->f_bfree = 0; --- 585,601 ---- ASSERT(k_anoninfo.ani_max >= k_anoninfo.ani_phys_resv); blocks = (ulong_t)CURRENT_TOTAL_AVAILABLE_SWAP; mutex_exit(&anoninfo_lock); /* ! * Compare the amount of space that should be free to this mount ! * (which may be limited by tm_anonmax) with the amount of space ! * that's actually free to all tmpfs and use the lowest value. ! */ ! if (tm->tm_anonmax == ULONG_MAX) ! sbp->f_bfree = MAX(blocks - tmpfs_minfree, 0); ! else if (blocks > tmpfs_minfree && tm->tm_anonmax > tm->tm_anonmem) sbp->f_bfree = MIN(blocks - tmpfs_minfree, tm->tm_anonmax - tm->tm_anonmem); else sbp->f_bfree = 0;
*** 624,644 **** sbp->f_blocks = MIN(pgcap, sbp->f_blocks); } /* * The maximum number of files available is approximately the number ! * of tmpnodes we can allocate from the remaining kernel memory ! * available to tmpfs. This is fairly inaccurate since it doesn't ! * take into account the names stored in the directory entries. */ ! if (tmpfs_maxkmem > tmp_kmemspace) ! sbp->f_ffree = (tmpfs_maxkmem - tmp_kmemspace) / (sizeof (struct tmpnode) + sizeof (struct tdirent)); ! else ! sbp->f_ffree = 0; ! ! sbp->f_files = tmpfs_maxkmem / (sizeof (struct tmpnode) + sizeof (struct tdirent)); sbp->f_favail = (fsfilcnt64_t)(sbp->f_ffree); (void) cmpldev(&d32, vfsp->vfs_dev); sbp->f_fsid = d32; (void) strcpy(sbp->f_basetype, vfssw[tmpfsfstype].vsw_name); --- 628,644 ---- sbp->f_blocks = MIN(pgcap, sbp->f_blocks); } /* * The maximum number of files available is approximately the number ! * of tmpnodes we can allocate from the number of blocks available ! * to this mount. This is fairly inaccurate since it doesn't take ! * into account the names stored in the directory entries. */ ! sbp->f_ffree = sbp->f_bfree == 0 ? 0 : sbp->f_bfree / (sizeof (struct tmpnode) + sizeof (struct tdirent)); ! sbp->f_files = sbp->f_blocks == 0 ? 0 : sbp->f_blocks / (sizeof (struct tmpnode) + sizeof (struct tdirent)); sbp->f_favail = (fsfilcnt64_t)(sbp->f_ffree); (void) cmpldev(&d32, vfsp->vfs_dev); sbp->f_fsid = d32; (void) strcpy(sbp->f_basetype, vfssw[tmpfsfstype].vsw_name);