]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
homework: get rid of manual error path in home_create_luks()
authorLennart Poettering <lennart@poettering.net>
Tue, 26 Oct 2021 15:40:21 +0000 (17:40 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 28 Oct 2021 06:17:46 +0000 (08:17 +0200)
Now that all objects we need to destroy are managed by the HomeSetup
object we can drop our manual destruction path and just use the normal
clean-up logic implemented for HomeSetup anyway. More unification, yay!

src/home/homework-luks.c

index 8333f896b170ccb46974e39d790608be9b91b297..e4047a092bc0c83d7a93b00e4e7a1544e48884b5 100644 (file)
@@ -2157,7 +2157,7 @@ int home_create_luks(
 
                 r = home_truncate(h, image_fd, setup->temporary_image_path, host_size);
                 if (r < 0)
-                        goto fail;
+                        return r;
 
                 log_info("Allocating image file completed.");
         }
@@ -2170,7 +2170,7 @@ int home_create_luks(
                         &partition_size,
                         &disk_uuid);
         if (r < 0)
-                goto fail;
+                return r;
 
         log_info("Writing of partition table completed.");
 
@@ -2180,19 +2180,15 @@ int home_create_luks(
                                      * or similar and loopback bock devices are not available, return a
                                      * recognizable error in this case. */
                         log_error_errno(r, "Loopback block device support is not available on this system.");
-                        r = -ENOLINK;
-                        goto fail;
+                        return -ENOLINK; /* Make recognizable */
                 }
 
-                log_error_errno(r, "Failed to set up loopback device for %s: %m", setup->temporary_image_path);
-                goto fail;
+                return log_error_errno(r, "Failed to set up loopback device for %s: %m", setup->temporary_image_path);
         }
 
         r = loop_device_flock(setup->loop, LOCK_EX); /* make sure udev won't read before we are done */
