It is the minimum of 5% of disk capacity or 20 MiB on a per-partition basis.

Signed-off-by: Dan McGee <[email protected]>
---
 lib/libalpm/diskspace.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/lib/libalpm/diskspace.c b/lib/libalpm/diskspace.c
index 5ed8e0b..bf5d389 100644
--- a/lib/libalpm/diskspace.c
+++ b/lib/libalpm/diskspace.c
@@ -294,10 +294,15 @@ int _alpm_check_diskspace(pmtrans_t *trans, pmdb_t 
*db_local)
        for(i = mount_points; i; i = alpm_list_next(i)) {
                alpm_mountpoint_t *data = i->data;
                if(data->used == 1) {
-                       _alpm_log(PM_LOG_DEBUG, "partition %s, needed %ld, free 
%ld\n",
-                                       data->mount_dir, 
data->max_blocks_needed,
+                       /* cushion is min(5% capacity, 20MiB) */
+                       long fivepc = data->fsp.f_blocks / 20;
+                       long twentymb = 20 * 1024 * 1024 / data->fsp.f_bsize;
+                       long cushion = fivepc < twentymb ? fivepc : twentymb;
+
+                       _alpm_log(PM_LOG_DEBUG, "partition %s, needed %ld, 
cushion %ld, free %ld\n",
+                                       data->mount_dir, 
data->max_blocks_needed, cushion,
                                        (unsigned long)data->fsp.f_bfree);
-                       if(data->max_blocks_needed > data->fsp.f_bfree) {
+                       if(data->max_blocks_needed + cushion > 
data->fsp.f_bfree) {
                                abort = 1;
                        }
                }
-- 
1.7.3.3


Reply via email to