@@ -188,9 +188,8 @@ func (p *PoolDevice) CreateSnapshotDevice(ctx context.Context, deviceName string
188188 return errors .Wrapf (err , "failed to query device metadata for %q" , deviceName )
189189 }
190190
191- isActivated := baseInfo .State == Activated
192-
193191 // Suspend thin device if it was activated previously
192+ isActivated := p .IsActivated (baseInfo .Name )
194193 if isActivated {
195194 if err := p .transition (ctx , baseInfo .Name , Suspending , Suspended , func () error {
196195 return dmsetup .SuspendDevice (baseInfo .Name )
@@ -245,13 +244,8 @@ func (p *PoolDevice) CreateSnapshotDevice(ctx context.Context, deviceName string
245244
246245// DeactivateDevice deactivates thin device
247246func (p * PoolDevice ) DeactivateDevice (ctx context.Context , deviceName string , deferred bool ) error {
248- devicePath := dmsetup .GetFullDevicePath (deviceName )
249- if _ , err := os .Stat (devicePath ); err != nil {
250- if os .IsNotExist (err ) {
251- return ErrNotFound
252- }
253-
254- return err
247+ if ! p .IsActivated (deviceName ) {
248+ return nil
255249 }
256250
257251 opts := []dmsetup.RemoveDeviceOpt {dmsetup .RemoveWithForce , dmsetup .RemoveWithRetries }
@@ -268,14 +262,29 @@ func (p *PoolDevice) DeactivateDevice(ctx context.Context, deviceName string, de
268262 return nil
269263}
270264
265+ // IsActivated returns true if thin-device is activated and not suspended
266+ func (p * PoolDevice ) IsActivated (deviceName string ) bool {
267+ infos , err := dmsetup .Info (deviceName )
268+ if err != nil || len (infos ) == 0 {
269+ // Couldn't query device info, device not active
270+ return false
271+ }
272+
273+ if devInfo := infos [0 ]; devInfo .Suspended {
274+ return false
275+ }
276+
277+ return true
278+ }
279+
271280// RemoveDevice completely wipes out thin device from thin-pool and frees it's device ID
272281func (p * PoolDevice ) RemoveDevice (ctx context.Context , deviceName string ) error {
273282 info , err := p .metadata .GetDevice (ctx , deviceName )
274283 if err != nil {
275284 return errors .Wrapf (err , "can't query metadata for device %q" , deviceName )
276285 }
277286
278- if err := p .DeactivateDevice (ctx , deviceName , true ); err != nil && err != ErrNotFound {
287+ if err := p .DeactivateDevice (ctx , deviceName , true ); err != nil {
279288 return err
280289 }
281290
@@ -305,7 +314,7 @@ func (p *PoolDevice) RemovePool(ctx context.Context) error {
305314
306315 // Deactivate devices if any
307316 for _ , name := range deviceNames {
308- if err := p .DeactivateDevice (ctx , name , true ); err != nil && err != ErrNotFound {
317+ if err := p .DeactivateDevice (ctx , name , true ); err != nil {
309318 result = multierror .Append (result , errors .Wrapf (err , "failed to remove %q" , name ))
310319 }
311320 }
0 commit comments