diff --git a/osbuild/loop.py b/osbuild/loop.py index c5e59a2d..9e07b3ce 100644 --- a/osbuild/loop.py +++ b/osbuild/loop.py @@ -108,6 +108,19 @@ class Loop: (not os.minor(info.st_rdev) == minor)): raise UnexpectedDevice(minor, info.st_rdev, info.st_mode) + def __del__(self): + self.close() + + def close(self): + """Close this loop device. + + No operations on this object are valid after this call. + """ + if self.fd >= 0: + os.close(self.fd) + self.fd = -1 + self.devname = "" + def set_fd(self, fd): """Bind a file descriptor to the loopback device diff --git a/osbuild/remoteloop.py b/osbuild/remoteloop.py index 424bc060..554f2ef3 100644 --- a/osbuild/remoteloop.py +++ b/osbuild/remoteloop.py @@ -70,6 +70,7 @@ class LoopServer: try: lo.set_fd(fd) except OSError as e: + lo.close() if e.errno == errno.EBUSY: continue raise e @@ -108,6 +109,8 @@ class LoopServer: def __exit__(self, *args): self.event_loop.call_soon_threadsafe(self.event_loop.stop) self.thread.join() + for lo in self.devs: + lo.close() class LoopClient: