From ec6ba65392d189fc3e7a371aa356d3de5d66012b Mon Sep 17 00:00:00 2001 From: Arne Wiebalck Date: Wed, 1 Mar 2023 14:02:47 +0100 Subject: [PATCH] Use direct writes when erasing the GPT Use direct I/O when overwriting the partition table to expose device failures (which would not be directly noticed otherwise). Change-Id: Ib0790099d895410681e4a1679bedea62209ff277 --- ironic_lib/disk_utils.py | 5 +++-- ironic_lib/tests/test_disk_utils.py | 20 +++++++++---------- ...dd-async-gpt-erasure-bbc6b084b0344d30.yaml | 6 ++++++ 3 files changed, 19 insertions(+), 12 deletions(-) create mode 100644 releasenotes/notes/fix-dd-async-gpt-erasure-bbc6b084b0344d30.yaml diff --git a/ironic_lib/disk_utils.py b/ironic_lib/disk_utils.py index 736d180e..94e3a4cc 100644 --- a/ironic_lib/disk_utils.py +++ b/ironic_lib/disk_utils.py @@ -627,7 +627,7 @@ def destroy_disk_metadata(dev, node_uuid): if dev_size < GPT_SIZE_SECTORS: dd_count = 'count=%s' % dev_size utils.execute('dd', 'bs=512', 'if=/dev/zero', dd_device, dd_count, - run_as_root=True, use_standard_locale=True) + 'oflag=direct', run_as_root=True, use_standard_locale=True) # Overwrite the Secondary GPT, do this only if there could be one if dev_size > GPT_SIZE_SECTORS: @@ -635,7 +635,8 @@ def destroy_disk_metadata(dev, node_uuid): dd_seek = 'seek=%i' % gpt_backup dd_count = 'count=%s' % GPT_SIZE_SECTORS utils.execute('dd', 'bs=512', 'if=/dev/zero', dd_device, dd_count, - dd_seek, run_as_root=True, use_standard_locale=True) + 'oflag=direct', dd_seek, run_as_root=True, + use_standard_locale=True) # Go ahead and let sgdisk run as well. utils.execute('sgdisk', '-Z', dev, run_as_root=True, diff --git a/ironic_lib/tests/test_disk_utils.py b/ironic_lib/tests/test_disk_utils.py index 4d96d095..305ba8b7 100644 --- a/ironic_lib/tests/test_disk_utils.py +++ b/ironic_lib/tests/test_disk_utils.py @@ -401,12 +401,12 @@ class DestroyMetaDataTestCase(base.IronicLibTestCase): mock.call('blockdev', '--getsz', 'fake-dev', run_as_root=True), mock.call('dd', 'bs=512', 'if=/dev/zero', - 'of=fake-dev', 'count=33', + 'of=fake-dev', 'count=33', 'oflag=direct', run_as_root=True, use_standard_locale=True), mock.call('dd', 'bs=512', 'if=/dev/zero', - 'of=fake-dev', 'count=33', 'seek=991', - run_as_root=True, + 'of=fake-dev', 'count=33', 'oflag=direct', + 'seek=991', run_as_root=True, use_standard_locale=True), mock.call('sgdisk', '-Z', 'fake-dev', run_as_root=True, @@ -436,12 +436,12 @@ class DestroyMetaDataTestCase(base.IronicLibTestCase): mock.call('blockdev', '--getsz', 'fake-dev', run_as_root=True), mock.call('dd', 'bs=512', 'if=/dev/zero', - 'of=fake-dev', 'count=33', + 'of=fake-dev', 'count=33', 'oflag=direct', run_as_root=True, use_standard_locale=True), mock.call('dd', 'bs=512', 'if=/dev/zero', - 'of=fake-dev', 'count=33', 'seek=991', - run_as_root=True, + 'of=fake-dev', 'count=33', 'oflag=direct', + 'seek=991', run_as_root=True, use_standard_locale=True), mock.call('sgdisk', '-Z', 'fake-dev', run_as_root=True, @@ -484,7 +484,7 @@ class DestroyMetaDataTestCase(base.IronicLibTestCase): mock.call('blockdev', '--getsz', 'fake-dev', run_as_root=True), mock.call('dd', 'bs=512', 'if=/dev/zero', - 'of=fake-dev', 'count=2', + 'of=fake-dev', 'count=2', 'oflag=direct', run_as_root=True, use_standard_locale=True), mock.call('sgdisk', '-Z', 'fake-dev', @@ -507,12 +507,12 @@ class DestroyMetaDataTestCase(base.IronicLibTestCase): mock.call('blockdev', '--getsz', 'fake-dev', run_as_root=True), mock.call('dd', 'bs=512', 'if=/dev/zero', - 'of=fake-dev', 'count=33', + 'of=fake-dev', 'count=33', 'oflag=direct', run_as_root=True, use_standard_locale=True), mock.call('dd', 'bs=512', 'if=/dev/zero', - 'of=fake-dev', 'count=33', 'seek=9', - run_as_root=True, + 'of=fake-dev', 'count=33', 'oflag=direct', + 'seek=9', run_as_root=True, use_standard_locale=True), mock.call('sgdisk', '-Z', 'fake-dev', run_as_root=True, diff --git a/releasenotes/notes/fix-dd-async-gpt-erasure-bbc6b084b0344d30.yaml b/releasenotes/notes/fix-dd-async-gpt-erasure-bbc6b084b0344d30.yaml new file mode 100644 index 00000000..8c64a3f1 --- /dev/null +++ b/releasenotes/notes/fix-dd-async-gpt-erasure-bbc6b084b0344d30.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Fixes a bug when erasing a partition table: the corresponding I/O needs + to be synchronous in order to avoid masking failed write requests to + broken devices.