From: Julian Sparber Date: Thu, 12 Feb 2026 16:28:43 +0000 (+0100) Subject: repart-varlink: Calculate the size of foreign partitions X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9ee029c8f6e90985c417e7a6c0e0d69769777553;p=thirdparty%2Fsystemd.git repart-varlink: Calculate the size of foreign partitions To decide whether the disk is to small or has insufficient free space we need to know how much of the disk is filled with foreign partitions. The calculated size is used in a future commit. --- diff --git a/src/repart/repart.c b/src/repart/repart.c index 31e6413f23d..a3083ee1e12 100644 --- a/src/repart/repart.c +++ b/src/repart/repart.c @@ -10066,9 +10066,10 @@ static int determine_auto_size( Context *c, int level, uint64_t *ret_current_size, + uint64_t *ret_foreign_size, uint64_t *ret_minimal_size) { - uint64_t current_size, minimal_size; + uint64_t current_size, foreign_size, minimal_size; assert(c); @@ -10079,9 +10080,14 @@ static int determine_auto_size( else current_size = round_up_size(GPT_METADATA_SIZE, 4096); + foreign_size = 0; + LIST_FOREACH(partitions, p, c->partitions) { uint64_t m; + if (PARTITION_IS_FOREIGN(p)) + foreign_size += p->current_size; + if (PARTITION_EXISTS(p)) current_size += p->current_size; @@ -10108,6 +10114,8 @@ static int determine_auto_size( if (ret_current_size) *ret_current_size = current_size; + if (ret_foreign_size) + *ret_foreign_size = foreign_size; if (ret_minimal_size) *ret_minimal_size = minimal_size; @@ -10350,7 +10358,7 @@ static int vl_method_run( if (!context->node) { /* Check if space issue is caused by the whole disk being too small */ uint64_t minimal_size; - r = determine_auto_size(context, LOG_DEBUG, /* ret_current_size= */ NULL, &minimal_size); + r = determine_auto_size(context, LOG_DEBUG, /* ret_current_size= */ NULL, /* ret_foreign_size= */ NULL, &minimal_size); if (r < 0) return r; @@ -10363,7 +10371,7 @@ static int vl_method_run( if (r == -ENOSPC) { uint64_t current_size, minimal_size; - r = determine_auto_size(context, LOG_DEBUG, ¤t_size, &minimal_size); + r = determine_auto_size(context, LOG_DEBUG, ¤t_size, /* ret_foreign_size= */ NULL, &minimal_size); if (r < 0) return r; @@ -10391,7 +10399,7 @@ static int vl_method_run( uint64_t current_size, minimal_size; /* If we are doing a dry-run, report the minimal size. */ - r = determine_auto_size(context, LOG_DEBUG, ¤t_size, &minimal_size); + r = determine_auto_size(context, LOG_DEBUG, ¤t_size, /* ret_foreign_size= */ NULL, &minimal_size); if (r < 0) return r; @@ -10644,12 +10652,12 @@ static int run(int argc, char *argv[]) { return r; if (arg_node_none) { - (void) determine_auto_size(context, LOG_INFO, /* ret_current_size= */ NULL, /* ret_minimal_size= */ NULL); + (void) determine_auto_size(context, LOG_INFO, /* ret_current_size= */ NULL, /* ret_foreign_size= */ NULL, /* ret_minimal_size= */ NULL); return 0; } if (arg_size_auto) { - r = determine_auto_size(context, LOG_INFO, /* ret_current_size= */ NULL, &arg_size); + r = determine_auto_size(context, LOG_INFO, /* ret_current_size= */ NULL, /* ret_foreign_size= */ NULL, &arg_size); if (r < 0) return r; @@ -10674,7 +10682,7 @@ static int run(int argc, char *argv[]) { r = context_ponder(context); if (r == -ENOSPC) { /* When we hit space issues, tell the user the minimal size. */ - (void) determine_auto_size(context, LOG_INFO, /* ret_current_size= */ NULL, /* ret_minimal_size= */ NULL); + (void) determine_auto_size(context, LOG_INFO, /* ret_current_size= */ NULL, /* ret_foreign_size= */ NULL, /* ret_minimal_size= */ NULL); return r; } if (r < 0)