mirror of
https://git.proxmox.com/git/mirror_iproute2
synced 2026-01-25 00:09:26 +00:00
lib/namespace: avoid double-mounting a /sys
This partly reverts 8f0807023d, bringing
back the umount(/sys) attempt.
In a LXC container we're unable to umount the sysfs instance, nor mount
a read-write one. We still are able to create a new read-only instance.
Nevertheless, it still makes sense to attempt the umount() even though
the sysfs is mounted read-only. Otherwise we may end up attempting to
mount a sysfs with the same flags as is already mounted, resulting in
an EBUSY error (meaning "Already mounted").
Perhaps this is not a very likely scenario in real world, but we hit
it in NetworkManager test suite and makes netns_switch() somewhat more
robust. It also fixes the case, when /sys wasn't mounted at all.
Signed-off-by: Lubomir Rintel <lkundrak@v3.sk>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
parent
c8f7a754ed
commit
3655f788d3
@ -82,19 +82,13 @@ int netns_switch(char *name)
|
||||
|
||||
/* Mount a version of /sys that describes the network namespace */
|
||||
|
||||
if (statvfs("/sys", &fsstat) < 0) {
|
||||
fprintf(stderr, "could not stat /sys (not mounted?): %s\n",strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
if (fsstat.f_flag & ST_RDONLY) {
|
||||
/* If /sys is not writable (e.g. in a container), we can't
|
||||
* unmount the old /sys instance, but we can still mount a new
|
||||
* read-only instance over it. */
|
||||
mountflags = MS_RDONLY;
|
||||
} else {
|
||||
if (umount2("/sys", MNT_DETACH) < 0) {
|
||||
fprintf(stderr, "umount of /sys failed: %s\n", strerror(errno));
|
||||
return -1;
|
||||
if (umount2("/sys", MNT_DETACH) < 0) {
|
||||
/* If this fails, perhaps there wasn't a sysfs instance mounted. Good. */
|
||||
if (statvfs("/sys", &fsstat) == 0) {
|
||||
/* We couldn't umount the sysfs, we'll attempt to overlay it.
|
||||
* A read-only instance can't be shadowed with a read-write one. */
|
||||
if (fsstat.f_flag & ST_RDONLY)
|
||||
mountflags = MS_RDONLY;
|
||||
}
|
||||
}
|
||||
if (mount(name, "/sys", "sysfs", mountflags, NULL) < 0) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user