diff --git a/changelogs/fragments/83480-fix-support-discard.yml b/changelogs/fragments/83480-fix-support-discard.yml new file mode 100644 index 00000000000..8cedf8206b6 --- /dev/null +++ b/changelogs/fragments/83480-fix-support-discard.yml @@ -0,0 +1,6 @@ +--- +bugfixes: + - facts - `support_discard` now returns `0` if either `discard_granularity` + or `discard_max_hw_bytes` is zero; otherwise it returns the value of + `discard_granularity`, as before + (https://github.com/ansible/ansible/pull/83480). diff --git a/lib/ansible/module_utils/facts/hardware/linux.py b/lib/ansible/module_utils/facts/hardware/linux.py index cd0f41dcc26..abd8dd5c617 100644 --- a/lib/ansible/module_utils/facts/hardware/linux.py +++ b/lib/ansible/module_utils/facts/hardware/linux.py @@ -773,10 +773,24 @@ class LinuxHardware(Hardware): if serial: d['serial'] = serial - for key, test in [('removable', '/removable'), - ('support_discard', '/queue/discard_granularity'), - ]: - d[key] = get_file_content(sysdir + test) + d['removable'] = get_file_content(sysdir + '/removable') + + # Historically, `support_discard` simply returned the value of + # `/sys/block/{device}/queue/discard_granularity`. When its value + # is `0`, then the block device doesn't support discards; + # _however_, it being greater than zero doesn't necessarily mean + # that the block device _does_ support discards. + # + # Another indication that a block device doesn't support discards + # is `/sys/block/{device}/queue/discard_max_hw_bytes` being equal + # to `0` (with the same caveat as above). So if either of those are + # `0`, set `support_discard` to zero, otherwise set it to the value + # of `discard_granularity` for backwards compatibility. + d['support_discard'] = ( + '0' + if get_file_content(sysdir + '/queue/discard_max_hw_bytes') == '0' + else get_file_content(sysdir + '/queue/discard_granularity') + ) if diskname in devs_wwn: d['wwn'] = devs_wwn[diskname]