summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess2017-12-20 18:16:14 -0400
committerJoey Hess2017-12-20 18:17:42 -0400
commit9d4655cf55ec0ab2d95b707e6b5ff009f0515bcd (patch)
treed5e7a40f24425a24a5a56f57ba3938651d567eee
parent704259a2b4d11443c74e1dd4dd2ef1ba8d36ffd0 (diff)
two diskimage edge case fixes
* DiskImage: Fix rsync crash when a mount point does not exist in the chroot. * Fix bug in unmountBelow that caused unmounting of nested mounts to fail. This commit was sponsored by Jack Hill on Patreon.
-rw-r--r--debian/changelog4
-rw-r--r--doc/forum/imageBuiltFor_mount_points_not_automatically_created/comment_2_f90109eb016065586225fc59674c431c._comment20
-rw-r--r--src/Propellor/Property/DiskImage.hs19
-rw-r--r--src/Propellor/Property/Mount.hs4
4 files changed, 39 insertions, 8 deletions
diff --git a/debian/changelog b/debian/changelog
index bfb884ce..3da0622f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -9,6 +9,10 @@ propellor (5.2.0) UNRELEASED; urgency=medium
* DiskImage: Use safeAlignment. It didn't seem worth making the
alignment configurable here.
* Fixed rounding bug in Parted.calcPartTable.
+ * DiskImage: Fix rsync crash when a mount point does not exist in the
+ chroot.
+ * Fix bug in unmountBelow that caused unmounting of nested mounts to
+ fail.
-- Joey Hess <id@joeyh.name> Wed, 29 Nov 2017 11:45:08 -0400
diff --git a/doc/forum/imageBuiltFor_mount_points_not_automatically_created/comment_2_f90109eb016065586225fc59674c431c._comment b/doc/forum/imageBuiltFor_mount_points_not_automatically_created/comment_2_f90109eb016065586225fc59674c431c._comment
new file mode 100644
index 00000000..d8655a59
--- /dev/null
+++ b/doc/forum/imageBuiltFor_mount_points_not_automatically_created/comment_2_f90109eb016065586225fc59674c431c._comment
@@ -0,0 +1,20 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2017-12-20T21:36:36Z"
+ content="""
+AFAICS, DiskImage.imageFinalized creates any mount points that were not
+rsynced over from the chroot. But, I guess that partitionsPopulated is
+expecting the mount point to exist in order to rsync its content over,
+and if nothing created /boot/efi that would explain the rsync error.
+I've added a check to prevent that problem.
+
+As for the unmount problem, it's a problem with the order
+it traverses the mount points for unmounting. That is using
+"unmountBelow" with the directory where the disk image partitions
+are loop mounted. If that unmounts `boot` first, it will implicitly
+unmount `boot/efi` (due to --lazy) and then will fail when it
+tries to explicitly unmount it. Added sorting that should fix that.
+
+Let me know how that goes, I've not tested it with your config.
+"""]]
diff --git a/src/Propellor/Property/DiskImage.hs b/src/Propellor/Property/DiskImage.hs
index 79865db4..c9998d3c 100644
--- a/src/Propellor/Property/DiskImage.hs
+++ b/src/Propellor/Property/DiskImage.hs
@@ -274,13 +274,18 @@ partitionsPopulated chrootdir mnts mntopts devs = property' desc $ \w ->
desc = "partitions populated from " ++ chrootdir
go _ Nothing _ _ = noChange
- go w (Just mnt) mntopt loopdev = withTmpDir "mnt" $ \tmpdir -> bracket
- (liftIO $ mount "auto" (partitionLoopDev loopdev) tmpdir mntopt)
- (const $ liftIO $ umountLazy tmpdir)
- $ \ismounted -> if ismounted
- then ensureProperty w $
- syncDirFiltered (filtersfor mnt) (chrootdir ++ mnt) tmpdir
- else return FailedChange
+ go w (Just mnt) mntopt loopdev = ifM (liftIO $ doesDirectoryExist srcdir) $
+ ( withTmpDir "mnt" $ \tmpdir -> bracket
+ (liftIO $ mount "auto" (partitionLoopDev loopdev) tmpdir mntopt)
+ (const $ liftIO $ umountLazy tmpdir)
+ $ \ismounted -> if ismounted
+ then ensureProperty w $
+ syncDirFiltered (filtersfor mnt) srcdir tmpdir
+ else return FailedChange
+ , return NoChange
+ )
+ where
+ srcdir = chrootdir ++ mnt
filtersfor mnt =
let childmnts = map (drop (length (dropTrailingPathSeparator mnt))) $
diff --git a/src/Propellor/Property/Mount.hs b/src/Propellor/Property/Mount.hs
index c047161d..e8f3f092 100644
--- a/src/Propellor/Property/Mount.hs
+++ b/src/Propellor/Property/Mount.hs
@@ -149,4 +149,6 @@ umountLazy mnt =
unmountBelow :: FilePath -> IO ()
unmountBelow d = do
submnts <- mountPointsBelow d
- forM_ submnts umountLazy
+ -- sort so sub-mounts are unmounted before the mount point
+ -- containing them
+ forM_ (sort submnts) umountLazy