[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