diff options
| author | Julian Andres Klode <jak@debian.org> | 2025-02-03 12:42:13 +0000 |
|---|---|---|
| committer | Julian Andres Klode <jak@debian.org> | 2025-02-03 12:42:13 +0000 |
| commit | 70a325116f002d476bd9bb018f3032ada5da0da2 (patch) | |
| tree | 7db1a71ec3a10cf390a75d8ed1107655363e8e8c /apt-pkg/depcache.cc | |
| parent | 4137efbb2ec78bd3c8b8263ff20134d7fdc6f75b (diff) | |
| parent | 452586e84ad54ca23dee399bf9809c49e7171f36 (diff) | |
Merge branch 'boot-space-2' into 'main'
Correctly calculate kernel size in /boot
See merge request apt-team/apt!444
Diffstat (limited to 'apt-pkg/depcache.cc')
| -rw-r--r-- | apt-pkg/depcache.cc | 59 |
1 files changed, 26 insertions, 33 deletions
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index fcc974ae3..ef93a54bb 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -2638,9 +2638,8 @@ bool pkgDepCache::PhasingApplied(pkgCache::PkgIterator Pkg) const /*}}}*/ // DepCache::BootSize /*{{{*/ -double pkgDepCache::BootSize(bool initrdOnly) +unsigned long long 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}) * BootCount * 110 / 100; } /*}}}*/ |
