]> git.ipfire.org Git - people/stevee/ipfire-2.x.git/commitdiff
installer: Mount BTRFS layout before installing the system
authorStefan Schantl <stefan.schantl@ipfire.org>
Mon, 26 Feb 2024 05:38:15 +0000 (06:38 +0100)
committerStefan Schantl <stefan.schantl@ipfire.org>
Mon, 26 Feb 2024 05:38:15 +0000 (06:38 +0100)
Signed-off-by: Stefan Schantl <stefan.schantl@ipfire.org>
src/installer/hw.c

index cb6a8ab8191251d6f4250e52b77bc1d35789ffae..e520fb6871abd2d4f55191a2ec6be8bb720f159f 100644 (file)
@@ -926,6 +926,7 @@ int hw_create_btrfs_layout(const char* path, const char* output) {
 
 int hw_mount_filesystems(struct hw_destination* dest, const char* prefix) {
        char target[STRING_SIZE];
+       int r;
 
        assert(*prefix == '/');
 
@@ -953,9 +954,17 @@ int hw_mount_filesystems(struct hw_destination* dest, const char* prefix) {
        }
 
        // root
-       int r = hw_mount(dest->part_root, prefix, filesystem, 0);
-       if (r)
-               return r;
+       if (dest->filesystem == HW_FS_BTRFS) {
+               r = hw_mount_btrfs_subvolumes(dest->part_root);
+
+               if (r)
+                       return r;
+       } else {
+               r = hw_mount(dest->part_root, prefix, filesystem, 0);
+
+               if (r)
+                       return r;
+       }
 
        // boot
        snprintf(target, sizeof(target), "%s%s", prefix, HW_PATH_BOOT);
@@ -1019,6 +1028,39 @@ int hw_mount_filesystems(struct hw_destination* dest, const char* prefix) {
        return 0;
 }
 
+int hw_mount_btrfs_subvolumes(const char* source) {
+       int r;
+       char path[STRING_SIZE];
+       char options[STRING_SIZE];
+
+       // Mount the root subvolume
+       snprintf(options, sizeof(options), "subvol=%s,%s", btrfs_subvolumes[0][0], BTRFS_MOUNT_OPTIONS);
+       r = mount(source, DESTINATION_MOUNT_PATH, "btrfs", NULL, options);
+
+       if (r)
+               return r;
+
+       // Loop through the remain array of known subvolumes.
+       for ( int i = 1; i < LEN(btrfs_subvolumes); i++ ) {
+               snprintf(path, sizeof(path), "%s%s", DESTINATION_MOUNT_PATH, btrfs_subvolumes[i][1]);
+               snprintf(options, sizeof(options), "subvol=%s,", btrfs_subvolumes[i][0], BTRFS_MOUNT_OPTIONS);
+
+               // Create the directory.
+               r = hw_mkdir(path, S_IRWXU|S_IRWXG|S_IRWXO);
+
+               if(r != 0 && errno != EEXIST)
+                       return r;
+
+               // Try to mount the subvolume.
+               r = mount(source, path, "btrfs", NULL, options);
+
+               if (r)
+                       return r;
+       }
+       
+       return 0;
+}
+
 int hw_umount_filesystems(struct hw_destination* dest, const char* prefix) {
        int r;
        char target[STRING_SIZE];