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:
parent
b1f16e9ab4
commit
f4b899873b
1 changed files with 37 additions and 5 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue