@@ -149,4 +149,69 @@ TEST_F(set_layers_via_fds, set_layers_via_fds)
149149 ASSERT_EQ (fclose (f_mountinfo ), 0 );
150150}
151151
152+ TEST_F (set_layers_via_fds , set_500_layers_via_fds )
153+ {
154+ int fd_context , fd_tmpfs , fd_overlay , fd_work , fd_upper , fd_lower ;
155+ int layer_fds [500 ] = { [0 ... 499 ] = - EBADF };
156+
157+ ASSERT_EQ (unshare (CLONE_NEWNS ), 0 );
158+ ASSERT_EQ (sys_mount (NULL , "/" , NULL , MS_SLAVE | MS_REC , NULL ), 0 );
159+
160+ fd_context = sys_fsopen ("tmpfs" , 0 );
161+ ASSERT_GE (fd_context , 0 );
162+
163+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_CMD_CREATE , NULL , NULL , 0 ), 0 );
164+ fd_tmpfs = sys_fsmount (fd_context , 0 , 0 );
165+ ASSERT_GE (fd_tmpfs , 0 );
166+ ASSERT_EQ (close (fd_context ), 0 );
167+
168+ for (int i = 0 ; i < ARRAY_SIZE (layer_fds ); i ++ ) {
169+ char path [100 ];
170+
171+ sprintf (path , "l%d" , i );
172+ ASSERT_EQ (mkdirat (fd_tmpfs , path , 0755 ), 0 );
173+ layer_fds [i ] = openat (fd_tmpfs , path , O_DIRECTORY );
174+ ASSERT_GE (layer_fds [i ], 0 );
175+ }
176+
177+ ASSERT_EQ (mkdirat (fd_tmpfs , "w" , 0755 ), 0 );
178+ fd_work = openat (fd_tmpfs , "w" , O_DIRECTORY );
179+ ASSERT_GE (fd_work , 0 );
180+
181+ ASSERT_EQ (mkdirat (fd_tmpfs , "u" , 0755 ), 0 );
182+ fd_upper = openat (fd_tmpfs , "u" , O_DIRECTORY );
183+ ASSERT_GE (fd_upper , 0 );
184+
185+ ASSERT_EQ (mkdirat (fd_tmpfs , "l501" , 0755 ), 0 );
186+ fd_lower = openat (fd_tmpfs , "l501" , O_DIRECTORY );
187+ ASSERT_GE (fd_lower , 0 );
188+
189+ ASSERT_EQ (sys_move_mount (fd_tmpfs , "" , - EBADF , "/tmp" , MOVE_MOUNT_F_EMPTY_PATH ), 0 );
190+ ASSERT_EQ (close (fd_tmpfs ), 0 );
191+
192+ fd_context = sys_fsopen ("overlay" , 0 );
193+ ASSERT_GE (fd_context , 0 );
194+
195+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "workdir" , NULL , fd_work ), 0 );
196+ ASSERT_EQ (close (fd_work ), 0 );
197+
198+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "upperdir" , NULL , fd_upper ), 0 );
199+ ASSERT_EQ (close (fd_upper ), 0 );
200+
201+ for (int i = 0 ; i < ARRAY_SIZE (layer_fds ); i ++ ) {
202+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "lowerdir+" , NULL , layer_fds [i ]), 0 );
203+ ASSERT_EQ (close (layer_fds [i ]), 0 );
204+ }
205+
206+ ASSERT_NE (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "lowerdir+" , NULL , fd_lower ), 0 );
207+ ASSERT_EQ (close (fd_lower ), 0 );
208+
209+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_CMD_CREATE , NULL , NULL , 0 ), 0 );
210+
211+ fd_overlay = sys_fsmount (fd_context , 0 , 0 );
212+ ASSERT_GE (fd_overlay , 0 );
213+ ASSERT_EQ (close (fd_context ), 0 );
214+ ASSERT_EQ (close (fd_overlay ), 0 );
215+ }
216+
152217TEST_HARNESS_MAIN
0 commit comments