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 //osbase/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

