[PATCH 4/5] erofs-utils: mount: gracefully exit when `erofsmount_nbd()` encounts an error

Gao Xiang hsiangkao at linux.alibaba.com
Fri Dec 26 18:51:32 AEDT 2025



On 2025/12/26 15:43, zhaoyifan (H) wrote:
> 
> On 2025/12/26 14:49, Gao Xiang wrote:
>>
>>
>> On 2025/12/23 18:04, Yifan Zhao wrote:
>>> If the main process of `erofsmount_nbd()` encounters an error after the
>>> nbd device has been successfully set up, it fails to disconnect it
>>> before exiting, resulting in the subprocess not being cleaned up and
>>> keeping its connection with NBD device.
>>>
>>> This patch resolves the issue by disconnecting NBD device before exiting
>>> on error.
>>>
>>> Signed-off-by: Yifan Zhao <zhaoyifan28 at huawei.com>
>>> ---
>>> Note:
>>> - I believe directly killing the child process is unsafe, as it may leave
>>> in-flight NBD requests from the kernel unhandled, causing soft lockup.
>>> - And I believe using nbdpath here is safe, as the child process maintains
>>> the NBD device connection throughout, preventing concurrent access by other
>>> actors.
>>
>> What if the child process is already exited earlier, and the current NBD
>> device is reused for others?
>>
>> How about keeping the previous nbdfd for ioctl interfaces instead to
>> avoid nbd device reuse.
>>
> OK, I will try this way.

Can you move small fixes in advance, and leave refactering at last?

Thus we could address these small fixes first.

Thanks,
Gao Xiang

> 
> 
> Thanks,
> 
> Yifan
> 
>> Thanks,
>> Gao Xiang
>>
>>>
>>>   mount/main.c | 17 +++++++++++++++--
>>>   1 file changed, 15 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/mount/main.c b/mount/main.c
>>> index 2a21979..d2d4815 100644
>>> --- a/mount/main.c
>>> +++ b/mount/main.c
>>> @@ -1287,10 +1287,23 @@ static int erofsmount_nbd(struct erofs_nbd_source *source,
>>>         if (!err) {
>>>           err = mount(nbdpath, mountpoint, fstype, flags, options);
>>> -        if (err < 0)
>>> +        if (err < 0) {
>>>               err = -errno;
>>> +            if (msg.is_netlink) {
>>> +                erofs_nbd_nl_disconnect(msg.nbdnum);
>>> +            } else {
>>> +                int nbdfd;
>>> +
>>> +                nbdfd = open(nbdpath, O_RDWR);
>>> +                if (nbdfd > 0) {
>>> +                    erofs_nbd_disconnect(nbdfd);
>>> +                    close(nbdfd);
>>> +                }
>>> +            }
>>> +            return err;
>>> +        }
>>>   -        if (!err && msg.is_netlink) {
>>> +        if (msg.is_netlink) {
>>>               id = erofs_nbd_get_identifier(msg.nbdnum);
>>>                 err = IS_ERR(id) ? PTR_ERR(id) :
>>



More information about the Linux-erofs mailing list