Copyright 2020 The Monogon Project Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.


From 83fe2858cbdff277e416f0ea50366811c81e2382 Mon Sep 17 00:00:00 2001
From: Lorenz Brun <lorenz@brun.one>
Date: Mon, 29 Mar 2021 13:56:06 +0200
Subject: [PATCH] Removed questionable block device pseudo-locks

This code implements a weird sort of lock using Linux loop devices. It's not exclusive (multiple loop devices per
backing device are supported) and the devices themselves are not accessed. The lock is also not exclusive as multiple
loop devices per backing device are allowed. The only mention of why any of this is done is in the comment below, stating
that it is possible that a device can be removed and another device can be attached with the same name. In Metropolis
this is not a problem as our CSI/Provisioner setup exercises tight control over devices, thus silent removals are not
possible.

Because this code calls the losetup utility which Metropolis doesn't want to ship and also repeatedly lists loop devices
in an inefficient manner which will cause problems with the anticipated density of VM-hosting Metropolis nodes and
does nothing for us, let's just nuke it instead of rewriting it against //metropolis/pkg/loop.
---
 pkg/volume/util/util.go | 18 ------------------
 1 file changed, 18 deletions(-)

diff --git a/pkg/volume/util/util.go b/pkg/volume/util/util.go
index 601dc646013..5dfdd1ecb02 100644
--- a/pkg/volume/util/util.go
+++ b/pkg/volume/util/util.go
@@ -511,17 +511,6 @@ func MapBlockVolume(
 		return fmt.Errorf("blkUtil.MapDevice failed. devicePath: %s, podVolumeMapPath:%s, volumeMapName: %s, bindMount: %v: %v",
 			devicePath, podVolumeMapPath, volumeMapName, false, mapErr)
 	}
-
-	// Take file descriptor lock to keep a block device opened. Otherwise, there is a case
-	// that the block device is silently removed and attached another device with the same name.
-	// Container runtime can't handle this problem. To avoid unexpected condition fd lock
-	// for the block device is required.
-	_, mapErr = blkUtil.AttachFileDevice(filepath.Join(globalMapPath, string(podUID)))
-	if mapErr != nil {
-		return fmt.Errorf("blkUtil.AttachFileDevice failed. globalMapPath:%s, podUID: %s: %v",
-			globalMapPath, string(podUID), mapErr)
-	}
-
 	return nil
 }

@@ -535,13 +524,6 @@ func UnmapBlockVolume(
 	volumeMapName string,
 	podUID utypes.UID,
 ) error {
-	// Release file descriptor lock.
-	err := blkUtil.DetachFileDevice(filepath.Join(globalUnmapPath, string(podUID)))
-	if err != nil {
-		return fmt.Errorf("blkUtil.DetachFileDevice failed. globalUnmapPath:%s, podUID: %s: %v",
-			globalUnmapPath, string(podUID), err)
-	}
-
 	// unmap devicePath from pod volume path
 	unmapDeviceErr := blkUtil.UnmapDevice(podDeviceUnmapPath, volumeMapName, false /* bindMount */)
 	if unmapDeviceErr != nil {
--
2.41.0

