diff options
Diffstat (limited to 'src/Propellor/Property')
| -rw-r--r-- | src/Propellor/Property/DiskImage.hs | 19 | ||||
| -rw-r--r-- | src/Propellor/Property/Mount.hs | 4 |
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 |
