From 51a72f04923e847f5d6f326ba3941f222d7eb5bf Mon Sep 17 00:00:00 2001 From: Jeremy Williams Date: Tue, 2 Mar 2021 14:51:14 -0500 Subject: [PATCH] mark device faulty after parent fails to suspend When an error is returned here, unlike the other error returns in the function, nothing is done to mark the added device as faulty or remove it. I have observed this causing future snapshot creations to continue to attempt to use the same ID (from the sequence) to create new devices and get blocked because the device already exists because it was not rolled back here. Hopefully fixes #5110 Signed-off-by: Jeremy Williams --- snapshots/devmapper/pool_device.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/snapshots/devmapper/pool_device.go b/snapshots/devmapper/pool_device.go index 9d0745fcb..a4c9f47d4 100644 --- a/snapshots/devmapper/pool_device.go +++ b/snapshots/devmapper/pool_device.go @@ -331,12 +331,6 @@ func (p *PoolDevice) CreateSnapshotDevice(ctx context.Context, deviceName string } }() - // Save snapshot metadata and allocate new device ID - metaErr = p.metadata.AddDevice(ctx, snapInfo) - if metaErr != nil { - return metaErr - } - // The base device must be suspend before taking a snapshot to // avoid corruption. // https://github.com/torvalds/linux/blob/v5.7/Documentation/admin-guide/device-mapper/thin-provisioning.rst#internal-snapshots @@ -354,6 +348,12 @@ func (p *PoolDevice) CreateSnapshotDevice(ctx context.Context, deviceName string }() } + // Save snapshot metadata and allocate new device ID + metaErr = p.metadata.AddDevice(ctx, snapInfo) + if metaErr != nil { + return metaErr + } + // Create thin device snapshot devErr = p.createSnapshot(ctx, baseInfo, snapInfo) if devErr != nil {