From c303750ecb89b7210fe998515432e358b3cc0cff Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Mon, 3 Feb 2025 13:07:37 +0100 Subject: Correctly calculate kernel size in /boot Change the code to get the size from the existing vmlinuz, rather than using the package size, which only worked in Ubuntu, and possibly not on all kernel packages either. Refactor the code a bit to avoid the nested if as well, and use off_t to measure and sum the sizes before switching to floating point. Closes: #1085184 --- apt-pkg/depcache.cc | 57 +++++++++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 32 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index fcc974ae3..c8999093b 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -2640,7 +2640,6 @@ bool pkgDepCache::PhasingApplied(pkgCache::PkgIterator Pkg) const // DepCache::BootSize /*{{{*/ double pkgDepCache::BootSize(bool initrdOnly) { - double BootSize = 0; int BootCount = 0; auto VirtualKernelPkg = FindPkg("$kernel", "any"); if (VirtualKernelPkg.end()) @@ -2650,44 +2649,38 @@ double pkgDepCache::BootSize(bool initrdOnly) { auto Pkg = Prv.OwnerPkg(); if ((*this)[Pkg].NewInstall()) - BootSize += (*this)[Pkg].InstallVer->InstalledSize, BootCount++; + BootCount++; } if (BootCount == 0) return 0; - if (initrdOnly) - BootSize = 0; DIR *boot = opendir(_config->FindDir("Dir::Boot").c_str()); - struct dirent *ent; - if (boot) - { - double initrdSize = 0; - double mapSize = 0; - while ((ent = readdir(boot))) - { - enum - { - INITRD, - MAP - } type; - if (APT::String::Startswith(ent->d_name, "initrd.img-")) - type = INITRD; - else if (APT::String::Startswith(ent->d_name, "System.map-")) - type = MAP; - else - continue; + if (not boot) + return 0; - auto path = _config->FindDir("Dir::Boot") + ent->d_name; + enum + { + VMLINUZ, + INITRD, + MAP, + MAX_ARTEFACT, + } type; + off_t sizes[MAX_ARTEFACT]{}; + while (struct dirent *ent = readdir(boot)) + { + if (APT::String::Startswith(ent->d_name, "initrd.img-")) + type = INITRD; + else if (APT::String::Startswith(ent->d_name, "System.map-")) + type = MAP; + else if (not initrdOnly && APT::String::Startswith(ent->d_name, "vmlinuz-")) + type = VMLINUZ; + else + continue; - if (struct stat st; stat(path.c_str(), &st) == 0) - { - double &targetSize = type == INITRD ? initrdSize : mapSize; - targetSize = std::max(targetSize, double(st.st_size)); - } - } - closedir(boot); - return initrdSize ? BootSize + BootCount * (initrdSize + mapSize) * 1.1 : 0; + if (struct stat st; fstatat(dirfd(boot), ent->d_name, &st, 0) == 0) + sizes[type] = std::max(sizes[type], st.st_size); } - return 0; + closedir(boot); + return std::accumulate(sizes, sizes + MAX_ARTEFACT, off_t{0}) * 1.1 * BootCount; } /*}}}*/ -- cgit v1.2.3-70-g09d2 From 452586e84ad54ca23dee399bf9809c49e7171f36 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Mon, 3 Feb 2025 13:19:12 +0100 Subject: Measure BootSize as integer I don't know why I used a double here this is awkward. --- apt-pkg/depcache.cc | 4 ++-- apt-pkg/depcache.h | 2 +- apt-private/private-install.cc | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index c8999093b..ef93a54bb 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -2638,7 +2638,7 @@ bool pkgDepCache::PhasingApplied(pkgCache::PkgIterator Pkg) const /*}}}*/ // DepCache::BootSize /*{{{*/ -double pkgDepCache::BootSize(bool initrdOnly) +unsigned long long pkgDepCache::BootSize(bool initrdOnly) { int BootCount = 0; auto VirtualKernelPkg = FindPkg("$kernel", "any"); @@ -2681,6 +2681,6 @@ double pkgDepCache::BootSize(bool initrdOnly) sizes[type] = std::max(sizes[type], st.st_size); } closedir(boot); - return std::accumulate(sizes, sizes + MAX_ARTEFACT, off_t{0}) * 1.1 * BootCount; + return std::accumulate(sizes, sizes + MAX_ARTEFACT, off_t{0}) * BootCount * 110 / 100; } /*}}}*/ diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h index 49ef4f441..8d50d6fc6 100644 --- a/apt-pkg/depcache.h +++ b/apt-pkg/depcache.h @@ -491,7 +491,7 @@ class APT_PUBLIC pkgDepCache : protected pkgCache::Namespace bool CheckConsistency(char const *const msgtag = ""); #ifdef APT_COMPILING_APT - double BootSize(bool initrdOnly); + unsigned long long BootSize(bool initrdOnly); #endif protected: // methods call by IsInstallOk diff --git a/apt-private/private-install.cc b/apt-private/private-install.cc index 3f05cf9fb..208a27749 100644 --- a/apt-private/private-install.cc +++ b/apt-private/private-install.cc @@ -348,8 +348,8 @@ bool InstallPackages(CacheFile &Cache, APT::PackageVector &HeldBackPackages, boo if (statvfs(_config->FindDir("Dir::Usr").c_str(), &st) == 0) { struct statvfs st_boot; - double BootSize = 0; - double InitrdSize = 0; + unsigned long long BootSize = 0; + unsigned long long InitrdSize = 0; if (statvfs(_config->FindDir("Dir::Boot").c_str(), &st_boot) == 0 && st_boot.f_fsid != st.f_fsid) BootSize = Cache->BootSize(false); else -- cgit v1.2.3-70-g09d2