On Fri, Jun 05, 2026 at 12:23:48 +0200, Radoslaw Smigielski via Devel wrote:
> On Mon, 1 Jun 2026 at 14:32, Peter Krempa <[email protected]> wrote:
>
> > On Fri, May 29, 2026 at 16:46:58 +0200, Radoslaw Smigielski wrote:
> >
> > [...]
> >
> > > > Another issue is that if you'll have:
> > > >
> > > > <filesystem type='file' accessmode='passthrough'>
> > > > <driver type='loop' format='raw'/>
> > > > <source
> > >
> > file='/root/someveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylongpath/a.raw'/>
> > > > <target dir='/'/>
> > > > </filesystem>
> > > > <filesystem type='file' accessmode='passthrough'>
> > > > <driver type='loop' format='raw'/>
> > > > <source
> > >
> > file='/root/someveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylongpath/b.raw'/>
> > > > <target dir='/'/>
> > > > </filesystem>
> > > >
> > > > They'll be truncated to the same string.
> > >
> > > So I tried to follow the same logic like losetup from util-linux uses to
> > > handle long paths:
> > > - takes the first 63 bytes of the absolute path
> > > - no intelligent path shortening (like keeping the filename and
> > > truncating middle)
> > > - adds an asterisk at position 62 to indicate the name was truncated
> > >
> > > lo->lo_file_name[LO_NAME_SIZE - 2] = '*'; // Position 62 gets '*'
> > > lo->lo_file_name[LO_NAME_SIZE - 1] = '\0'; // Position 63 is null
> > > terminator
> > >
> > > Above indeed can result in non-unique or unhelpful loop device names in
> > the
> > > kernel's loop_info64 structure.
> >
> > So ... the most important question is how the value is used (which I
> > don't remember any more).
> >
> > If it's visible or used from withint the LXC instance, then we must not
> > change it. The users are out of luck unfortunately.
> >
> > If it's just informative and we can change it (and based on the fact
> > that it's being truncated so it doesn't reflect anything real) we could
> > also replace it by a controlled string which is unable to exceed 63
> > chars without truncation.
> >
> > It could be something like:
> >
> > 'libvirt-$UUID-$DEVALIAS'
> >
> > > Question if we should mimic the same logic or imlement someting smarter.
> >
> > It really depends on what the semantics are; see above. If it can be
> > changed though I'd go for something more stable for the future.
> >
> > > Addint "*" before '\0' to indicate truncation would make it compatibile
> > > with losetup behavior.
> >
> > I'm not sure if that's too valuable of a behaviour. It prevents you from
> > identifying the resource. Having an indentifier allowing you to look up
> > the path would make more sense.
> >
> > ...
> >
> > Well, now you see why this issue lingered so long. There are plenty
> > corner cases that need to be checked and behaviour analyzed :)
> >
> >
>
> So one more attempt ;)
> This time no patch but some short analysis and summary.
>
>
> There seems to be only one command which shows or use lo_file_name: losetup
> -l -O +REF
> All other commands or files in /proc or /dev do not contain lo_file_name.
>
> Example of the losetup command output goes like below,
> where last REF column is a value of lo_file_name:
>
> [root@rvm10 radek]# losetup -l -O +REF
> NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
> DIO LOG-SEC REF
> /dev/loop1 0 0 1 0
> /root/someveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylongpath/a.raw
> 0 512 /root/someveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee*
> /dev/loop0 0 0 1 0 /root/disk2.raw
> 0 512
> /root/disk2.raw
>
> But important point here is that the lo_file_name/REF is being truncated
> above by losetup/kernel.
Okay, so it really seems to be just an identifier rather than the path
itself.
>
>
>
> > If it's visible or used from withint the LXC instance, then we must not
> > change it. The users are out of luck unfortunately.
>
> lo_file_name is not visible or meaningfully accessible from within the LXC
> container.
> In LXC container:
>
> 1. From /proc inside container:
>
> - /proc/partitions - Shows only
> device names like loop0, NOT the backing file path
>
> - /proc/mounts - Shows the mount point and device (/dev/loop0), NOT
> lo_file_name
> 2. From /sys inside container:
> - /sys/block/loopN/loop/backing_file - Shows the real path from the
> kernel's open file descriptor, NOT from lo_file_name
> - There is NO /sys/block/loopN/loop/ref or similar file that exposes
> lo_file_name
> 3. losetup inside the LXC domain (container) does not show values in REF
> column:
>
> sh-5.3# losetup -l -O +REF
> NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO
> LOG-SEC REF
> /dev/loop1 (lost) 0 0 1 0
> /root/someveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylongpath/a.raw
> 0
> 512
> /dev/loop0 (lost) 0 0 1 0 /root/disk2.raw 0
> 512
>
>
> So making the long story short:
> - Linux kernel does NOT use lo_file_name to open or read the file. I/O
> goes through the fd passed to LOOP_SET_FD.
> - There is no code path where the kernel opens, resolves, or reads the
> backing file using lo_file_name.
> - LXC never reads or acts on lo_file_name. It is written once and left
> for the kernel and external tools.
> - The kernel's memcpy(lo->lo_file_name, info->lo_file_name, LO_NAME_SIZE)
> just stores it for LOOP_GET_STATUS64 queries - it's not used for I/O.
>
>
>
>
> > It could be something like:
> >
> > 'libvirt-$UUID-$DEVALIAS'
>
> Perer, just to make sure I fully understood.
> What would be $DEVALIAS ? loop device name ? last 19 characters of the file
> path?
It's the alias of the device. Libvirt normally auto-allocates them at
startup:
<filesystem type='mount' accessmode='passthrough'>
<driver type='virtiofs'/>
<binary path='/usr/libexec/virtiofsd'/>
<source dir='/tmp'/>
<target dir='/'/>
<readonly/>
<alias name='fs0'/>
^^^^^
<address type='pci' domain='0x0000' bus='0x01' slot='0x00'
function='0x0'/>
</filesystem>
it's stored in 'fs->info.alias'. Now as you see the alias is normally
short but users can pass their own ...
>
> DEVALIAS would need to fit into 19 characters.
> 64 - len('\0') - len('libvirt-$UUID') = 19 chars
... so this would effectively limit them to 19 characters. I guess
that's an okay limitation because normally users don't set those.
We should fail though if the user picks some massive string because we'd
run into the same problem.
>
> But I agree that this format of the name 'libvirt-$UUID-$DEVALIAS' would be
> easier
> for debugging and troubleshooting potential problems. We could fit into 63
> characters.
> And finally it would be unique and deterministic.
>
> Because all above, it's much better approach than what I implemented
> with truncating and '*'.
>
>
> ----------------------
> < Tℏanks | Radek >