]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
fix storage space calculation
authorDaniel Becker <razzfazz@gmail.com>
Thu, 21 Sep 2017 04:42:39 +0000 (21:42 -0700)
committerJaroslav Kysela <perex@perex.cz>
Thu, 9 Nov 2017 14:50:24 +0000 (15:50 +0100)
The f_bfree and f_bavail members in struct statvfs are expressed in
units of f_frsize, not f_bsize (see the statvfs(2) manpage, e.g. here:
<https://linux.die.net/man/2/statvfs>). The two can differ quite
substantially, e.g. on ZFS.

src/dvr/dvr_vfsmgr.c

index a64bc7853fc22af60aa1a0bdc48e276c960bbecc..41ff2edb3a720ad1f522d458cbf1f83b12b01ba3 100644 (file)
@@ -194,9 +194,9 @@ dvr_disk_space_cleanup(dvr_config_t *cfg, int include_active)
   dvfs = dvr_vfs_find(NULL, tvh_fsid(diskdata.f_fsid));
 
   filesystemId  = tvh_fsid(diskdata.f_fsid);
-  availBytes    = diskdata.f_bsize * (int64_t)diskdata.f_bavail;
+  availBytes    = diskdata.f_frsize * (int64_t)diskdata.f_bavail;
   requiredBytes = MIB(cfg->dvr_cleanup_threshold_free);
-  diskBytes     = diskdata.f_bsize * (int64_t)diskdata.f_blocks;
+  diskBytes     = diskdata.f_frsize * (int64_t)diskdata.f_blocks;
   usedBytes     = dvfs->used_size;
   maximalBytes  = MIB(cfg->dvr_cleanup_threshold_used);
   configName    = cfg != dvr_config_find_by_name(NULL) ? cfg->dvr_config_name : "Default profile";
@@ -320,7 +320,7 @@ dvr_disk_space_check()
     {
       dvfs = dvr_vfs_find(NULL, tvh_fsid(diskdata.f_fsid));
 
-      availBytes = diskdata.f_bsize * (int64_t)diskdata.f_bavail;
+      availBytes = diskdata.f_frsize * (int64_t)diskdata.f_bavail;
       usedBytes = dvfs->used_size;
       requiredBytes = MIB(cfg->dvr_cleanup_threshold_free);
       maximalBytes = MIB(cfg->dvr_cleanup_threshold_used);
@@ -385,8 +385,8 @@ dvr_get_disk_space_update(const char *path, int locked)
     pthread_mutex_unlock(&global_lock);
 
   pthread_mutex_lock(&dvr_disk_space_mutex);
-  dvr_bfree = diskdata.f_bsize * (int64_t)diskdata.f_bavail;
-  dvr_btotal = diskdata.f_bsize * (int64_t)diskdata.f_blocks;
+  dvr_bfree = diskdata.f_frsize * (int64_t)diskdata.f_bavail;
+  dvr_btotal = diskdata.f_frsize * (int64_t)diskdata.f_blocks;
   dvr_bused = dvfs ? dvfs->used_size : 0;
   pthread_mutex_unlock(&dvr_disk_space_mutex);
 }
@@ -444,7 +444,7 @@ dvr_vfs_rec_start_check(dvr_config_t *cfg)
   lock_assert(&global_lock);
   if (!cfg || !cfg->dvr_enabled || statvfs(cfg->dvr_storage, &diskdata) == -1)
     return 0;
-  availBytes    = diskdata.f_bsize * (int64_t)diskdata.f_bavail;
+  availBytes    = diskdata.f_frsize * (int64_t)diskdata.f_bavail;
   requiredBytes = MIB(cfg->dvr_cleanup_threshold_free);
   maximalBytes  = MIB(cfg->dvr_cleanup_threshold_used);
   dvfs          = dvr_vfs_find(NULL, tvh_fsid(diskdata.f_fsid));