Skip to content

Commit 93c8b20

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 93c8b20

3 files changed

Lines changed: 43 additions & 6 deletions

File tree

app/cmd/dmsetup/dmsetup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ func remove(c *cli.Context) error {
207207

208208
logrus.Infof("Removing device %v with force %v and deferred %v", deviceName, c.Bool("force"), c.Bool("deferred"))
209209

210-
return util.DmsetupRemove(deviceName, c.Bool("force"), c.Bool("deferred"), executor)
210+
return util.DmsetupRemove([]string{deviceName}, c.Bool("force"), c.Bool("deferred"), executor)
211211
}
212212

213213
func DepsCmd() cli.Command {

pkg/initiator/initiator.go

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,9 +1226,44 @@ func (i *Initiator) removeLinearDmDevice(force, deferred bool) error {
12261226
if _, err := os.Stat(dmDevPath); err != nil {
12271227
return err
12281228
}
1229+
dmDevList := []string{dmDevPath}
1230+
1231+
// Encrypted volume will create another dm device with "-encrypted" suffix,
1232+
// and this dm device will block the removal of the linear dm device until it's removed.
1233+
// So we need to remove the encrypted dm device together with the linear dm device,
1234+
encryptedDmDevPath := fmt.Sprintf("%s-encrypted", dmDevPath)
1235+
isEncryptedDmDevExist := true
1236+
if _, err := os.Stat(encryptedDmDevPath); err != nil {
1237+
if !os.IsNotExist(err) {
1238+
return err
1239+
}
1240+
isEncryptedDmDevExist = false
1241+
}
1242+
if isEncryptedDmDevExist {
1243+
dmDevList = append(dmDevList, encryptedDmDevPath)
1244+
force = true
1245+
}
1246+
i.logger.Infof("Removing linear dm device %v", dmDevList)
1247+
if err := util.DmsetupRemove(dmDevList, force, deferred, i.executor); err != nil {
1248+
i.logger.WithError(err).Debugf("Failed to remove linear dm devices: %v", dmDevList)
1249+
if isRemoveDmDevNotFoundError(err) {
1250+
return nil
1251+
}
1252+
return err
1253+
}
1254+
1255+
return nil
1256+
}
1257+
1258+
func isRemoveDmDevNotFoundError(err error) bool {
1259+
if err == nil {
1260+
return false
1261+
}
12291262

1230-
i.logger.Info("Removing linear dm device")
1231-
return util.DmsetupRemove(i.Name, force, deferred, i.executor)
1263+
errMsg := strings.ToLower(err.Error())
1264+
return strings.Contains(errMsg, "no such device or address") ||
1265+
strings.Contains(errMsg, "not found") ||
1266+
strings.Contains(errMsg, "no such file or directory")
12321267
}
12331268

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

pkg/util/dmsetup.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,13 @@ func DmsetupReload(dmDeviceName, table string, executor *commonns.Executor) erro
6060
return err
6161
}
6262

63-
// DmsetupRemove removes the device mapper device with the given name
64-
func DmsetupRemove(dmDeviceName string, force, deferred bool, executor *commonns.Executor) error {
63+
// DmsetupRemove removes one or more device mapper devices with the given names
64+
func DmsetupRemove(dmDeviceNameList []string, force, deferred bool, executor *commonns.Executor) error {
6565
opts := []string{
66-
"remove", dmDeviceName,
66+
"remove",
6767
}
68+
opts = append(opts, dmDeviceNameList...)
69+
6870
if force {
6971
opts = append(opts, "--force")
7072
}

0 commit comments

Comments
 (0)