-        if (r < 0) {
-                log_error_errno(r, "Failed to take lock on loop device: %m");
-                goto fail;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Failed to take lock on loop device: %m");
 
         log_info("Setting up loopback device %s completed.", setup->loop->node ?: ip);
 
@@ -2206,62 +2202,52 @@ int home_create_luks(
                         h,
                         &setup->crypt_device);
         if (r < 0)
-                goto fail;
+                return r;
 
         setup->undo_dm = true;
 
         r = block_get_size_by_path(setup->dm_node, &encrypted_size);
-        if (r < 0) {
-                log_error_errno(r, "Failed to get encrypted block device size: %m");
-                goto fail;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Failed to get encrypted block device size: %m");
 
         log_info("Setting up LUKS device %s completed.", setup->dm_node);
 
         r = make_filesystem(setup->dm_node, fstype, user_record_user_name_and_realm(h), fs_uuid, user_record_luks_discard(h));
         if (r < 0)
-                goto fail;
+                return r;
 
         log_info("Formatting file system completed.");
 
         r = home_unshare_and_mount(setup->dm_node, fstype, user_record_luks_discard(h), user_record_mount_flags(h));
         if (r < 0)
-                goto fail;
+                return r;
 
         setup->undo_mount = true;
 
         subdir = path_join(HOME_RUNTIME_WORK_DIR, user_record_user_name_and_realm(h));
-        if (!subdir) {
-                r = log_oom();
-                goto fail;
-        }
+        if (!subdir)
+                return log_oom();
 
         /* Prefer using a btrfs subvolume if we can, fall back to directory otherwise */
         r = btrfs_subvol_make_fallback(subdir, 0700);
-        if (r < 0) {
-                log_error_errno(r, "Failed to create user directory in mounted image file: %m");
-                goto fail;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Failed to create user directory in mounted image file: %m");
 
         setup->root_fd = open(subdir, O_RDONLY|O_CLOEXEC|O_DIRECTORY|O_NOFOLLOW);
-        if (setup->root_fd < 0) {
-                r = log_error_errno(errno, "Failed to open user directory in mounted image file: %m");
-                goto fail;
-        }
+        if (setup->root_fd < 0)
+                return log_error_errno(errno, "Failed to open user directory in mounted image file: %m");
 
         r = home_populate(h, setup->root_fd);
         if (r < 0)
-                goto fail;
+                return r;
 
         r = home_sync_and_statfs(setup->root_fd, &sfs);
         if (r < 0)
-                goto fail;
+                return r;
 
         r = user_record_clone(h, USER_RECORD_LOAD_MASK_SECRET|USER_RECORD_LOG|USER_RECORD_PERMISSIVE, &new_home);
-        if (r < 0) {
-                log_error_errno(r, "Failed to clone record: %m");
-                goto fail;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Failed to clone record: %m");
 
         r = user_record_add_binding(
                         new_home,
@@ -2277,50 +2263,44 @@ int home_create_luks(
                         NULL,
                         h->uid,
                         (gid_t) h->uid);
-        if (r < 0) {
-                log_error_errno(r, "Failed to add binding to record: %m");
-                goto fail;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Failed to add binding to record: %m");
 
         if (user_record_luks_offline_discard(h)) {
                 r = run_fitrim(setup->root_fd);
                 if (r < 0)
-                        goto fail;
+                        return r;
         }
 
         setup->root_fd = safe_close(setup->root_fd);
 
         r = home_setup_undo_mount(setup, LOG_ERR);
         if (r < 0)
-                goto fail;
+                return r;
 
         r = home_setup_undo_dm(setup, LOG_ERR);
         if (r < 0)
-                goto fail;
+                return r;
 
         setup->loop = loop_device_unref(setup->loop);
 
         if (!user_record_luks_offline_discard(h)) {
-                r = run_fallocate(image_fd, NULL /* refresh stat() data */);
+                r= run_fallocate(image_fd, NULL /* refresh stat() data */);
                 if (r < 0)
-                        goto fail;
+                        return r;
         }
 
         /* Sync everything to disk before we move things into place under the final name. */
-        if (fsync(image_fd) < 0) {
-                r = log_error_errno(r, "Failed to synchronize image to disk: %m");
-                goto fail;
-        }
+        if (fsync(image_fd) < 0)
+                return log_error_errno(r, "Failed to synchronize image to disk: %m");
 
         if (disk_uuid_path)
                 (void) ioctl(image_fd, BLKRRPART, 0);
         else {
                 /* If we operate on a file, sync the containing directory too. */
                 r = fsync_directory_of_file(image_fd);
-                if (r < 0) {
-                        log_error_errno(r, "Failed to synchronize directory of image file to disk: %m");
-                        goto fail;
-                }
+                if (r < 0)
+                        return log_error_errno(r, "Failed to synchronize directory of image file to disk: %m");
         }
 
         /* Let's close the image fd now. If we are operating on a real block device this will release the BSD
@@ -2328,10 +2308,8 @@ int home_create_luks(
         image_fd = safe_close(image_fd);
 
         if (setup->temporary_image_path) {
-                if (rename(setup->temporary_image_path, ip) < 0) {
-                        log_error_errno(errno, "Failed to rename image file: %m");
-                        goto fail;
-                }
+                if (rename(setup->temporary_image_path, ip) < 0)
+                        return log_error_errno(errno, "Failed to rename image file: %m");
 
                 setup->temporary_image_path = mfree(setup->temporary_image_path);
                 log_info("Moved image file into place.");
@@ -2346,19 +2324,6 @@ int home_create_luks(
 
         *ret_home = TAKE_PTR(new_home);
         return 0;
-
-fail:
-        /* Let's close all files before we unmount the file system, to avoid EBUSY */
-        setup->root_fd = safe_close(setup->root_fd);
-        (void) home_setup_undo_mount(setup, LOG_WARNING);
-        (void) home_setup_undo_dm(setup, LOG_WARNING);
-
-        setup->loop = loop_device_unref(setup->loop);
-
-        if (setup->temporary_image_path)
-                (void) unlink(setup->temporary_image_path);
-
-        return r;
 }
 
 int home_get_state_luks(UserRecord *h, HomeSetup *setup) {