char upperdir[PATH_MAX];
char workdir[PATH_MAX];
+
+ // State
+ enum pakfire_snapshot_state {
+ PAKFIRE_SNAPSHOT_INIT = 0,
+ PAKFIRE_SNAPSHOT_MOUNTED,
+ PAKFIRE_SNAPSHOT_UMOUNTED,
+ } state;
};
static void pakfire_snapshot_free(struct pakfire_snapshot* snapshot) {
+ // Ensure this is umounted
pakfire_snapshot_umount(snapshot);
if (snapshot->overlayfs.fd >= 0)
if (r < 0)
goto ERROR;
+ // Mark as mounted
+ snapshot->state = PAKFIRE_SNAPSHOT_MOUNTED;
+
ERROR:
if (mountfd >= 0)
close(mountfd);
int pakfire_snapshot_umount(struct pakfire_snapshot* snapshot) {
int r;
- // Umount the overlayfs
- if (*snapshot->overlayfs.path) {
- r = umount(snapshot->overlayfs.path);
- if (r < 0)
- return r;
- }
-
- // Umount the tmpfs
- if (*snapshot->tmpfs.path) {
- r = umount(snapshot->tmpfs.path);
- if (r < 0)
- return r;
-
- r = pakfire_rmtree(snapshot->tmpfs.path, 0);
- if (r < 0)
- return r;
+ switch (snapshot->state) {
+ case PAKFIRE_SNAPSHOT_MOUNTED:
+ // Umount the overlayfs
+ if (*snapshot->overlayfs.path) {
+ r = umount(snapshot->overlayfs.path);
+ if (r < 0)
+ return r;
+ }
+
+ // Umount the tmpfs
+ if (*snapshot->tmpfs.path) {
+ r = umount(snapshot->tmpfs.path);
+ if (r < 0)
+ return r;
+
+ r = pakfire_rmtree(snapshot->tmpfs.path, 0);
+ if (r < 0)
+ return r;
+ }
+
+ // We are now umounted
+ snapshot->state = PAKFIRE_SNAPSHOT_UMOUNTED;
+ break;
+
+ default:
+ break;
}
return 0;