osbuild/remoteloop: add more loop device options

This adds lock, partscan, read_only, sector_size to _create_device()
similar to make_loop() from devices/org.osbuild.loopback.
This commit is contained in:
Dusty Mabe 2024-11-22 19:02:57 -05:00 committed by Simon de Vlieger
parent b1f16e9ab4
commit f4b899873b

View file

@ -41,8 +41,23 @@ class LoopServer(api.BaseAPI):
self.devs = [] self.devs = []
self.ctl = loop.LoopControl() self.ctl = loop.LoopControl()
def _create_device(self, fd, dir_fd, offset=None, sizelimit=None): def _create_device(
lo = self.ctl.loop_for_fd(fd, offset=offset, sizelimit=sizelimit, autoclear=True) self,
fd,
dir_fd,
offset=None,
sizelimit=None,
lock=False,
partscan=False,
read_only=False,
sector_size=512):
lo = self.ctl.loop_for_fd(fd, lock=lock,
offset=offset,
sizelimit=sizelimit,
blocksize=sector_size,
partscan=partscan,
read_only=read_only,
autoclear=True)
lo.mknod(dir_fd) lo.mknod(dir_fd)
# Pin the Loop objects so they are only released when the LoopServer # Pin the Loop objects so they are only released when the LoopServer
# is destroyed. # is destroyed.
@ -54,8 +69,12 @@ class LoopServer(api.BaseAPI):
dir_fd = fds[msg["dir_fd"]] dir_fd = fds[msg["dir_fd"]]
offset = msg.get("offset") offset = msg.get("offset")
sizelimit = msg.get("sizelimit") sizelimit = msg.get("sizelimit")
lock = msg.get("lock", False)
partscan = msg.get("partscan", False)
read_only = msg.get("read_only", False)
sector_size = msg.get("sector_size", 512)
devname = self._create_device(fd, dir_fd, offset, sizelimit) devname = self._create_device(fd, dir_fd, offset, sizelimit, lock, partscan, read_only, sector_size)
sock.send({"devname": devname}) sock.send({"devname": devname})
def _cleanup(self): def _cleanup(self):
@ -75,11 +94,20 @@ class LoopClient:
self.client.close() self.client.close()
@contextlib.contextmanager @contextlib.contextmanager
def device(self, filename, offset=None, sizelimit=None): def device(
self,
filename,
offset=None,
sizelimit=None,
lock=False,
partscan=False,
read_only=False,
sector_size=512):
req = {} req = {}
fds = [] fds = []
fd = os.open(filename, os.O_RDWR) flags = os.O_RDONLY if read_only else os.O_RDWR
fd = os.open(filename, flags)
dir_fd = os.open("/dev", os.O_DIRECTORY) dir_fd = os.open("/dev", os.O_DIRECTORY)
fds.append(fd) fds.append(fd)
@ -91,6 +119,10 @@ class LoopClient:
req["offset"] = offset req["offset"] = offset
if sizelimit: if sizelimit:
req["sizelimit"] = sizelimit req["sizelimit"] = sizelimit
req["lock"] = lock
req["partscan"] = partscan
req["read_only"] = read_only
req["sector_size"] = sector_size
self.client.send(req, fds=fds) self.client.send(req, fds=fds)
os.close(dir_fd) os.close(dir_fd)