@@ -178,19 +178,6 @@ func (p *PoolDevice) CreateSnapshotDevice(ctx context.Context, deviceName string
178178 return errors .Wrapf (err , "failed to query device metadata for %q" , deviceName )
179179 }
180180
181- // Suspend thin device if it was activated previously to avoid corruptions
182- isActivated := p .IsActivated (baseInfo .Name )
183- if isActivated {
184- if err := p .suspendDevice (ctx , baseInfo ); err != nil {
185- return err
186- }
187-
188- // Resume back base thin device on exit
189- defer func () {
190- retErr = multierror .Append (retErr , p .resumeDevice (ctx , baseInfo )).ErrorOrNil ()
191- }()
192- }
193-
194181 snapInfo := & DeviceInfo {
195182 Name : snapshotName ,
196183 Size : virtualSizeBytes ,
@@ -230,26 +217,6 @@ func (p *PoolDevice) CreateSnapshotDevice(ctx context.Context, deviceName string
230217 return p .activateDevice (ctx , snapInfo )
231218}
232219
233- func (p * PoolDevice ) suspendDevice (ctx context.Context , info * DeviceInfo ) error {
234- if err := p .transition (ctx , info .Name , Suspending , Suspended , func () error {
235- return dmsetup .SuspendDevice (info .Name )
236- }); err != nil {
237- return errors .Wrapf (err , "failed to suspend device %q" , info .Name )
238- }
239-
240- return nil
241- }
242-
243- func (p * PoolDevice ) resumeDevice (ctx context.Context , info * DeviceInfo ) error {
244- if err := p .transition (ctx , info .Name , Resuming , Resumed , func () error {
245- return dmsetup .ResumeDevice (info .Name )
246- }); err != nil {
247- return errors .Wrapf (err , "failed to resume device %q" , info .Name )
248- }
249-
250- return nil
251- }
252-
253220func (p * PoolDevice ) createSnapshot (ctx context.Context , baseInfo , snapInfo * DeviceInfo ) error {
254221 if err := p .transition (ctx , snapInfo .Name , Creating , Created , func () error {
255222 return dmsetup .CreateSnapshot (p .poolName , snapInfo .DeviceID , baseInfo .DeviceID )
@@ -265,16 +232,30 @@ func (p *PoolDevice) createSnapshot(ctx context.Context, baseInfo, snapInfo *Dev
265232 return nil
266233}
267234
235+ // SuspendDevice flushes the outstanding IO and blocks the further IO
236+ func (p * PoolDevice ) SuspendDevice (ctx context.Context , deviceName string ) error {
237+ if err := p .transition (ctx , deviceName , Suspending , Suspended , func () error {
238+ return dmsetup .SuspendDevice (deviceName )
239+ }); err != nil {
240+ return errors .Wrapf (err , "failed to suspend device %q" , deviceName )
241+ }
242+
243+ return nil
244+ }
245+
268246// DeactivateDevice deactivates thin device
269- func (p * PoolDevice ) DeactivateDevice (ctx context.Context , deviceName string , deferred bool ) error {
270- if ! p .IsActivated (deviceName ) {
247+ func (p * PoolDevice ) DeactivateDevice (ctx context.Context , deviceName string , deferred , withForce bool ) error {
248+ if ! p .IsLoaded (deviceName ) {
271249 return nil
272250 }
273251
274- opts := []dmsetup.RemoveDeviceOpt {dmsetup .RemoveWithForce , dmsetup . RemoveWithRetries }
252+ opts := []dmsetup.RemoveDeviceOpt {dmsetup .RemoveWithRetries }
275253 if deferred {
276254 opts = append (opts , dmsetup .RemoveDeferred )
277255 }
256+ if withForce {
257+ opts = append (opts , dmsetup .RemoveWithForce )
258+ }
278259
279260 if err := p .transition (ctx , deviceName , Deactivating , Deactivated , func () error {
280261 return dmsetup .RemoveDevice (deviceName , opts ... )
@@ -300,6 +281,12 @@ func (p *PoolDevice) IsActivated(deviceName string) bool {
300281 return true
301282}
302283
284+ // IsLoaded returns true if thin-device is visible for dmsetup
285+ func (p * PoolDevice ) IsLoaded (deviceName string ) bool {
286+ _ , err := dmsetup .Info (deviceName )
287+ return err == nil
288+ }
289+
303290// GetUsage reports total size in bytes consumed by a thin-device.
304291// It relies on the number of used blocks reported by 'dmsetup status'.
305292// The output looks like:
@@ -330,7 +317,7 @@ func (p *PoolDevice) RemoveDevice(ctx context.Context, deviceName string) error
330317 return errors .Wrapf (err , "can't query metadata for device %q" , deviceName )
331318 }
332319
333- if err := p .DeactivateDevice (ctx , deviceName , true ); err != nil {
320+ if err := p .DeactivateDevice (ctx , deviceName , true , true ); err != nil {
334321 return err
335322 }
336323
@@ -368,7 +355,7 @@ func (p *PoolDevice) RemovePool(ctx context.Context) error {
368355
369356 // Deactivate devices if any
370357 for _ , name := range deviceNames {
371- if err := p .DeactivateDevice (ctx , name , true ); err != nil {
358+ if err := p .DeactivateDevice (ctx , name , true , true ); err != nil {
372359 result = multierror .Append (result , errors .Wrapf (err , "failed to remove %q" , name ))
373360 }
374361 }
0 commit comments