1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * A mount that another namespace's rmdir detached, or that went down with
4 * the detached tree it was in when the tree's last fd was closed, keeps
5 * its submounts connected, and a connected submount is put by its
6 * parent's final mntput(). A submount whose filesystem keeps a file open
7 * on the parent then holds the parent's count above zero for good:
8 * nothing in userspace refers to either mount any more and nothing can
9 * release them. A loop device is the simplest such filesystem, its
10 * backing file sits on the parent.
11 */
12 #define _GNU_SOURCE
13 #include <dirent.h>
14 #include <errno.h>
15 #include <fcntl.h>
16 #include <sched.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <sys/ioctl.h>
21 #include <sys/mount.h>
22 #include <sys/stat.h>
23 #include <stdbool.h>
24 #include <sys/wait.h>
25 #include <unistd.h>
26 #include <linux/fuse.h>
27 #include <linux/keyctl.h>
28 #include <linux/major.h>
29 #include <linux/raid/md_u.h>
30 #include <linux/raid/md_p.h>
31 #include <linux/loop.h>
32 #include <linux/magic.h>
33 #include <sys/syscall.h>
34 #include <sys/sysmacros.h>
35 #include <sys/uio.h>
36
37 #include "../wrappers.h"
38 #include "../../kselftest_harness.h"
39
40 #define IMAGE_SIZE (1440 * 1024)
41 #define SECTOR 512
42
43 /*
44 * The tmpfs of the fixture. A directory of its own from mkdtemp(), so that
45 * the test needs no writable root directory and two instances don't take
46 * each other's mounts down.
47 */
48 static char base[64];
49
50 /* The configfs directory of the gadget, named after the test process. */
51 static char gadget[96];
52
53 /* A path below the base directory. Eight of them can be in use at a time. */
at(const char * rel)54 static const char *at(const char *rel)
55 {
56 static char buf[8][PATH_MAX];
57 static unsigned int next;
58 char *p = buf[next++ % 8];
59
60 snprintf(p, PATH_MAX, "%s/%s", base, rel);
61 return p;
62 }
63
64 /* A path below the gadget's configfs directory. */
gat(const char * rel)65 static const char *gat(const char *rel)
66 {
67 static char buf[4][PATH_MAX];
68 static unsigned int next;
69 char *p = buf[next++ % 4];
70
71 snprintf(p, PATH_MAX, "%s%s", gadget, rel);
72 return p;
73 }
74
75 /* The loop devices this process has bound, to release them on every path. */
76 #define MAX_LOOPS 4
77 static int bound[MAX_LOOPS];
78 static int nr_bound;
79
80 /* What a child tells its parent: the loop devices it has bound, -1 for none. */
81 struct report {
82 int n[2];
83 };
84
85 /* A blank FAT12 floppy image: boot sector, two FATs, an empty root directory. */
write_fat12(int fd)86 static int write_fat12(int fd)
87 {
88 struct stat st;
89 unsigned char sector[SECTOR] = {
90 0xeb, 0x3c, 0x90, 'M', 'S', 'W', 'I', 'N', '4', '.', '1',
91 [11] = 0x00, 0x02, /* bytes per sector: 512 */
92 [13] = 1, /* sectors per cluster */
93 [14] = 1, 0, /* reserved sectors */
94 [16] = 2, /* FATs */
95 [17] = 0xe0, 0x00, /* root directory entries: 224 */
96 [19] = 0x40, 0x0b, /* total sectors: 2880 */
97 [21] = 0xf0, /* media descriptor */
98 [22] = 9, 0, /* sectors per FAT */
99 [24] = 18, 0, /* sectors per track */
100 [26] = 2, 0, /* heads */
101 [38] = 0x29, /* extended boot signature */
102 [39] = 0x12, 0x34, 0x56, 0x78,
103 [43] = 'N', 'O', ' ', 'N', 'A', 'M', 'E', ' ', ' ', ' ', ' ',
104 [54] = 'F', 'A', 'T', '1', '2', ' ', ' ', ' ',
105 [510] = 0x55, 0xaa,
106 };
107 unsigned char fat[SECTOR] = { 0xf0, 0xff, 0xff };
108
109 if (pwrite(fd, sector, SECTOR, 0) != SECTOR)
110 return -1;
111 /* the first FAT and the second one, one sector each is enough */
112 if (pwrite(fd, fat, SECTOR, 1 * SECTOR) != SECTOR ||
113 pwrite(fd, fat, SECTOR, 10 * SECTOR) != SECTOR)
114 return -1;
115 if (fstat(fd, &st) || S_ISBLK(st.st_mode))
116 return 0;
117 return ftruncate(fd, IMAGE_SIZE);
118 }
119
120 /*
121 * A blank FAT12 image with 4 KiB sectors and @sectors of them, for a device
122 * with 4 KiB logical blocks (zram) or for a bigger image than a floppy.
123 */
write_fat12_4k(int fd,unsigned int sectors)124 static int write_fat12_4k(int fd, unsigned int sectors)
125 {
126 unsigned int fat_sectors = (sectors * 3 / 2 + 4095) / 4096;
127 unsigned char sector[4096] = {
128 0xeb, 0x3c, 0x90, 'M', 'S', 'W', 'I', 'N', '4', '.', '1',
129 [11] = 0x00, 0x10, /* bytes per sector: 4096 */
130 [13] = 1, /* sectors per cluster */
131 [14] = 1, 0, /* reserved sectors */
132 [16] = 2, /* FATs */
133 [17] = 128, 0, /* root directory entries: one sector */
134 [19] = sectors & 0xff, sectors >> 8,
135 [21] = 0xf8, /* media descriptor */
136 [22] = fat_sectors, 0,
137 [24] = 63, 0, /* sectors per track */
138 [26] = 255, 0, /* heads */
139 [38] = 0x29, /* extended boot signature */
140 [39] = 0x12, 0x34, 0x56, 0x78,
141 [43] = 'N', 'O', ' ', 'N', 'A', 'M', 'E', ' ', ' ', ' ', ' ',
142 [54] = 'F', 'A', 'T', '1', '2', ' ', ' ', ' ',
143 [510] = 0x55, 0xaa,
144 };
145 unsigned char fat[4096] = { 0xf8, 0xff, 0xff };
146 struct stat st;
147
148 if (pwrite(fd, sector, sizeof(sector), 0) != sizeof(sector))
149 return -1;
150 if (pwrite(fd, fat, sizeof(fat), 1 * 4096) != sizeof(fat) ||
151 pwrite(fd, fat, sizeof(fat), (1 + fat_sectors) * 4096) != sizeof(fat))
152 return -1;
153 if (fstat(fd, &st) || S_ISBLK(st.st_mode))
154 return 0;
155 return ftruncate(fd, (off_t)sectors * 4096);
156 }
157
158 #define MINIX_BLOCK 1024
159 #define MINIX_BLOCKS 4096 /* a 4 MiB image */
160 #define MINIX_INODES 512
161 #define MINIX_ITABLE (MINIX_INODES * 32 / MINIX_BLOCK)
162 #define MINIX_FIRSTDATA (2 + 1 + 1 + MINIX_ITABLE) /* boot, super, imap, zmap, inodes */
163
164 /*
165 * A blank minix v1 image, for the holders that need a FIFO or a device
166 * node on the dying mount, which vfat can't hold. Superblock in block 1,
167 * one block each for the inode and zone bitmaps, the inode table, and
168 * the root directory in the first data zone.
169 */
write_minix(int fd)170 static int write_minix(int fd)
171 {
172 struct {
173 __u16 s_ninodes, s_nzones, s_imap_blocks, s_zmap_blocks;
174 __u16 s_firstdatazone, s_log_zone_size;
175 __u32 s_max_size;
176 __u16 s_magic, s_state;
177 } sb = {
178 .s_ninodes = MINIX_INODES,
179 .s_nzones = MINIX_BLOCKS,
180 .s_imap_blocks = 1,
181 .s_zmap_blocks = 1,
182 .s_firstdatazone = MINIX_FIRSTDATA,
183 .s_max_size = (7 + 512 + 512 * 512) * MINIX_BLOCK,
184 .s_magic = MINIX_SUPER_MAGIC,
185 .s_state = 1, /* MINIX_VALID_FS */
186 };
187 struct {
188 __u16 i_mode, i_uid;
189 __u32 i_size, i_time;
190 __u8 i_gid, i_nlinks;
191 __u16 i_zone[9];
192 } root = {
193 .i_mode = S_IFDIR | 0755,
194 .i_size = 2 * 16,
195 .i_nlinks = 2,
196 .i_zone = { MINIX_FIRSTDATA },
197 };
198 unsigned char imap[MINIX_BLOCK], zmap[MINIX_BLOCK], dir[MINIX_BLOCK] = {};
199 int i;
200
201 /* bit 0 is reserved in both maps, the root inode and its zone are in use */
202 memset(imap, 0xff, sizeof(imap));
203 for (i = 2; i <= MINIX_INODES; i++)
204 imap[i / 8] &= ~(1 << (i % 8));
205 memset(zmap, 0xff, sizeof(zmap));
206 for (i = 2; i <= MINIX_BLOCKS - MINIX_FIRSTDATA; i++)
207 zmap[i / 8] &= ~(1 << (i % 8));
208 dir[0] = 1;
209 dir[2] = '.';
210 dir[16] = 1;
211 dir[18] = '.';
212 dir[19] = '.';
213
214 if (pwrite(fd, &sb, sizeof(sb), 1 * MINIX_BLOCK) != sizeof(sb) ||
215 pwrite(fd, imap, sizeof(imap), 2 * MINIX_BLOCK) != sizeof(imap) ||
216 pwrite(fd, zmap, sizeof(zmap), 3 * MINIX_BLOCK) != sizeof(zmap) ||
217 pwrite(fd, &root, sizeof(root), 4 * MINIX_BLOCK) != sizeof(root) ||
218 pwrite(fd, dir, sizeof(dir), MINIX_FIRSTDATA * MINIX_BLOCK) != sizeof(dir))
219 return -1;
220 return ftruncate(fd, (off_t)MINIX_BLOCKS * MINIX_BLOCK);
221 }
222
read_sysfs(const char * path,char * buf,size_t size)223 static int read_sysfs(const char *path, char *buf, size_t size)
224 {
225 ssize_t n;
226 int fd;
227
228 fd = open(path, O_RDONLY);
229 if (fd < 0)
230 return -1;
231 n = read(fd, buf, size - 1);
232 close(fd);
233 if (n < 0)
234 return -1;
235 buf[n] = '\0';
236 return 0;
237 }
238
239 /* Is @dev the mount source of this line of mountinfo? loop1 is not loop10. */
line_has_source(const char * line,const char * dev)240 static bool line_has_source(const char *line, const char *dev)
241 {
242 const char *sep, *src, *end;
243
244 sep = strstr(line, " - ");
245 if (!sep)
246 return false;
247 src = strchr(sep + 3, ' '); /* skip the filesystem type */
248 if (!src)
249 return false;
250 src++;
251 end = strchr(src, ' ');
252 if (!end)
253 return false;
254 return (size_t)(end - src) == strlen(dev) && !strncmp(src, dev, end - src);
255 }
256
257 /*
258 * Does a mount namespace of a process that /proc shows have a mount of @dev?
259 * The mounts under test are in no namespace at this point on any kernel, so
260 * this only checks that the test got as far as it thinks.
261 */
mounted_anywhere(const char * dev)262 static bool mounted_anywhere(const char *dev)
263 {
264 char path[PATH_MAX], line[4096];
265 struct dirent *de;
266 bool found = false;
267 DIR *proc;
268 FILE *f;
269
270 proc = opendir("/proc");
271 if (!proc)
272 return false;
273 while (!found && (de = readdir(proc))) {
274 if (de->d_name[0] < '0' || de->d_name[0] > '9')
275 continue;
276 snprintf(path, sizeof(path), "/proc/%s/mountinfo", de->d_name);
277 f = fopen(path, "re");
278 if (!f)
279 continue;
280 while (fgets(line, sizeof(line), f)) {
281 if (line_has_source(line, dev)) {
282 found = true;
283 break;
284 }
285 }
286 fclose(f);
287 }
288 closedir(proc);
289 return found;
290 }
291
292 /* Wait up to @ms milliseconds for the loop device to give up its backing file. */
loop_released(const char * sysfs,int ms)293 static bool loop_released(const char *sysfs, int ms)
294 {
295 char buf[PATH_MAX];
296
297 for (; ms > 0; ms -= 100) {
298 if (read_sysfs(sysfs, buf, sizeof(buf)) < 0)
299 return errno == ENOENT;
300 usleep(100000);
301 }
302 return read_sysfs(sysfs, buf, sizeof(buf)) < 0 && errno == ENOENT;
303 }
304
305 /* Tell the loop device to give its file up, now or when its last user is gone. */
loop_clear(int n)306 static void loop_clear(int n)
307 {
308 char dev[32];
309 int lfd;
310
311 if (n < 0)
312 return;
313 snprintf(dev, sizeof(dev), "/dev/loop%d", n);
314 lfd = open(dev, O_RDWR);
315 if (lfd < 0)
316 return;
317 ioctl(lfd, LOOP_CLR_FD);
318 close(lfd);
319 }
320
FIXTURE(loop_cycle)321 FIXTURE(loop_cycle) {
322 char dev[32]; /* the loop device the child set up */
323 char sysfs[64]; /* its backing_file attribute */
324 int loops[MAX_LOOPS]; /* every loop device the case has bound */
325 int nr_loops;
326 bool gadget; /* the gadget's configfs directory exists */
327 };
328
remember_loop(FIXTURE_DATA (loop_cycle)* self,int n)329 static void remember_loop(FIXTURE_DATA(loop_cycle) *self, int n)
330 {
331 if (n >= 0 && self->nr_loops < MAX_LOOPS)
332 self->loops[self->nr_loops++] = n;
333 }
334
FIXTURE_SETUP(loop_cycle)335 FIXTURE_SETUP(loop_cycle)
336 {
337 if (geteuid() != 0)
338 SKIP(return, "test requires CAP_SYS_ADMIN");
339 if (access("/dev/loop-control", R_OK | W_OK))
340 SKIP(return, "test requires loop devices");
341
342 ASSERT_EQ(unshare(CLONE_NEWNS), 0);
343 ASSERT_EQ(mount("", "/", NULL, MS_REC | MS_PRIVATE, NULL), 0);
344
345 snprintf(base, sizeof(base), "/tmp/loop_cycle.XXXXXX");
346 ASSERT_NE(mkdtemp(base), NULL);
347 /* a failed assertion in the setup does not run the teardown */
348 ASSERT_EQ(mount("tmpfs", base, "tmpfs", 0, NULL), 0)
349 rmdir(base);
350 snprintf(gadget, sizeof(gadget),
351 "/sys/kernel/config/usb_gadget/kselftest_cycle_%d", getpid());
352 self->dev[0] = '\0';
353 self->nr_loops = 0;
354 self->gadget = false;
355 }
356
357 static int mount_configfs(void);
358 static void gadget_remove(void);
359
FIXTURE_TEARDOWN(loop_cycle)360 FIXTURE_TEARDOWN(loop_cycle)
361 {
362 if (self->gadget)
363 gadget_remove();
364 /* whatever a failed assertion has left bound */
365 for (int i = 0; i < self->nr_loops; i++)
366 loop_clear(self->loops[i]);
367 umount2(base, MNT_DETACH);
368 rmdir(base);
369 }
370
371 /* Child exit codes. */
372 enum {
373 CHILD_OK,
374 CHILD_NS, /* could not set up the namespace or the tmpfs */
375 CHILD_IMAGE, /* could not write the image */
376 CHILD_LOOP, /* could not set up the loop device */
377 CHILD_MOUNT, /* could not mount it (vfat and msdos both refused) */
378 CHILD_PIPE, /* the parent went away */
379 CHILD_HOLDER, /* could not set the holder up below the mount */
380 CHILD_SKIP, /* the kernel lacks what the holder needs */
381 CHILD_NOFS, /* the kernel lacks the filesystem of the image */
382 };
383
384 /* Bind the loop device that LOOP_CTL_GET_FREE names to @ifd; the device number. */
loop_bind_free(int ifd)385 static int loop_bind_free(int ifd)
386 {
387 int cfd, lfd, n;
388 char dev[32];
389
390 cfd = open("/dev/loop-control", O_RDWR);
391 if (cfd < 0)
392 return -1;
393 n = ioctl(cfd, LOOP_CTL_GET_FREE);
394 close(cfd);
395 if (n < 0)
396 return -1;
397 snprintf(dev, sizeof(dev), "/dev/loop%d", n);
398 lfd = open(dev, O_RDWR);
399 if (lfd < 0)
400 return -1;
401 if (ioctl(lfd, LOOP_SET_FD, ifd))
402 n = -1;
403 close(lfd);
404 return n;
405 }
406
407 /*
408 * Bind a free loop device to the open image @ifd; the device number. The
409 * device is free when LOOP_CTL_GET_FREE names it and may be somebody else's
410 * a moment later, so try again when it is busy.
411 */
loop_bind(int ifd)412 static int loop_bind(int ifd)
413 {
414 int n = -1;
415
416 for (int i = 0; i < 64 && n < 0; i++) {
417 n = loop_bind_free(ifd);
418 if (n < 0 && errno != EBUSY)
419 return -1;
420 }
421 if (n >= 0 && nr_bound < MAX_LOOPS)
422 bound[nr_bound++] = n;
423 return n;
424 }
425
426 /* Mount a FAT image, as vfat or as msdos; -1 with ENODEV if the kernel has neither. */
mount_fat(const char * dev,const char * mp)427 static int mount_fat(const char *dev, const char *mp)
428 {
429 int err;
430
431 if (!mount(dev, mp, "vfat", 0, NULL))
432 return 0;
433 err = errno;
434 if (!mount(dev, mp, "msdos", 0, NULL))
435 return 0;
436 if (err != ENODEV)
437 errno = err;
438 return -1;
439 }
440
441 /*
442 * A child that gives up has to take down what it has set up: nobody else
443 * knows about it. Unmount, then tell the loop devices to let go. The mounts
444 * are released after this process is gone and the devices follow them.
445 */
child_fails(int ret)446 static int child_fails(int ret)
447 {
448 umount2(at("vol"), MNT_DETACH);
449 umount2(at("vol2"), MNT_DETACH);
450 umount2(at("p"), MNT_DETACH);
451 umount2(at("img"), MNT_DETACH);
452 for (int i = 0; i < nr_bound; i++)
453 loop_clear(bound[i]);
454 return ret;
455 }
456
457 /* Write an image to @img, bind a loop device to it and mount that at @mp; the device number. */
loop_mount(const char * img,const char * mp)458 static int loop_mount(const char *img, const char *mp)
459 {
460 char dev[32];
461 int ifd, n;
462
463 ifd = open(img, O_RDWR | O_CREAT | O_EXCL, 0600);
464 if (ifd < 0 || write_fat12(ifd))
465 return -CHILD_IMAGE;
466 n = loop_bind(ifd);
467 close(ifd); /* the loop device holds the file from now on */
468 if (n < 0)
469 return -CHILD_LOOP;
470 snprintf(dev, sizeof(dev), "/dev/loop%d", n);
471 if (mkdir(mp, 0755))
472 return -CHILD_MOUNT;
473 if (mount_fat(dev, mp))
474 return errno == ENODEV ? -CHILD_NOFS : -CHILD_MOUNT;
475 return n;
476 }
477
478 /*
479 * Two tmpfs mounts, each carrying the image of the loop mount below the
480 * other: the loop mount below vol has its image on vol2 and the other way
481 * round.
482 */
crossed_child(int to_parent,int from_parent)483 static int crossed_child(int to_parent, int from_parent)
484 {
485 struct report r;
486 char c;
487
488 if (unshare(CLONE_NEWNS) || mount("", "/", NULL, MS_REC | MS_PRIVATE, NULL))
489 return CHILD_NS;
490 if (mkdir(at("vol"), 0755) || mount("tmpfs", at("vol"), "tmpfs", 0, NULL) ||
491 mkdir(at("vol2"), 0755) || mount("tmpfs", at("vol2"), "tmpfs", 0, NULL))
492 return child_fails(CHILD_NS);
493 r.n[0] = loop_mount(at("vol2/img"), at("vol/mnt"));
494 if (r.n[0] < 0)
495 return child_fails(-r.n[0]);
496 r.n[1] = loop_mount(at("vol/img"), at("vol2/mnt"));
497 if (r.n[1] < 0)
498 return child_fails(-r.n[1]);
499 if (write(to_parent, &r, sizeof(r)) != sizeof(r))
500 return child_fails(CHILD_PIPE);
501 if (read(from_parent, &c, 1) != 1)
502 return child_fails(CHILD_PIPE);
503 return CHILD_OK;
504 }
505
506 /*
507 * In its own mount namespace the child mounts a tmpfs on vol,
508 * puts a filesystem image on it, binds a loop device to the image and
509 * mounts that loop device below. The loop device's backing file is a
510 * reference on the mount the image is on, held by the loop device, held
511 * by the mounted filesystem, held by the mount below.
512 */
loop_child(int to_parent,int from_parent)513 static int loop_child(int to_parent, int from_parent)
514 {
515 struct report r = { { -1, -1 } };
516 char c;
517
518 if (unshare(CLONE_NEWNS) || mount("", "/", NULL, MS_REC | MS_PRIVATE, NULL))
519 return CHILD_NS;
520 if (mkdir(at("vol"), 0755) || mount("tmpfs", at("vol"), "tmpfs", 0, NULL))
521 return child_fails(CHILD_NS);
522 r.n[0] = loop_mount(at("vol/img"), at("vol/mnt"));
523 if (r.n[0] < 0)
524 return child_fails(-r.n[0]);
525
526 if (write(to_parent, &r, sizeof(r)) != sizeof(r))
527 return child_fails(CHILD_PIPE);
528 /* keep the namespace alive while the parent removes the directory */
529 if (read(from_parent, &c, 1) != 1)
530 return child_fails(CHILD_PIPE);
531 return CHILD_OK;
532 }
533
534 /*
535 * The child did not report. Skip if the kernel lacks something, fail with
536 * what the child said otherwise. A child that a signal killed has failed.
537 */
538 #define CHILD_GAVE_UP(pid) do { \
539 int __status; \
540 \
541 ASSERT_EQ(waitpid(pid, &__status, 0), pid); \
542 if (WIFEXITED(__status) && WEXITSTATUS(__status) == CHILD_NOFS) \
543 SKIP(return, "test requires the filesystem of the image (FAT or minix)"); \
544 if (WIFEXITED(__status) && WEXITSTATUS(__status) == CHILD_SKIP) \
545 SKIP(return, "the kernel lacks what this holder needs"); \
546 ASSERT_TRUE(false) \
547 TH_LOG("child failed to set up: %s %d", \
548 WIFEXITED(__status) ? "exit status" : "signal", \
549 WIFEXITED(__status) ? WEXITSTATUS(__status) : WTERMSIG(__status)); \
550 } while (0)
551
552 /* The child has to leave by itself and with nothing to complain about. */
553 #define CHILD_LEFT(pid) do { \
554 int __status; \
555 \
556 ASSERT_EQ(waitpid(pid, &__status, 0), pid); \
557 ASSERT_TRUE(WIFEXITED(__status)); \
558 ASSERT_EQ(WEXITSTATUS(__status), CHILD_OK); \
559 } while (0)
560
561 /*
562 * An exclusive open of the device fails while a filesystem holds it, and
563 * the only filesystem that ever did is the one mounted below the dead
564 * mount. Give a release in flight a moment. Then the device must clear
565 * right away rather than only be marked for autoclear.
566 */
assert_loop_released(struct __test_metadata * _metadata,FIXTURE_DATA (loop_cycle)* self)567 static void assert_loop_released(struct __test_metadata *_metadata,
568 FIXTURE_DATA(loop_cycle) *self)
569 {
570 int lfd;
571
572 for (int i = 0; i < 20; i++) {
573 lfd = open(self->dev, O_RDONLY | O_EXCL);
574 if (lfd >= 0)
575 break;
576 usleep(100000);
577 }
578 EXPECT_GE(lfd, 0)
579 TH_LOG("%s is still held by the loop mount below the dead mount: nothing refers to either mount and nothing can release them",
580 self->dev);
581 if (lfd >= 0)
582 close(lfd);
583
584 lfd = open(self->dev, O_RDWR);
585 ASSERT_GE(lfd, 0);
586 ASSERT_EQ(ioctl(lfd, LOOP_CLR_FD), 0);
587 close(lfd);
588 ASSERT_TRUE(loop_released(self->sysfs, 5000))
589 TH_LOG("%s kept its backing file after LOOP_CLR_FD: the filesystem on it is still mounted somewhere nobody can reach",
590 self->dev);
591 /* somebody else may bind it from now on, so the teardown leaves it alone */
592 for (int i = 0; i < self->nr_loops; i++) {
593 char dev[32];
594
595 snprintf(dev, sizeof(dev), "/dev/loop%d", self->loops[i]);
596 if (!strcmp(dev, self->dev))
597 self->loops[i] = -1;
598 }
599 }
600
601 /*
602 * rmdir of vol from here, where it is not a mountpoint, detaches
603 * the child's tmpfs with the loop mount connected below it. Once the child
604 * is gone nothing refers to either mount. The loop device must then be
605 * free to give up its backing file, which only happens when the mounted
606 * filesystem below the detached tmpfs has been released.
607 */
TEST_F(loop_cycle,detached_loop_mount_released)608 TEST_F(loop_cycle, detached_loop_mount_released)
609 {
610 int to_parent[2], to_child[2];
611 struct report r = { { -1, -1 } };
612 char buf[PATH_MAX];
613 pid_t pid;
614
615 ASSERT_EQ(pipe(to_parent), 0);
616 ASSERT_EQ(pipe(to_child), 0);
617
618 pid = fork();
619 ASSERT_GE(pid, 0);
620 if (pid == 0) {
621 close(to_parent[0]);
622 close(to_child[1]);
623 _exit(loop_child(to_parent[1], to_child[0]));
624 }
625 close(to_parent[1]);
626 close(to_child[0]);
627
628 if (read(to_parent[0], &r, sizeof(r)) != sizeof(r))
629 CHILD_GAVE_UP(pid);
630 remember_loop(self, r.n[0]);
631 snprintf(self->dev, sizeof(self->dev), "/dev/loop%d", r.n[0]);
632 snprintf(self->sysfs, sizeof(self->sysfs), "/sys/block/loop%d/loop/backing_file", r.n[0]);
633 ASSERT_EQ(read_sysfs(self->sysfs, buf, sizeof(buf)), 0);
634 ASSERT_NE(strstr(buf, "/vol/img"), NULL);
635
636 /* not a mountpoint in this namespace, so the directory can go */
637 ASSERT_EQ(rmdir(at("vol")), 0);
638
639 /* the child leaves: its namespace and every reference it held are gone */
640 ASSERT_EQ(write(to_child[1], "", 1), 1);
641 CHILD_LEFT(pid);
642 close(to_parent[0]);
643 close(to_child[1]);
644
645 /* nothing can reach the two mounts any more */
646 ASSERT_EQ(access(at("vol"), F_OK), -1);
647 ASSERT_FALSE(mounted_anywhere(self->dev));
648
649 assert_loop_released(_metadata, self);
650 }
651
652 /*
653 * The same two mounts in a detached tree: a clone of vol from
654 * open_tree(), the image opened through the clone so that the loop device
655 * holds the clone, and the loop mount moved below the clone. The last
656 * close of the tree's fd dissolves the tree with the loop mount left
657 * connected below the dead clone, and nothing refers to either afterwards.
658 */
TEST_F(loop_cycle,dissolved_tree_loop_mount_released)659 TEST_F(loop_cycle, dissolved_tree_loop_mount_released)
660 {
661 int tfd, ifd, fsfd, mfd, n;
662 char buf[PATH_MAX];
663
664 fsfd = sys_fsopen("vfat", 0);
665 if (fsfd < 0)
666 fsfd = sys_fsopen("msdos", 0);
667 if (fsfd < 0)
668 SKIP(return, "test requires a FAT filesystem");
669
670 ASSERT_EQ(mkdir(at("vol"), 0755), 0);
671 ASSERT_EQ(mount("tmpfs", at("vol"), "tmpfs", 0, NULL), 0);
672 tfd = sys_open_tree(AT_FDCWD, at("vol"), OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
673 ASSERT_GE(tfd, 0);
674
675 /* the image, opened through the clone: the loop device holds the clone */
676 ifd = openat(tfd, "img", O_RDWR | O_CREAT | O_EXCL, 0600);
677 ASSERT_GE(ifd, 0);
678 ASSERT_EQ(write_fat12(ifd), 0);
679 n = loop_bind(ifd);
680 close(ifd);
681 ASSERT_GE(n, 0);
682 remember_loop(self, n);
683 snprintf(self->dev, sizeof(self->dev), "/dev/loop%d", n);
684 snprintf(self->sysfs, sizeof(self->sysfs), "/sys/block/loop%d/loop/backing_file", n);
685
686 /* the loop mount, moved below the clone */
687 ASSERT_EQ(mkdirat(tfd, "mnt", 0755), 0);
688 ASSERT_EQ(sys_fsconfig(fsfd, FSCONFIG_SET_STRING, "source", self->dev, 0), 0);
689 ASSERT_EQ(sys_fsconfig(fsfd, FSCONFIG_CMD_CREATE, NULL, NULL, 0), 0);
690 mfd = sys_fsmount(fsfd, 0, 0);
691 ASSERT_GE(mfd, 0);
692 close(fsfd);
693 ASSERT_EQ(sys_move_mount(mfd, "", tfd, "mnt", MOVE_MOUNT_F_EMPTY_PATH), 0);
694 close(mfd);
695
696 ASSERT_EQ(read_sysfs(self->sysfs, buf, sizeof(buf)), 0);
697 ASSERT_NE(strstr(buf, "img"), NULL);
698
699 /* the last fd of the tree: both mounts die, the loop mount connected */
700 close(tfd);
701
702 /* nothing can reach the two mounts any more */
703 ASSERT_FALSE(mounted_anywhere(self->dev));
704
705 assert_loop_released(_metadata, self);
706 }
707
708 /*
709 * The cycle in two steps: rmdir of vol leaves the loop mount below it
710 * connected while its image's mount, vol2, is alive; then rmdir of vol2
711 * takes that one with the loop mount whose image is on the dead vol. Each
712 * dead mount now owns a loop mount whose filesystem pins the other.
713 */
TEST_F(loop_cycle,crossed_images_released)714 TEST_F(loop_cycle, crossed_images_released)
715 {
716 int to_parent[2], to_child[2];
717 struct report r = { { -1, -1 } };
718 char sysfs[2][64], dev[2][32];
719 pid_t pid;
720
721 ASSERT_EQ(pipe(to_parent), 0);
722 ASSERT_EQ(pipe(to_child), 0);
723
724 pid = fork();
725 ASSERT_GE(pid, 0);
726 if (pid == 0) {
727 close(to_parent[0]);
728 close(to_child[1]);
729 _exit(crossed_child(to_parent[1], to_child[0]));
730 }
731 close(to_parent[1]);
732 close(to_child[0]);
733
734 if (read(to_parent[0], &r, sizeof(r)) != sizeof(r))
735 CHILD_GAVE_UP(pid);
736 for (int i = 0; i < 2; i++) {
737 remember_loop(self, r.n[i]);
738 snprintf(dev[i], sizeof(dev[i]), "/dev/loop%d", r.n[i]);
739 snprintf(sysfs[i], sizeof(sysfs[i]), "/sys/block/loop%d/loop/backing_file", r.n[i]);
740 }
741
742 /* step one: the mount with the first loop mount below it goes */
743 ASSERT_EQ(rmdir(at("vol")), 0);
744
745 /* step two: the other one, with the loop mount whose image is on the first */
746 ASSERT_EQ(rmdir(at("vol2")), 0);
747
748 /* the child leaves: its namespace and every reference it held are gone */
749 ASSERT_EQ(write(to_child[1], "", 1), 1);
750 CHILD_LEFT(pid);
751 close(to_parent[0]);
752 close(to_child[1]);
753
754 /* nothing can reach the four mounts any more */
755 for (int i = 0; i < 2; i++) {
756 ASSERT_FALSE(mounted_anywhere(dev[i]));
757 strcpy(self->dev, dev[i]);
758 strcpy(self->sysfs, sysfs[i]);
759 assert_loop_released(_metadata, self);
760 }
761 }
762
763 /*
764 * The holders. Each keeps a file or a path on a mount P for as long as
765 * its own filesystem or device lives, and each has that filesystem or
766 * device mounted at C below P. Once another namespace's rmdir has
767 * detached P with C connected below it and the child is gone, P is owned
768 * by nobody, C by P, and P is kept by whatever the holder still holds.
769 *
770 * P is a loop mount so that its death can be observed: the loop device
771 * gives its backing file up when P's superblock goes. The image sits on
772 * a tmpfs next to P, not above it, so the loop device's own reference is
773 * not part of the picture.
774 */
775 enum holder {
776 HOLDER_AUTOFS, /* a FIFO on P as the daemon's pipe */
777 HOLDER_ZRAM, /* a device node on P as the writeback device */
778 HOLDER_ECRYPTFS, /* a directory on P as the lower directory */
779 HOLDER_BINFMT_MISC, /* an executable on P as an 'F' interpreter */
780 HOLDER_FUSE, /* a file on P as a passthrough backing file */
781 HOLDER_ZLOOP, /* a directory on P for the zone files */
782 HOLDER_GADGET, /* a file on P as a mass storage LUN, over dummy_hcd */
783 HOLDER_MD, /* a file on P as an array's bitmap file */
784 };
785
786 #define HOLDER_IMG at("img/p.img")
787 #define HOLDER_MNT at("p")
788 #define HOLDER_BELOW at("p/c")
789
write_file(const char * path,const char * s)790 static int write_file(const char *path, const char *s)
791 {
792 int fd = open(path, O_WRONLY);
793 ssize_t n;
794
795 if (fd < 0)
796 return -1;
797 n = write(fd, s, strlen(s));
798 close(fd);
799 return n == (ssize_t)strlen(s) ? 0 : -1;
800 }
801
802 /* Bind a free loop device to @img; the device number. */
loop_attach(const char * img)803 static int loop_attach(const char *img)
804 {
805 int ifd, n;
806
807 ifd = open(img, O_RDWR);
808 if (ifd < 0)
809 return -1;
810 n = loop_bind(ifd);
811 close(ifd);
812 return n;
813 }
814
holder_autofs(void)815 static int holder_autofs(void)
816 {
817 char opts[64];
818 int pfd;
819
820 if (mkfifo(at("p/pipe"), 0600))
821 return CHILD_HOLDER;
822 pfd = open(at("p/pipe"), O_RDWR);
823 if (pfd < 0)
824 return CHILD_HOLDER;
825 snprintf(opts, sizeof(opts), "fd=%d,minproto=5,maxproto=5", pfd);
826 if (mount("autofs", HOLDER_BELOW, "autofs", 0, opts))
827 return errno == ENODEV ? CHILD_SKIP : CHILD_HOLDER;
828 close(pfd); /* the mount keeps its own */
829 return CHILD_OK;
830 }
831
832 /*
833 * zram's writeback device has to be a block device node, and that node has
834 * to be on P. Point it at a second loop device.
835 */
836 static void zram_reset(void);
837
holder_zram(void)838 static int holder_zram(void)
839 {
840 char dev[32], buf[64];
841 struct stat st;
842 int fd, n;
843
844 if (access("/sys/block/zram0/backing_dev", W_OK))
845 return CHILD_SKIP;
846 /* somebody else's device, leave it alone */
847 if (read_sysfs("/sys/block/zram0/initstate", buf, sizeof(buf)) || buf[0] != '0')
848 return CHILD_SKIP;
849 fd = open(at("img/wb.img"), O_RDWR | O_CREAT | O_EXCL, 0600);
850 if (fd < 0 || ftruncate(fd, IMAGE_SIZE))
851 return CHILD_HOLDER;
852 close(fd);
853 n = loop_attach(at("img/wb.img"));
854 if (n < 0)
855 return CHILD_HOLDER;
856 /* the minor is not the number of the device when loop has partitions */
857 snprintf(dev, sizeof(dev), "/dev/loop%d", n);
858 if (stat(dev, &st) || mknod(at("p/wbdev"), S_IFBLK | 0600, st.st_rdev))
859 return CHILD_HOLDER;
860 if (write_file("/sys/block/zram0/backing_dev", at("p/wbdev")))
861 return CHILD_HOLDER;
862 snprintf(buf, sizeof(buf), "%d", 4 * 1024 * 1024);
863 if (write_file("/sys/block/zram0/disksize", buf))
864 goto undo;
865 fd = open("/dev/zram0", O_RDWR);
866 if (fd < 0)
867 goto undo;
868 n = write_fat12_4k(fd, 1024); /* zram has 4 KiB blocks */
869 close(fd); /* the reset in undo is refused while the device is open */
870 if (n)
871 goto undo;
872 if (mount_fat("/dev/zram0", HOLDER_BELOW)) {
873 n = errno == ENODEV ? CHILD_NOFS : CHILD_HOLDER;
874 zram_reset();
875 return n;
876 }
877 return CHILD_OK;
878 undo:
879 zram_reset();
880 return CHILD_HOLDER;
881 }
882
883 /* Is @alg in /proc/crypto? A module is listed once a request has loaded it. */
crypto_has(const char * alg)884 static bool crypto_has(const char *alg)
885 {
886 char line[256], name[64];
887 bool found = false;
888 FILE *f;
889
890 f = fopen("/proc/crypto", "r");
891 if (!f)
892 return true; /* no way to tell, assume it is */
893 while (!found && fgets(line, sizeof(line), f))
894 found = sscanf(line, "name : %63s", name) == 1 && !strcmp(name, alg);
895 fclose(f);
896 return found;
897 }
898
899 /* The kernel's auth token layout, which userspace has to match byte for byte. */
900 struct ecryptfs_auth_tok {
901 __u16 version;
902 __u16 token_type;
903 __u32 flags;
904 struct {
905 __u32 flags, encrypted_key_size, decrypted_key_size;
906 __u8 encrypted_key[512], decrypted_key[64];
907 } session_key;
908 __u8 reserved[32];
909 struct {
910 __u32 password_bytes;
911 __s32 hash_algo;
912 __u32 hash_iterations, session_key_encryption_key_bytes, flags;
913 __u8 session_key_encryption_key[64];
914 __u8 signature[17];
915 __u8 salt[8];
916 } password;
917 } __attribute__((packed));
918
919 #define ECRYPTFS_SIG "0123456789abcdef"
920
holder_ecryptfs(void)921 static int holder_ecryptfs(void)
922 {
923 struct ecryptfs_auth_tok tok = {
924 .version = 0x0004,
925 .token_type = 0, /* ECRYPTFS_PASSWORD */
926 .password.session_key_encryption_key_bytes = 16,
927 .password.flags = 0x02, /* ECRYPTFS_SESSION_KEY_ENCRYPTION_KEY_SET */
928 .password.signature = ECRYPTFS_SIG,
929 };
930
931 /* a session keyring of this child's own, so that the key goes with it */
932 if (syscall(__NR_keyctl, KEYCTL_JOIN_SESSION_KEYRING, NULL) < 0)
933 return errno == ENOSYS ? CHILD_SKIP : CHILD_HOLDER;
934 if (syscall(__NR_add_key, "user", ECRYPTFS_SIG, &tok, sizeof(tok),
935 KEY_SPEC_SESSION_KEYRING) < 0)
936 return CHILD_HOLDER;
937 if (mkdir(at("p/lower"), 0755))
938 return CHILD_HOLDER;
939 if (mount(at("p/lower"), HOLDER_BELOW, "ecryptfs", 0,
940 "ecryptfs_sig=" ECRYPTFS_SIG ",ecryptfs_cipher=aes,ecryptfs_key_bytes=16")) {
941 /* EINVAL without the cipher; a module is loaded by the attempt */
942 if (errno == ENODEV || (errno == EINVAL && !crypto_has("aes")))
943 return CHILD_SKIP;
944 return CHILD_HOLDER;
945 }
946 return CHILD_OK;
947 }
948
949 /*
950 * binfmt_misc instances are per user namespace, so the mount below P is
951 * made from a new one, which gets a copy of P.
952 */
holder_binfmt_misc(void)953 static int holder_binfmt_misc(void)
954 {
955 static const char interp[] = "#!/bin/true\n";
956 char reg[PATH_MAX];
957 int out;
958
959 /* 'F' opens the interpreter at registration, nothing runs it here */
960 out = open(at("p/interp"), O_WRONLY | O_CREAT | O_EXCL, 0755);
961 if (out < 0 || write(out, interp, sizeof(interp) - 1) != sizeof(interp) - 1)
962 return CHILD_HOLDER;
963 close(out);
964
965 /* ENOSPC: user.max_user_namespaces is 0, EPERM: an LSM says no */
966 if (unshare(CLONE_NEWUSER | CLONE_NEWNS)) {
967 if (errno == EINVAL || errno == ENOSPC || errno == EPERM)
968 return CHILD_SKIP;
969 return CHILD_HOLDER;
970 }
971 if (write_file("/proc/self/setgroups", "deny") ||
972 write_file("/proc/self/uid_map", "0 0 1") ||
973 write_file("/proc/self/gid_map", "0 0 1"))
974 return CHILD_HOLDER;
975 if (mount("binfmt_misc", HOLDER_BELOW, "binfmt_misc", 0, NULL))
976 return errno == ENODEV ? CHILD_SKIP : CHILD_HOLDER;
977 snprintf(reg, sizeof(reg), ":cycle:E::cyc::%s:F", at("p/interp"));
978 if (write_file(at("p/c/register"), reg))
979 return CHILD_HOLDER;
980 return CHILD_OK;
981 }
982
983 /*
984 * A fuse server that only ever answers FUSE_INIT, with passthrough on, and
985 * then registers a file on P as a backing file. The registration alone
986 * makes the fuse superblock hold the file.
987 */
holder_fuse(void)988 static int holder_fuse(void)
989 {
990 struct fuse_backing_map map = {};
991 struct fuse_in_header *ih;
992 struct fuse_init_out init = {
993 .major = FUSE_KERNEL_VERSION,
994 .minor = FUSE_KERNEL_MINOR_VERSION,
995 .flags = FUSE_INIT_EXT,
996 .flags2 = FUSE_PASSTHROUGH >> 32,
997 .max_write = 4096,
998 .max_stack_depth = 1,
999 };
1000 struct fuse_out_header oh = { .len = sizeof(oh) + sizeof(init) };
1001 struct iovec iov[2] = { { &oh, sizeof(oh) }, { &init, sizeof(init) } };
1002 char opts[64], buf[8192];
1003 int ffd, bfd;
1004 ssize_t n;
1005
1006 bfd = open(at("p/backing"), O_RDWR | O_CREAT | O_EXCL, 0600);
1007 if (bfd < 0)
1008 return CHILD_HOLDER;
1009 ffd = open("/dev/fuse", O_RDWR);
1010 if (ffd < 0)
1011 return CHILD_SKIP;
1012 snprintf(opts, sizeof(opts), "fd=%d,rootmode=40000,user_id=0,group_id=0", ffd);
1013 if (mount("fuse", HOLDER_BELOW, "fuse", 0, opts))
1014 return errno == ENODEV ? CHILD_SKIP : CHILD_HOLDER;
1015
1016 n = read(ffd, buf, sizeof(buf));
1017 ih = (void *)buf;
1018 if (n < (ssize_t)sizeof(*ih) || ih->opcode != FUSE_INIT)
1019 return CHILD_HOLDER;
1020 oh.unique = ih->unique;
1021 if (writev(ffd, iov, 2) != (ssize_t)oh.len)
1022 return CHILD_HOLDER;
1023
1024 map.fd = bfd;
1025 if (ioctl(ffd, FUSE_DEV_IOC_BACKING_OPEN, &map) < 0) {
1026 /* EOPNOTSUPP: no FUSE_PASSTHROUGH, ENOTTY: no such ioctl */
1027 if (errno == EPERM || errno == EOPNOTSUPP || errno == ENOTTY)
1028 return CHILD_SKIP;
1029 return CHILD_HOLDER;
1030 }
1031 close(bfd); /* the connection keeps its own */
1032 return CHILD_OK; /* ffd stays open until the child exits */
1033 }
1034
1035 /* Wait for a device node the kernel is about to create. */
open_when_there(const char * dev,int flags,int ms)1036 static int open_when_there(const char *dev, int flags, int ms)
1037 {
1038 int fd;
1039
1040 for (; ms > 0; ms -= 100) {
1041 fd = open(dev, flags);
1042 if (fd >= 0)
1043 return fd;
1044 usleep(100000);
1045 }
1046 return -1;
1047 }
1048
1049 /*
1050 * zloop keeps every zone file open. One conventional zone is enough for a
1051 * FAT image, the sequential one stays empty.
1052 */
holder_zloop(void)1053 static int holder_zloop(void)
1054 {
1055 char cmd[PATH_MAX];
1056 int fd, ret = CHILD_HOLDER;
1057
1058 if (access("/dev/zloop-control", W_OK))
1059 return CHILD_SKIP;
1060 /* somebody else's device, leave it alone */
1061 if (!access("/sys/block/zloop0", F_OK))
1062 return CHILD_SKIP;
1063 if (mkdir(at("p/zl"), 0755) || mkdir(at("p/zl/0"), 0755))
1064 return CHILD_HOLDER;
1065 snprintf(cmd, sizeof(cmd),
1066 "add id=0,capacity_mb=8,zone_size_mb=4,conv_zones=1,base_dir=%s",
1067 at("p/zl"));
1068 if (write_file("/dev/zloop-control", cmd))
1069 return CHILD_HOLDER;
1070 fd = open_when_there("/dev/zloop0", O_RDWR, 5000);
1071 if (fd < 0 || write_fat12_4k(fd, 1024)) /* 4 KiB blocks, like P */
1072 goto undo;
1073 close(fd);
1074 fd = -1;
1075 if (mount_fat("/dev/zloop0", HOLDER_BELOW)) {
1076 ret = errno == ENODEV ? CHILD_NOFS : CHILD_HOLDER;
1077 goto undo;
1078 }
1079 return CHILD_OK;
1080 undo:
1081 if (fd >= 0)
1082 close(fd);
1083 write_file("/dev/zloop-control", "remove id=0");
1084 return ret;
1085 }
1086
mount_configfs(void)1087 static int mount_configfs(void)
1088 {
1089 if (access("/sys/kernel/config", F_OK))
1090 return -1;
1091 if (mount("configfs", "/sys/kernel/config", "configfs", 0, NULL) && errno != EBUSY)
1092 return -1;
1093 return 0;
1094 }
1095
1096 /* Take the gadget out of configfs again, in the reverse order of its creation. */
gadget_remove(void)1097 static void gadget_remove(void)
1098 {
1099 if (mount_configfs())
1100 return;
1101 write_file(gat("/functions/mass_storage.0/lun.0/file"), "\n");
1102 write_file(gat("/UDC"), "\n");
1103 unlink(gat("/configs/c.1/mass_storage.0"));
1104 rmdir(gat("/configs/c.1/strings/0x409"));
1105 rmdir(gat("/configs/c.1"));
1106 rmdir(gat("/functions/mass_storage.0"));
1107 rmdir(gat("/strings/0x409"));
1108 rmdir(gat(""));
1109 }
1110
1111 /* The disk usb-storage created for the gadget, by the LUN's inquiry string. */
find_gadget_disk(char * dev,size_t len,int ms)1112 static int find_gadget_disk(char *dev, size_t len, int ms)
1113 {
1114 char path[PATH_MAX], model[64];
1115 struct dirent *de;
1116 DIR *d;
1117
1118 for (; ms > 0; ms -= 100, usleep(100000)) {
1119 d = opendir("/sys/block");
1120 if (!d)
1121 return -1;
1122 while ((de = readdir(d))) {
1123 if (strncmp(de->d_name, "sd", 2))
1124 continue;
1125 snprintf(path, sizeof(path), "/sys/block/%s/device/model", de->d_name);
1126 if (read_sysfs(path, model, sizeof(model)) ||
1127 strncmp(model, "File-Stor Gadget", 16))
1128 continue;
1129 snprintf(dev, len, "/dev/%s", de->d_name);
1130 closedir(d);
1131 return 0;
1132 }
1133 closedir(d);
1134 }
1135 return -1;
1136 }
1137
1138 /*
1139 * A mass storage gadget bound to the dummy UDC, so that this kernel is
1140 * also the USB host that sees the LUN as a SCSI disk. sd locks the
1141 * medium on open, which is what keeps the LUN's file from being ejected.
1142 */
1143 #define GADGET_STEP(x) do { \
1144 if (x) { \
1145 fprintf(stderr, "gadget: %s failed: %s\n", #x, strerror(errno)); \
1146 gadget_remove(); \
1147 return CHILD_HOLDER; \
1148 } \
1149 } while (0)
1150
holder_gadget(void)1151 static int holder_gadget(void)
1152 {
1153 char dev[PATH_MAX];
1154 int fd;
1155
1156 if (mount_configfs())
1157 return CHILD_SKIP;
1158 if (access("/sys/kernel/config/usb_gadget", F_OK) ||
1159 access("/sys/class/udc/dummy_udc.0", F_OK))
1160 return CHILD_SKIP;
1161
1162 fd = open(at("p/lun.img"), O_RDWR | O_CREAT | O_EXCL, 0600);
1163 if (fd < 0 || write_fat12(fd))
1164 return CHILD_HOLDER;
1165 close(fd);
1166
1167 GADGET_STEP(mkdir(gat(""), 0755));
1168 GADGET_STEP(write_file(gat("/idVendor"), "0x1d6b"));
1169 GADGET_STEP(write_file(gat("/idProduct"), "0x0104"));
1170 GADGET_STEP(mkdir(gat("/strings/0x409"), 0755));
1171 GADGET_STEP(write_file(gat("/strings/0x409/serialnumber"), "1"));
1172 GADGET_STEP(write_file(gat("/strings/0x409/manufacturer"), "kselftest"));
1173 GADGET_STEP(write_file(gat("/strings/0x409/product"), "cycle"));
1174 GADGET_STEP(mkdir(gat("/configs/c.1"), 0755));
1175 GADGET_STEP(mkdir(gat("/configs/c.1/strings/0x409"), 0755));
1176 GADGET_STEP(write_file(gat("/configs/c.1/strings/0x409/configuration"), "c"));
1177 GADGET_STEP(mkdir(gat("/functions/mass_storage.0"), 0755));
1178 GADGET_STEP(write_file(gat("/functions/mass_storage.0/lun.0/removable"), "1"));
1179 GADGET_STEP(write_file(gat("/functions/mass_storage.0/lun.0/file"), at("p/lun.img")));
1180 GADGET_STEP(symlink(gat("/functions/mass_storage.0"), gat("/configs/c.1/mass_storage.0")));
1181 /* EBUSY: the controller is somebody else's, leave it alone */
1182 if (write_file(gat("/UDC"), "dummy_udc.0")) {
1183 fd = errno == EBUSY ? CHILD_SKIP : CHILD_HOLDER;
1184 gadget_remove();
1185 return fd;
1186 }
1187
1188 /* usb-storage waits a second before it scans the device */
1189 if (find_gadget_disk(dev, sizeof(dev), 15000)) {
1190 /* without usb-storage and sd the LUN never shows up as a disk */
1191 fd = (access("/sys/bus/usb/drivers/usb-storage", F_OK) ||
1192 access("/sys/bus/scsi/drivers/sd", F_OK)) ? CHILD_SKIP : CHILD_HOLDER;
1193 gadget_remove();
1194 return fd;
1195 }
1196 fd = open_when_there(dev, O_RDONLY, 5000);
1197 GADGET_STEP(fd < 0);
1198 close(fd);
1199 if (mount_fat(dev, HOLDER_BELOW)) {
1200 fd = errno == ENODEV ? CHILD_NOFS : CHILD_HOLDER;
1201 gadget_remove();
1202 return fd;
1203 }
1204 return CHILD_OK;
1205 }
1206
1207 #define BITMAP_MAGIC 0x6d746962
1208
1209 /*
1210 * A RAID1 of one loop device, not persistent, with its bitmap in a file
1211 * on P. The bitmap file needs a superblock the kernel accepts; sync_size,
1212 * uuid and events are not looked at for a non-persistent array.
1213 */
holder_md(void)1214 static int holder_md(void)
1215 {
1216 struct {
1217 __u32 magic, version;
1218 __u8 uuid[16];
1219 __u64 events, events_cleared, sync_size;
1220 __u32 state, chunksize, daemon_sleep, write_behind;
1221 } bsb = {
1222 .magic = BITMAP_MAGIC,
1223 .version = 4,
1224 .chunksize = 64 * 1024,
1225 .daemon_sleep = 5,
1226 };
1227 mdu_array_info_t info = {
1228 .level = 1,
1229 .raid_disks = 1,
1230 .size = 8 * 1024, /* KiB */
1231 .not_persistent = 1,
1232 };
1233 mdu_disk_info_t disk = {
1234 .major = 7,
1235 .state = (1 << MD_DISK_ACTIVE) | (1 << MD_DISK_SYNC),
1236 };
1237 int fd, mdfd, bfd, n, ret = CHILD_HOLDER;
1238 char dev[32], buf[4096];
1239 struct stat st;
1240
1241 fd = open(at("img/md.img"), O_RDWR | O_CREAT | O_EXCL, 0600);
1242 if (fd < 0 || ftruncate(fd, 8 * 1024 * 1024))
1243 return CHILD_HOLDER;
1244 close(fd);
1245 n = loop_attach(at("img/md.img"));
1246 if (n < 0)
1247 return CHILD_HOLDER;
1248 /* the minor is not the number of the device when loop has partitions */
1249 snprintf(dev, sizeof(dev), "/dev/loop%d", n);
1250 if (stat(dev, &st))
1251 return CHILD_HOLDER;
1252 disk.major = major(st.st_rdev);
1253 disk.minor = minor(st.st_rdev);
1254
1255 bfd = open(at("p/bitmap"), O_RDWR | O_CREAT | O_EXCL, 0600);
1256 if (bfd < 0 || write(bfd, &bsb, sizeof(bsb)) != sizeof(bsb) || ftruncate(bfd, 4096))
1257 return CHILD_HOLDER;
1258
1259 if (read_sysfs("/proc/mdstat", buf, sizeof(buf))) {
1260 fprintf(stderr, "md: no /proc/mdstat\n");
1261 return CHILD_SKIP;
1262 }
1263 if (!strstr(buf, "[raid1]")) {
1264 fprintf(stderr, "md: no raid1 personality: %s\n", buf);
1265 return CHILD_SKIP;
1266 }
1267 /* a node of our own: /dev may not have one and is not ours to change */
1268 if (mknod(at("img/md0"), S_IFBLK | 0600, makedev(MD_MAJOR, 0)))
1269 return CHILD_HOLDER;
1270 mdfd = open(at("img/md0"), O_RDWR);
1271 if (mdfd < 0)
1272 return CHILD_SKIP;
1273 /* somebody else's array: SET_ARRAY_INFO would say EINVAL, not EBUSY */
1274 if (!read_sysfs("/sys/block/md0/md/array_state", buf, sizeof(buf)) &&
1275 strncmp(buf, "clear", 5)) {
1276 fprintf(stderr, "md: md0 is in use: %s", buf);
1277 close(mdfd);
1278 return CHILD_SKIP;
1279 }
1280 /* the bitmap ops are only installed once a bitmap type is chosen */
1281 write_file("/sys/block/md0/md/bitmap_type", "bitmap");
1282 /* EBUSY: somebody else's array, leave it alone */
1283 if (ioctl(mdfd, SET_ARRAY_INFO, &info))
1284 return errno == EBUSY ? CHILD_SKIP : CHILD_HOLDER;
1285 /* the array is ours from here on and has to be stopped on every path */
1286 if (ioctl(mdfd, ADD_NEW_DISK, &disk))
1287 goto undo;
1288 /* attach the bitmap file before the array runs, the way mdadm does */
1289 if (ioctl(mdfd, SET_BITMAP_FILE, bfd)) {
1290 fprintf(stderr, "md: SET_BITMAP_FILE: %s\n", strerror(errno));
1291 if (errno == EINVAL)
1292 ret = CHILD_SKIP;
1293 goto undo;
1294 }
1295 close(bfd); /* the array keeps its own */
1296 if (ioctl(mdfd, RUN_ARRAY, NULL)) {
1297 fprintf(stderr, "md: RUN_ARRAY: %s\n", strerror(errno));
1298 goto undo;
1299 }
1300 if (write_fat12(mdfd))
1301 goto undo;
1302 close(mdfd);
1303 if (mount_fat(at("img/md0"), HOLDER_BELOW)) {
1304 ret = errno == ENODEV ? CHILD_NOFS : CHILD_HOLDER;
1305 mdfd = open(at("img/md0"), O_RDWR);
1306 goto undo;
1307 }
1308 return CHILD_OK;
1309 undo:
1310 if (mdfd >= 0) {
1311 ioctl(mdfd, STOP_ARRAY);
1312 close(mdfd);
1313 }
1314 return ret;
1315 }
1316
1317 /*
1318 * A device keeps its file for as long as it is configured, so once nothing
1319 * below the dead mount is left the device has to be told to let go. With
1320 * the cycle unbroken C's filesystem still holds the device and every one
1321 * of these refuses.
1322 */
holder_let_go_once(enum holder holder)1323 static int holder_let_go_once(enum holder holder)
1324 {
1325 int fd, ret;
1326
1327 switch (holder) {
1328 case HOLDER_ZRAM:
1329 return write_file("/sys/block/zram0/reset", "1");
1330 case HOLDER_ZLOOP:
1331 return write_file("/dev/zloop-control", "remove id=0");
1332 case HOLDER_GADGET:
1333 if (mount_configfs())
1334 return -1;
1335 /* a zero-length write is a no-op for configfs; a newline ejects */
1336 return write_file(gat("/functions/mass_storage.0/lun.0/file"), "\n");
1337 case HOLDER_MD:
1338 fd = open(at("img/md0"), O_RDONLY);
1339 if (fd < 0) {
1340 /* the child's node went with its tmpfs */
1341 mknod(at("md0"), S_IFBLK | 0600, makedev(MD_MAJOR, 0));
1342 fd = open(at("md0"), O_RDONLY);
1343 }
1344 if (fd < 0)
1345 return -1;
1346 ret = ioctl(fd, STOP_ARRAY);
1347 close(fd);
1348 return ret;
1349 default:
1350 return 0;
1351 }
1352 }
1353
zram_reset(void)1354 static void zram_reset(void)
1355 {
1356 holder_let_go_once(HOLDER_ZRAM);
1357 }
1358
1359 /*
1360 * In its own mount namespace the child puts the image on a tmpfs next to
1361 * P, mounts P from a loop device, and sets the holder up with its own
1362 * filesystem or device mounted at C below P.
1363 */
holder_child(int to_parent,int from_parent,enum holder holder)1364 static int holder_child(int to_parent, int from_parent, enum holder holder)
1365 {
1366 bool fifo = holder == HOLDER_AUTOFS || holder == HOLDER_ZRAM;
1367 /* room for a 4 MiB zone file or a floppy image on P */
1368 bool big = holder == HOLDER_ZLOOP || holder == HOLDER_GADGET;
1369 struct report r = { { -1, -1 } };
1370 char dev[32], c;
1371 int ifd, n, ret;
1372
1373 if (unshare(CLONE_NEWNS) || mount("", "/", NULL, MS_REC | MS_PRIVATE, NULL))
1374 return CHILD_NS;
1375 if (mkdir(at("img"), 0755) || mount("tmpfs", at("img"), "tmpfs", 0, NULL))
1376 return child_fails(CHILD_NS);
1377
1378 ifd = open(HOLDER_IMG, O_RDWR | O_CREAT | O_EXCL, 0600);
1379 if (ifd < 0 || (fifo ? write_minix(ifd) :
1380 big ? write_fat12_4k(ifd, 3072) : write_fat12(ifd)))
1381 return child_fails(CHILD_IMAGE);
1382 close(ifd);
1383 n = loop_attach(HOLDER_IMG);
1384 if (n < 0)
1385 return child_fails(CHILD_LOOP);
1386 snprintf(dev, sizeof(dev), "/dev/loop%d", n);
1387 if (mkdir(HOLDER_MNT, 0755))
1388 return child_fails(CHILD_MOUNT);
1389 if (fifo ? mount(dev, HOLDER_MNT, "minix", 0, NULL) : mount_fat(dev, HOLDER_MNT))
1390 return child_fails(errno == ENODEV ? CHILD_NOFS : CHILD_MOUNT);
1391 if (mkdir(HOLDER_BELOW, 0755))
1392 return child_fails(CHILD_MOUNT);
1393
1394 switch (holder) {
1395 case HOLDER_AUTOFS:
1396 ret = holder_autofs();
1397 break;
1398 case HOLDER_ZRAM:
1399 ret = holder_zram();
1400 break;
1401 case HOLDER_ECRYPTFS:
1402 ret = holder_ecryptfs();
1403 break;
1404 case HOLDER_BINFMT_MISC:
1405 ret = holder_binfmt_misc();
1406 break;
1407 case HOLDER_FUSE:
1408 ret = holder_fuse();
1409 break;
1410 case HOLDER_ZLOOP:
1411 ret = holder_zloop();
1412 break;
1413 case HOLDER_GADGET:
1414 ret = holder_gadget();
1415 break;
1416 case HOLDER_MD:
1417 ret = holder_md();
1418 break;
1419 default:
1420 ret = CHILD_HOLDER;
1421 }
1422 if (ret != CHILD_OK)
1423 return child_fails(ret);
1424
1425 /* P's device first, then the one the holder has bound for itself */
1426 r.n[0] = n;
1427 if (nr_bound > 1)
1428 r.n[1] = bound[1];
1429 if (write(to_parent, &r, sizeof(r)) != sizeof(r) ||
1430 read(from_parent, &c, 1) != 1) {
1431 /* the parent went away and will not tell the devices to let go */
1432 umount2(HOLDER_BELOW, MNT_DETACH);
1433 for (int i = 0; i < 50 && holder_let_go_once(holder); i++)
1434 usleep(100000);
1435 if (holder == HOLDER_GADGET)
1436 gadget_remove();
1437 return child_fails(CHILD_PIPE);
1438 }
1439 return CHILD_OK;
1440 }
1441
1442 /*
1443 * The release of C's filesystem may still be in flight when the child is
1444 * gone, and a device that is still held refuses to let go, so try for a
1445 * while. With the cycle unbroken it refuses for good.
1446 */
holder_let_go(enum holder holder)1447 static void holder_let_go(enum holder holder)
1448 {
1449 for (int i = 0; i < 50; i++) {
1450 if (!holder_let_go_once(holder))
1451 return;
1452 usleep(100000);
1453 }
1454 }
1455
1456 /*
1457 * rmdir of p from here, where it is a plain directory, detaches
1458 * P in the child's namespace with C connected below it. Once the child is
1459 * gone the holder's file on P is the only thing left that refers to P,
1460 * and it is dropped only when C's filesystem dies, which waits for P.
1461 * The loop device backing P tells whether that resolved.
1462 */
holder_cycle(struct __test_metadata * _metadata,FIXTURE_DATA (loop_cycle)* self,enum holder holder)1463 static void holder_cycle(struct __test_metadata *_metadata,
1464 FIXTURE_DATA(loop_cycle) *self, enum holder holder)
1465 {
1466 struct report r = { { -1, -1 } };
1467 int to_parent[2], from_parent[2];
1468 pid_t pid;
1469
1470 ASSERT_EQ(pipe(to_parent), 0);
1471 ASSERT_EQ(pipe(from_parent), 0);
1472 pid = fork();
1473 ASSERT_GE(pid, 0);
1474 if (pid == 0) {
1475 close(to_parent[0]);
1476 close(from_parent[1]);
1477 _exit(holder_child(to_parent[1], from_parent[0], holder));
1478 }
1479 close(to_parent[1]);
1480 close(from_parent[0]);
1481
1482 if (read(to_parent[0], &r, sizeof(r)) != sizeof(r))
1483 CHILD_GAVE_UP(pid);
1484 self->gadget = holder == HOLDER_GADGET;
1485 remember_loop(self, r.n[0]);
1486 remember_loop(self, r.n[1]);
1487 snprintf(self->dev, sizeof(self->dev), "/dev/loop%d", r.n[0]);
1488 snprintf(self->sysfs, sizeof(self->sysfs), "/sys/block/loop%d/loop/backing_file", r.n[0]);
1489
1490 ASSERT_EQ(rmdir(HOLDER_MNT), 0);
1491 ASSERT_EQ(write(from_parent[1], "x", 1), 1);
1492 CHILD_LEFT(pid);
1493 close(to_parent[0]);
1494 close(from_parent[1]);
1495
1496 holder_let_go(holder);
1497 assert_loop_released(_metadata, self);
1498 /* the teardown takes the gadget and the holder's own loop device away */
1499 }
1500
TEST_F(loop_cycle,autofs_pipe_on_dead_mount_released)1501 TEST_F(loop_cycle, autofs_pipe_on_dead_mount_released)
1502 {
1503 holder_cycle(_metadata, self, HOLDER_AUTOFS);
1504 }
1505
TEST_F(loop_cycle,zram_writeback_node_on_dead_mount_released)1506 TEST_F(loop_cycle, zram_writeback_node_on_dead_mount_released)
1507 {
1508 holder_cycle(_metadata, self, HOLDER_ZRAM);
1509 }
1510
TEST_F(loop_cycle,ecryptfs_lower_on_dead_mount_released)1511 TEST_F(loop_cycle, ecryptfs_lower_on_dead_mount_released)
1512 {
1513 holder_cycle(_metadata, self, HOLDER_ECRYPTFS);
1514 }
1515
TEST_F(loop_cycle,binfmt_misc_interpreter_on_dead_mount_released)1516 TEST_F(loop_cycle, binfmt_misc_interpreter_on_dead_mount_released)
1517 {
1518 holder_cycle(_metadata, self, HOLDER_BINFMT_MISC);
1519 }
1520
TEST_F(loop_cycle,fuse_backing_file_on_dead_mount_released)1521 TEST_F(loop_cycle, fuse_backing_file_on_dead_mount_released)
1522 {
1523 holder_cycle(_metadata, self, HOLDER_FUSE);
1524 }
1525
TEST_F(loop_cycle,zloop_zone_files_on_dead_mount_released)1526 TEST_F(loop_cycle, zloop_zone_files_on_dead_mount_released)
1527 {
1528 holder_cycle(_metadata, self, HOLDER_ZLOOP);
1529 }
1530
1531 /* up to 15 s for the disk to show up and 12 s for a device that is held */
1532 TEST_F_TIMEOUT(loop_cycle, mass_storage_lun_on_dead_mount_released, 120)
1533 {
1534 holder_cycle(_metadata, self, HOLDER_GADGET);
1535 }
1536
TEST_F(loop_cycle,md_bitmap_file_on_dead_mount_released)1537 TEST_F(loop_cycle, md_bitmap_file_on_dead_mount_released)
1538 {
1539 holder_cycle(_metadata, self, HOLDER_MD);
1540 }
1541
1542 TEST_HARNESS_MAIN
1543