@@ -91,36 +91,45 @@ func NewNSWithName(name string) (ns.NetNS, error) {
91
91
// Create the directory for mounting network namespaces
92
92
// This needs to be a shared mountpoint in case it is mounted in to
93
93
// other namespaces (containers)
94
- err = os . MkdirAll (nsRunDir , 0o755 )
94
+ err = makeNetnsDir (nsRunDir )
95
95
if err != nil {
96
96
return nil , err
97
97
}
98
98
99
- // Remount the namespace directory shared. This will fail if it is not
100
- // already a mountpoint, so bind-mount it on to itself to "upgrade" it
101
- // to a mountpoint.
102
- err = unix .Mount ("" , nsRunDir , "none" , unix .MS_SHARED | unix .MS_REC , "" )
99
+ nsPath := path .Join (nsRunDir , name )
100
+ return newNSPath (nsPath )
101
+ }
102
+
103
+ func makeNetnsDir (nsRunDir string ) error {
104
+ err := os .MkdirAll (nsRunDir , 0o755 )
103
105
if err != nil {
104
- if err != unix .EINVAL {
105
- return nil , fmt .Errorf ("mount --make-rshared %s failed: %q" , nsRunDir , err )
106
- }
106
+ return err
107
+ }
108
+ // Remount the namespace directory shared. This will fail with EINVAL
109
+ // if it is not already a mountpoint, so bind-mount it on to itself
110
+ // to "upgrade" it to a mountpoint.
111
+ err = unix .Mount ("" , nsRunDir , "none" , unix .MS_SHARED | unix .MS_REC , "" )
112
+ if err == nil {
113
+ return nil
114
+ }
115
+ if err != unix .EINVAL {
116
+ return fmt .Errorf ("mount --make-rshared %s failed: %q" , nsRunDir , err )
117
+ }
107
118
108
- // Recursively remount /run/netns on itself. The recursive flag is
109
- // so that any existing netns bindmounts are carried over.
110
- err = unix .Mount (nsRunDir , nsRunDir , "none" , unix .MS_BIND | unix .MS_REC , "" )
111
- if err != nil {
112
- return nil , fmt .Errorf ("mount --rbind %s %s failed: %q" , nsRunDir , nsRunDir , err )
113
- }
119
+ // Recursively remount /run/netns on itself. The recursive flag is
120
+ // so that any existing netns bindmounts are carried over.
121
+ err = unix .Mount (nsRunDir , nsRunDir , "none" , unix .MS_BIND | unix .MS_REC , "" )
122
+ if err != nil {
123
+ return fmt .Errorf ("mount --rbind %s %s failed: %q" , nsRunDir , nsRunDir , err )
124
+ }
114
125
115
- // Now we can make it shared
116
- err = unix .Mount ("" , nsRunDir , "none" , unix .MS_SHARED | unix .MS_REC , "" )
117
- if err != nil {
118
- return nil , fmt .Errorf ("mount --make-rshared %s failed: %q" , nsRunDir , err )
119
- }
126
+ // Now we can make it shared
127
+ err = unix .Mount ("" , nsRunDir , "none" , unix .MS_SHARED | unix .MS_REC , "" )
128
+ if err != nil {
129
+ return fmt .Errorf ("mount --make-rshared %s failed: %q" , nsRunDir , err )
120
130
}
121
131
122
- nsPath := path .Join (nsRunDir , name )
123
- return newNSPath (nsPath )
132
+ return nil
124
133
}
125
134
126
135
func newNSPath (nsPath string ) (ns.NetNS , error ) {
0 commit comments