admin: Write out correct version fields in boot/loader/entries files
Before, we were writing the "bootversion", which is either 0 or 1, for all entries. This is completely wrong; the idea of the "version" field is to compare between entries. Fix this by writing out the inverted index - internally, index 0 is the *first* boot entry, so we give it the highest version number, and index N is the last, so give it version 0. Then fix the deployment sorting code to correctly reverse the version number comparison, so we read back the right order. In practice before this bug didn't matter because "normally" you only have at most two deployments. https://bugzilla.gnome.org/show_bug.cgi?id=706546
This commit is contained in:
1 parent
7e2e072ad4
commit
8abad0b452
3 files changed
+27
-10
No files matched your search
@@ -791,10 +791,16 @@ parse_os_release (const char *contents,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* install_deployment_kernel:
|
||||
*
|
||||
* Write out an entry in /boot/loader/entries for @deployment.
|
||||
*/
|
||||
static gboolean
|
||||
install_deployment_kernel (GFile *sysroot,
|
||||
int new_bootversion,
|
||||
OtDeployment *deployment,
|
||||
guint n_deployments,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
|
||||
@@ -901,7 +907,7 @@ install_deployment_kernel (GFile *sysroot,
|
||||
val);
|
||||
ot_config_parser_set (bootconfig, "title", title_key);
|
||||
|
||||
version_key = g_strdup_printf ("%d", ot_deployment_get_bootserial (deployment));
|
||||
version_key = g_strdup_printf ("%d", n_deployments - ot_deployment_get_index (deployment));
|
||||
ot_config_parser_set (bootconfig, "version", version_key);
|
||||
|
||||
linux_relpath = g_file_get_relative_path (bootdir, dest_kernel_path);
|
||||
@@ -1000,7 +1006,8 @@ ot_admin_write_deployments (GFile *sysroot,
|
||||
for (i = 0; i < new_deployments->len; i++)
|
||||
{
|
||||
OtDeployment *deployment = new_deployments->pdata[i];
|
||||
if (!install_deployment_kernel (sysroot, new_bootversion, deployment,
|
||||
if (!install_deployment_kernel (sysroot, new_bootversion,
|
||||
deployment, new_deployments->len,
|
||||
cancellable, error))
|
||||
{
|
||||
g_prefix_error (error, "Installing kernel: ");
|
||||
|
||||
@@ -717,8 +717,8 @@ list_deployments_process_one_boot_entry (GFile *sysroot,
|
||||
}
|
||||
|
||||
static gint
|
||||
compare_deployments_by_boot_loader_version (gconstpointer a_pp,
|
||||
gconstpointer b_pp)
|
||||
compare_deployments_by_boot_loader_version_reversed (gconstpointer a_pp,
|
||||
gconstpointer b_pp)
|
||||
{
|
||||
OtDeployment *a = *((OtDeployment**)a_pp);
|
||||
OtDeployment *b = *((OtDeployment**)b_pp);
|
||||
@@ -728,11 +728,15 @@ compare_deployments_by_boot_loader_version (gconstpointer a_pp,
|
||||
const char *b_version = ot_config_parser_get (b_bootconfig, "version");
|
||||
|
||||
if (a_version && b_version)
|
||||
return strverscmp (a_version, b_version);
|
||||
{
|
||||
int r = strverscmp (a_version, b_version);
|
||||
/* Reverse */
|
||||
return -r;
|
||||
}
|
||||
else if (a_version)
|
||||
return 1;
|
||||
else
|
||||
return -1;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
gboolean
|
||||
@@ -766,7 +770,7 @@ ot_admin_list_deployments (GFile *sysroot,
|
||||
goto out;
|
||||
}
|
||||
|
||||
g_ptr_array_sort (ret_deployments, compare_deployments_by_boot_loader_version);
|
||||
g_ptr_array_sort (ret_deployments, compare_deployments_by_boot_loader_version_reversed);
|
||||
for (i = 0; i < ret_deployments->len; i++)
|
||||
{
|
||||
OtDeployment *deployment = ret_deployments->pdata[i];
|
||||
|
||||
Reference in new issue
Block a user