@@ -20,12 +20,16 @@ FIXTURE(set_layers_via_fds) {
2020FIXTURE_SETUP (set_layers_via_fds )
2121{
2222 ASSERT_EQ (mkdir ("/set_layers_via_fds" , 0755 ), 0 );
23+ ASSERT_EQ (mkdir ("/set_layers_via_fds_tmpfs" , 0755 ), 0 );
2324}
2425
2526FIXTURE_TEARDOWN (set_layers_via_fds )
2627{
2728 umount2 ("/set_layers_via_fds" , 0 );
2829 ASSERT_EQ (rmdir ("/set_layers_via_fds" ), 0 );
30+
31+ umount2 ("/set_layers_via_fds_tmpfs" , 0 );
32+ ASSERT_EQ (rmdir ("/set_layers_via_fds_tmpfs" ), 0 );
2933}
3034
3135TEST_F (set_layers_via_fds , set_layers_via_fds )
@@ -279,4 +283,130 @@ TEST_F(set_layers_via_fds, set_500_layers_via_opath_fds)
279283 ASSERT_EQ (close (fd_overlay ), 0 );
280284}
281285
286+ TEST_F (set_layers_via_fds , set_layers_via_detached_mount_fds )
287+ {
288+ int fd_context , fd_tmpfs , fd_overlay , fd_tmp ;
289+ int layer_fds [] = { [0 ... 8 ] = - EBADF };
290+ bool layers_found [] = { [0 ... 8 ] = false };
291+ size_t len = 0 ;
292+ char * line = NULL ;
293+ FILE * f_mountinfo ;
294+
295+ ASSERT_EQ (unshare (CLONE_NEWNS ), 0 );
296+ ASSERT_EQ (sys_mount (NULL , "/" , NULL , MS_SLAVE | MS_REC , NULL ), 0 );
297+
298+ fd_context = sys_fsopen ("tmpfs" , 0 );
299+ ASSERT_GE (fd_context , 0 );
300+
301+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_CMD_CREATE , NULL , NULL , 0 ), 0 );
302+ fd_tmpfs = sys_fsmount (fd_context , 0 , 0 );
303+ ASSERT_GE (fd_tmpfs , 0 );
304+ ASSERT_EQ (close (fd_context ), 0 );
305+
306+ ASSERT_EQ (mkdirat (fd_tmpfs , "u" , 0755 ), 0 );
307+ ASSERT_EQ (mkdirat (fd_tmpfs , "u/upper" , 0755 ), 0 );
308+ ASSERT_EQ (mkdirat (fd_tmpfs , "u/work" , 0755 ), 0 );
309+ ASSERT_EQ (mkdirat (fd_tmpfs , "l1" , 0755 ), 0 );
310+ ASSERT_EQ (mkdirat (fd_tmpfs , "l2" , 0755 ), 0 );
311+ ASSERT_EQ (mkdirat (fd_tmpfs , "l3" , 0755 ), 0 );
312+ ASSERT_EQ (mkdirat (fd_tmpfs , "l4" , 0755 ), 0 );
313+ ASSERT_EQ (mkdirat (fd_tmpfs , "d1" , 0755 ), 0 );
314+ ASSERT_EQ (mkdirat (fd_tmpfs , "d2" , 0755 ), 0 );
315+ ASSERT_EQ (mkdirat (fd_tmpfs , "d3" , 0755 ), 0 );
316+
317+ ASSERT_EQ (sys_move_mount (fd_tmpfs , "" , - EBADF , "/set_layers_via_fds_tmpfs" , MOVE_MOUNT_F_EMPTY_PATH ), 0 );
318+
319+ fd_tmp = open_tree (fd_tmpfs , "u" , OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC );
320+ ASSERT_GE (fd_tmp , 0 );
321+
322+ layer_fds [0 ] = openat (fd_tmp , "upper" , O_CLOEXEC | O_DIRECTORY | O_PATH );
323+ ASSERT_GE (layer_fds [0 ], 0 );
324+
325+ layer_fds [1 ] = openat (fd_tmp , "work" , O_CLOEXEC | O_DIRECTORY | O_PATH );
326+ ASSERT_GE (layer_fds [1 ], 0 );
327+
328+ layer_fds [2 ] = open_tree (fd_tmpfs , "l1" , OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC );
329+ ASSERT_GE (layer_fds [2 ], 0 );
330+
331+ layer_fds [3 ] = open_tree (fd_tmpfs , "l2" , OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC );
332+ ASSERT_GE (layer_fds [3 ], 0 );
333+
334+ layer_fds [4 ] = open_tree (fd_tmpfs , "l3" , OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC );
335+ ASSERT_GE (layer_fds [4 ], 0 );
336+
337+ layer_fds [5 ] = open_tree (fd_tmpfs , "l4" , OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC );
338+ ASSERT_GE (layer_fds [5 ], 0 );
339+
340+ layer_fds [6 ] = open_tree (fd_tmpfs , "d1" , OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC );
341+ ASSERT_GE (layer_fds [6 ], 0 );
342+
343+ layer_fds [7 ] = open_tree (fd_tmpfs , "d2" , OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC );
344+ ASSERT_GE (layer_fds [7 ], 0 );
345+
346+ layer_fds [8 ] = open_tree (fd_tmpfs , "d3" , OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC );
347+ ASSERT_GE (layer_fds [8 ], 0 );
348+
349+ ASSERT_EQ (close (fd_tmpfs ), 0 );
350+
351+ fd_context = sys_fsopen ("overlay" , 0 );
352+ ASSERT_GE (fd_context , 0 );
353+
354+ ASSERT_NE (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "lowerdir" , NULL , layer_fds [2 ]), 0 );
355+
356+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "upperdir" , NULL , layer_fds [0 ]), 0 );
357+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "workdir" , NULL , layer_fds [1 ]), 0 );
358+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "lowerdir+" , NULL , layer_fds [2 ]), 0 );
359+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "lowerdir+" , NULL , layer_fds [3 ]), 0 );
360+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "lowerdir+" , NULL , layer_fds [4 ]), 0 );
361+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "lowerdir+" , NULL , layer_fds [5 ]), 0 );
362+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "datadir+" , NULL , layer_fds [6 ]), 0 );
363+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "datadir+" , NULL , layer_fds [7 ]), 0 );
364+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "datadir+" , NULL , layer_fds [8 ]), 0 );
365+
366+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_STRING , "metacopy" , "on" , 0 ), 0 );
367+
368+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_CMD_CREATE , NULL , NULL , 0 ), 0 );
369+
370+ fd_overlay = sys_fsmount (fd_context , 0 , 0 );
371+ ASSERT_GE (fd_overlay , 0 );
372+
373+ ASSERT_EQ (sys_move_mount (fd_overlay , "" , - EBADF , "/set_layers_via_fds" , MOVE_MOUNT_F_EMPTY_PATH ), 0 );
374+
375+ f_mountinfo = fopen ("/proc/self/mountinfo" , "r" );
376+ ASSERT_NE (f_mountinfo , NULL );
377+
378+ while (getline (& line , & len , f_mountinfo ) != -1 ) {
379+ char * haystack = line ;
380+
381+ if (strstr (haystack , "workdir=/tmp/w" ))
382+ layers_found [0 ] = true;
383+ if (strstr (haystack , "upperdir=/tmp/u" ))
384+ layers_found [1 ] = true;
385+ if (strstr (haystack , "lowerdir+=/tmp/l1" ))
386+ layers_found [2 ] = true;
387+ if (strstr (haystack , "lowerdir+=/tmp/l2" ))
388+ layers_found [3 ] = true;
389+ if (strstr (haystack , "lowerdir+=/tmp/l3" ))
390+ layers_found [4 ] = true;
391+ if (strstr (haystack , "lowerdir+=/tmp/l4" ))
392+ layers_found [5 ] = true;
393+ if (strstr (haystack , "datadir+=/tmp/d1" ))
394+ layers_found [6 ] = true;
395+ if (strstr (haystack , "datadir+=/tmp/d2" ))
396+ layers_found [7 ] = true;
397+ if (strstr (haystack , "datadir+=/tmp/d3" ))
398+ layers_found [8 ] = true;
399+ }
400+ free (line );
401+
402+ for (int i = 0 ; i < ARRAY_SIZE (layer_fds ); i ++ ) {
403+ ASSERT_EQ (layers_found [i ], true);
404+ ASSERT_EQ (close (layer_fds [i ]), 0 );
405+ }
406+
407+ ASSERT_EQ (close (fd_context ), 0 );
408+ ASSERT_EQ (close (fd_overlay ), 0 );
409+ ASSERT_EQ (fclose (f_mountinfo ), 0 );
410+ }
411+
282412TEST_HARNESS_MAIN
0 commit comments