Skip to content

Commit 454408a

Browse files
committed
fix: remove encrypted dm device with linear dm if existing
ref: longhorn/longhorn 12842 Signed-off-by: James Lu <james.lu@suse.com>
1 parent 789b2a1 commit 454408a

4 files changed

Lines changed: 51 additions & 5 deletions

File tree

app/cmd/dmsetup/dmsetup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ func RemoveCmd() cli.Command {
188188
Usage: "Remove the device mapper device with the given name: remove --force --deferred <device name>",
189189
Action: func(c *cli.Context) {
190190
if err := remove(c); err != nil {
191-
logrus.WithError(err).Fatalf("Failed to create device %v with table %v", c.Args().First(), c.String("table"))
191+
logrus.WithError(err).Fatalf("Failed to remove device mapper device %v", c.Args().First())
192192
}
193193
},
194194
}

pkg/initiator/initiator.go

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,8 +1227,53 @@ func (i *Initiator) removeLinearDmDevice(force, deferred bool) error {
12271227
return err
12281228
}
12291229

1230-
i.logger.Info("Removing linear dm device")
1231-
return util.DmsetupRemove(i.Name, force, deferred, i.executor)
1230+
i.logger.Infof("Removing linear dm device %v", dmDevPath)
1231+
if err := util.DmsetupRemove(dmDevPath, force, deferred, i.executor); err != nil {
1232+
i.logger.WithError(err).Debugf("Failed to remove linear dm device: %v", dmDevPath)
1233+
if isRemoveDmDevNotFoundError(err) {
1234+
return nil
1235+
}
1236+
return err
1237+
}
1238+
1239+
// Encrypted volume will create another dm device with "-encrypted" suffix,
1240+
// and this dm device will block the removal of the linear dm device until it's removed.
1241+
// So we need to remove the encrypted dm device after the linear dm device,
1242+
encryptedDmDevPath := fmt.Sprintf("%s-encrypted", dmDevPath)
1243+
isEncryptedDmDevExist := true
1244+
if _, err := os.Stat(encryptedDmDevPath); err != nil {
1245+
if !os.IsNotExist(err) {
1246+
return err
1247+
}
1248+
isEncryptedDmDevExist = false
1249+
}
1250+
if isEncryptedDmDevExist {
1251+
executor, err := util.NewExecutor(commontypes.HostProcDirectory)
1252+
if err != nil {
1253+
return err
1254+
}
1255+
i.logger.Infof("Removing encrypted dm device %v", encryptedDmDevPath)
1256+
if err := util.DmsetupRemove(encryptedDmDevPath, true, true, executor); err != nil {
1257+
i.logger.WithError(err).Debugf("Failed to remove encrypted dm device: %s", encryptedDmDevPath)
1258+
if isRemoveDmDevNotFoundError(err) {
1259+
return nil
1260+
}
1261+
return err
1262+
}
1263+
}
1264+
1265+
return nil
1266+
}
1267+
1268+
func isRemoveDmDevNotFoundError(err error) bool {
1269+
if err == nil {
1270+
return false
1271+
}
1272+
1273+
errMsg := strings.ToLower(err.Error())
1274+
return strings.Contains(errMsg, "no such device or address") ||
1275+
strings.Contains(errMsg, "not found") ||
1276+
strings.Contains(errMsg, "no such file or directory")
12321277
}
12331278

12341279
func (i *Initiator) createLinearDmDevice() error {

pkg/types/types.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ const (
2424
ShallowCopyStateComplete = "complete"
2525
ShallowCopyStateError = "error"
2626

27-
ExecuteTimeout = 180 * time.Second
27+
ExecuteShortTimeout = 5 * time.Second
28+
ExecuteTimeout = 180 * time.Second
2829
)
2930

3031
const (

pkg/util/dmsetup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func DmsetupRemove(dmDeviceName string, force, deferred bool, executor *commonns
7171
if deferred {
7272
opts = append(opts, "--deferred")
7373
}
74-
_, err := executor.Execute(nil, dmsetupBinary, opts, types.ExecuteTimeout)
74+
_, err := executor.Execute(nil, dmsetupBinary, opts, types.ExecuteShortTimeout)
7575
return err
7676
}
7777

0 commit comments

Comments
 (0)