diff --git a/changelogs/fragments/filesystem-xfs-resize-slack.yml b/changelogs/fragments/filesystem-xfs-resize-slack.yml new file mode 100644 index 0000000000..9292a9a289 --- /dev/null +++ b/changelogs/fragments/filesystem-xfs-resize-slack.yml @@ -0,0 +1,2 @@ +bugfixes: + - filesystem - avoid false positive change detection on XFS resize due to unusable slack space (https://github.com/ansible-collections/community.general/pull/11033). diff --git a/plugins/modules/filesystem.py b/plugins/modules/filesystem.py index 2a4748b5dc..a52873c0e4 100644 --- a/plugins/modules/filesystem.py +++ b/plugins/modules/filesystem.py @@ -207,6 +207,7 @@ class Filesystem: MKFS_SET_UUID_EXTRA_OPTIONS: list[str] | None = [] INFO: str | None = None GROW: str | None = None + GROW_SLACK: int = 0 GROW_MAX_SPACE_FLAGS: list[str] | None = [] GROW_MOUNTPOINT_ONLY = False CHANGE_UUID: str | None = None @@ -275,7 +276,7 @@ class Filesystem: self.module.warn(f"unable to process {self.INFO} output '{err}'") self.module.fail_json(msg=f"unable to process {self.INFO} output for {dev}") - if not fssize_in_bytes < devsize_in_bytes: + if fssize_in_bytes + self.GROW_SLACK >= devsize_in_bytes: self.module.exit_json(changed=False, msg=f"{self.fstype} filesystem is using the whole device {dev}") elif self.module.check_mode: self.module.exit_json(changed=True, msg=f"resizing filesystem {self.fstype} on device {dev}") @@ -355,6 +356,10 @@ class XFS(Filesystem): MKFS_FORCE_FLAGS = ["-f"] INFO = "xfs_info" GROW = "xfs_growfs" + # XFS (defaults with 4KiB blocksize) requires at least 64 block of free + # space to add a new allocation group, avoid resizing (noop, but shown as + # diff) if the difference between the filesystem and the device is less + GROW_SLACK = 64 * 4096 - 1 GROW_MOUNTPOINT_ONLY = True CHANGE_UUID = "xfs_admin" CHANGE_UUID_OPTION = "-U"