From a3f6d2f593a4d278daf9ba3a1ba30bae38d8396a Mon Sep 17 00:00:00 2001 From: Peter Rajnoha Date: Thu, 19 Sep 2024 12:39:46 +0200 Subject: [PATCH] dev-type: get swap device size from blkid using FSSIZE blkid does not report FSBLOCKSIZE and FSLASTBLOCK for a swap device, because it is not a proper filesystem and it only contains a header marking such devices for use as a swap device. However, blkid does report FSSIZE for swap devices, so use this field instead to set the "filesystem last block" which is used subsequently for further calculations and conditions. --- lib/device/dev-type.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/device/dev-type.c b/lib/device/dev-type.c index c7c2a838d..d0715a474 100644 --- a/lib/device/dev-type.c +++ b/lib/device/dev-type.c @@ -913,16 +913,27 @@ int fs_get_blkid(const char *pathname, struct fs_info *fsi) if (!blkid_probe_lookup_value(probe, "BLOCK_SIZE", &str, &len) && len) fsi->fs_block_size_bytes = atoi(str); - if (!blkid_probe_lookup_value(probe, "FSLASTBLOCK", &str, &len) && len) - fslastblock = strtoull(str, NULL, 0); - if (!blkid_probe_lookup_value(probe, "FSBLOCKSIZE", &str, &len) && len) fsblocksize = (unsigned int)atoi(str); - blkid_free_probe(probe); + if (!strcmp(fsi->fstype, "swap")) { + /* + * For swap, there's no FSLASTBLOCK. + * We can use FSSIZE (size of the usable swap area) + FSBLOCKSIZE (size of the swap header) + */ + if (!blkid_probe_lookup_value(probe, "FSSIZE", &str, &len) && len) + fsi->fs_last_byte = strtoull(str, NULL, 0); - if (fslastblock && fsblocksize) - fsi->fs_last_byte = fslastblock * fsblocksize; + fsi->fs_last_byte += fsblocksize; + } else { + if (!blkid_probe_lookup_value(probe, "FSLASTBLOCK", &str, &len) && len) + fslastblock = strtoull(str, NULL, 0); + + if (fslastblock && fsblocksize) + fsi->fs_last_byte = fslastblock * fsblocksize; + } + + blkid_free_probe(probe); log_debug("libblkid TYPE %s BLOCK_SIZE %d FSLASTBLOCK %llu FSBLOCKSIZE %u fs_last_byte %llu", fsi->fstype, fsi->fs_block_size_bytes, (unsigned long long)fslastblock, fsblocksize,