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 f0c9fc613c15e30453295beb25bf73763a4a82df 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 367e05a0d1a..f53f1dcbb4e 100644
--- a/pkg/volume/util/util.go
+++ b/pkg/volume/util/util.go
@@ -527,17 +527,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
 }
 
@@ -551,13 +540,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.25.1

