@@ -214,4 +214,69 @@ TEST_F(set_layers_via_fds, set_500_layers_via_fds)
214214 ASSERT_EQ (close (fd_overlay ), 0 );
215215}
216216
217+ TEST_F (set_layers_via_fds , set_500_layers_via_opath_fds )
218+ {
219+ int fd_context , fd_tmpfs , fd_overlay , fd_work , fd_upper , fd_lower ;
220+ int layer_fds [500 ] = { [0 ... 499 ] = - EBADF };
221+
222+ ASSERT_EQ (unshare (CLONE_NEWNS ), 0 );
223+ ASSERT_EQ (sys_mount (NULL , "/" , NULL , MS_SLAVE | MS_REC , NULL ), 0 );
224+
225+ fd_context = sys_fsopen ("tmpfs" , 0 );
226+ ASSERT_GE (fd_context , 0 );
227+
228+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_CMD_CREATE , NULL , NULL , 0 ), 0 );
229+ fd_tmpfs = sys_fsmount (fd_context , 0 , 0 );
230+ ASSERT_GE (fd_tmpfs , 0 );
231+ ASSERT_EQ (close (fd_context ), 0 );
232+
233+ for (int i = 0 ; i < ARRAY_SIZE (layer_fds ); i ++ ) {
234+ char path [100 ];
235+
236+ sprintf (path , "l%d" , i );
237+ ASSERT_EQ (mkdirat (fd_tmpfs , path , 0755 ), 0 );
238+ layer_fds [i ] = openat (fd_tmpfs , path , O_DIRECTORY | O_PATH );
239+ ASSERT_GE (layer_fds [i ], 0 );
240+ }
241+
242+ ASSERT_EQ (mkdirat (fd_tmpfs , "w" , 0755 ), 0 );
243+ fd_work = openat (fd_tmpfs , "w" , O_DIRECTORY | O_PATH );
244+ ASSERT_GE (fd_work , 0 );
245+
246+ ASSERT_EQ (mkdirat (fd_tmpfs , "u" , 0755 ), 0 );
247+ fd_upper = openat (fd_tmpfs , "u" , O_DIRECTORY | O_PATH );
248+ ASSERT_GE (fd_upper , 0 );
249+
250+ ASSERT_EQ (mkdirat (fd_tmpfs , "l501" , 0755 ), 0 );
251+ fd_lower = openat (fd_tmpfs , "l501" , O_DIRECTORY | O_PATH );
252+ ASSERT_GE (fd_lower , 0 );
253+
254+ ASSERT_EQ (sys_move_mount (fd_tmpfs , "" , - EBADF , "/tmp" , MOVE_MOUNT_F_EMPTY_PATH ), 0 );
255+ ASSERT_EQ (close (fd_tmpfs ), 0 );
256+
257+ fd_context = sys_fsopen ("overlay" , 0 );
258+ ASSERT_GE (fd_context , 0 );
259+
260+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "workdir" , NULL , fd_work ), 0 );
261+ ASSERT_EQ (close (fd_work ), 0 );
262+
263+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "upperdir" , NULL , fd_upper ), 0 );
264+ ASSERT_EQ (close (fd_upper ), 0 );
265+
266+ for (int i = 0 ; i < ARRAY_SIZE (layer_fds ); i ++ ) {
267+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "lowerdir+" , NULL , layer_fds [i ]), 0 );
268+ ASSERT_EQ (close (layer_fds [i ]), 0 );
269+ }
270+
271+ ASSERT_NE (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "lowerdir+" , NULL , fd_lower ), 0 );
272+ ASSERT_EQ (close (fd_lower ), 0 );
273+
274+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_CMD_CREATE , NULL , NULL , 0 ), 0 );
275+
276+ fd_overlay = sys_fsmount (fd_context , 0 , 0 );
277+ ASSERT_GE (fd_overlay , 0 );
278+ ASSERT_EQ (close (fd_context ), 0 );
279+ ASSERT_EQ (close (fd_overlay ), 0 );
280+ }
281+
217282TEST_HARNESS_MAIN
0 commit comments