]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
homework: make sync of identies when resizing homes optional
authorLennart Poettering <lennart@poettering.net>
Wed, 13 Oct 2021 15:43:11 +0000 (17:43 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 16 Nov 2021 16:18:07 +0000 (17:18 +0100)
This is preparation for resizing automatically at login and logout.

src/home/homework-luks.c
src/home/homework.h

index 8ad6499d8f3a7fb02875d646a03acf8106af7344..4cc9e32f8fbfabacf4127712ab4f32b95f9c3756 100644 (file)
@@ -2802,9 +2802,11 @@ int home_resize_luks(
         if (r < 0)
                 return r;
 
-        r = home_load_embedded_identity(h, setup->root_fd, header_home, USER_RECONCILE_REQUIRE_NEWER_OR_EQUAL, cache, &embedded_home, &new_home);
-        if (r < 0)
-                return r;
+        if (!FLAGS_SET(flags, HOME_SETUP_RESIZE_DONT_SYNC_IDENTITIES)) {
+                r = home_load_embedded_identity(h, setup->root_fd, header_home, USER_RECONCILE_REQUIRE_NEWER_OR_EQUAL, cache, &embedded_home, &new_home);
+                if (r < 0)
+                        return r;
+        }
 
         log_info("offset = %" PRIu64 ", size = %" PRIu64 ", image = %" PRIu64, setup->partition_offset, setup->partition_size, old_image_size);
 
@@ -2910,9 +2912,11 @@ int home_resize_luks(
 
                 log_info("LUKS device growing completed.");
         } else {
-                r = home_store_embedded_identity(new_home, setup->root_fd, h->uid, embedded_home);
-                if (r < 0)
-                        return r;
+                if (!FLAGS_SET(flags, HOME_SETUP_RESIZE_DONT_SYNC_IDENTITIES)) {
+                        r = home_store_embedded_identity(new_home, setup->root_fd, h->uid, embedded_home);
+                        if (r < 0)
+                                return r;
+                }
 
                 if (S_ISREG(st.st_mode)) {
                         if (user_record_luks_discard(h))
@@ -2979,19 +2983,21 @@ int home_resize_luks(
 
                 if (S_ISBLK(st.st_mode) && ioctl(image_fd, BLKRRPART, 0) < 0)
                         log_debug_errno(errno, "BLKRRPART failed on block device, ignoring: %m");
-        } else {
+        } else if (!FLAGS_SET(flags, HOME_SETUP_RESIZE_DONT_SYNC_IDENTITIES)) {
                 r = home_store_embedded_identity(new_home, setup->root_fd, h->uid, embedded_home);
                 if (r < 0)
                         return r;
         }
 
-        r = home_store_header_identity_luks(new_home, setup, header_home);
-        if (r < 0)
-                return r;
+        if (!FLAGS_SET(flags, HOME_SETUP_RESIZE_DONT_SYNC_IDENTITIES)) {
+                r = home_store_header_identity_luks(new_home, setup, header_home);
+                if (r < 0)
+                        return r;
 
-        r = home_extend_embedded_identity(new_home, h, setup);
-        if (r < 0)
-                return r;
+                r = home_extend_embedded_identity(new_home, h, setup);
+                if (r < 0)
+                        return r;
+        }
 
         if (user_record_luks_discard(h))
                 (void) run_fitrim(setup->root_fd);
index 551f0d0153d9015752a8fc4aa4ba65c5ab8932fa..b22b7cb2e0e57ce040074561478977b4d28e62c4 100644 (file)
@@ -53,10 +53,13 @@ typedef struct HomeSetup {
 
 /* Various flags for the operation of setting up a home directory */
 typedef enum HomeSetupFlags {
-        HOME_SETUP_ALREADY_ACTIVATED = 1 << 0, /* Open an already activated home, rather than activate it afresh */
+        HOME_SETUP_ALREADY_ACTIVATED           = 1 << 0, /* Open an already activated home, rather than activate it afresh */
 
         /* CIFS backend: */
-        HOME_SETUP_CIFS_MKDIR        = 1 << 1, /* Create CIFS subdir when missing */
+        HOME_SETUP_CIFS_MKDIR                  = 1 << 1, /* Create CIFS subdir when missing */
+
+        /* Applies only for resize operations */
+        HOME_SETUP_RESIZE_DONT_SYNC_IDENTITIES = 1 << 2, /* Don't sync identity records into home and LUKS header */
 } HomeSetupFlags;
 
 int home_setup_done(HomeSetup *setup);