summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Propellor/Property/DiskImage.hs19
-rw-r--r--src/Propellor/Property/Mount.hs4
2 files changed, 15 insertions, 8 deletions
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