[CRIU] [PATCH] mount: close mnt.ns_fd only for sub-namespaces
Pavel Emelyanov
xemul at parallels.com
Thu Nov 26 05:43:19 PST 2015
On 11/26/2015 04:31 PM, Andrew Vagin wrote:
> On Thu, Nov 26, 2015 at 04:07:46PM +0300, Pavel Emelyanov wrote:
>> On 11/26/2015 01:49 PM, Andrey Vagin wrote:
>>> From: Andrew Vagin <avagin at virtuozzo.com>
>>>
>>> nsid->mnt.ns_fd is initialized into 0, so currently
>>> fini_restore_mntns() closes the 0 descriptor if processes
>>> lives in a current mount namespace (NS_CRIU).
>>>
>>> Without this patch I get the following error:
>>> (00.166444) 4109: Inherit fd tty:[8800:d] -> 0 has been closed
>>>
>>> Signed-off-by: Andrew Vagin <avagin at virtuozzo.com>
>>> ---
>>> mount.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/mount.c b/mount.c
>>> index 20ae79b..d3628c2 100644
>>> --- a/mount.c
>>> +++ b/mount.c
>>> @@ -2653,7 +2653,7 @@ void fini_restore_mntns(void)
>>> for (nsid = ns_ids; nsid != NULL; nsid = nsid->next) {
>>> if (nsid->nd != &mnt_ns_desc)
>>> continue;
>>> - if (root_item->ids->mnt_ns_id == nsid->id)
>>> + if (nsid->type == NS_OTHER)
>>
>> But all the nsid's with type OTHER have ns_fd set to some descriptor,
>> why do you skip them?
>
> I want to say != ;)
But != also looks weird. Look at prepare_mnt_ns() it does this:
for (nsid = ns_ids; nsid != NULL; nsid = nsid->next) {
char path[PATH_MAX];
if (nsid->nd != &mnt_ns_desc)
continue;
if (root_item->ids->mnt_ns_id == nsid->id)
continue;
...
nsid->mnt.ns_fd = open_proc(PROC_SELF, "ns/mnt");
if (nsid->mnt.ns_fd < 0)
goto err;
There's no single check for nsid->type, why do we have one on
the closing part?
More information about the CRIU
mailing list