summary refs log tree commit diff
path: root/src/nm-checkpoint.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2017-09-20 21:04:15 +0200
committerMichael Biebl <biebl@debian.org>2017-09-20 21:04:15 +0200
commitbdb6eeb0670658255c2a4c3c501c0a27fa8cfe55 (patch)
tree7f6a4560c8cd3e1730df2af4ed6c3e4c5c0265f6 /src/nm-checkpoint.c
parentb9f0451fa35393ceedf6d9d20b78c43578ebea5d (diff)
New upstream version 1.8.4 upstream/1.8.4
Diffstat (limited to 'src/nm-checkpoint.c')
-rw-r--r--src/nm-checkpoint.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/nm-checkpoint.c b/src/nm-checkpoint.c
index d59bc574..04f00e89 100644
--- a/src/nm-checkpoint.c
+++ b/src/nm-checkpoint.c
@@ -46,7 +46,7 @@ typedef struct {
 	guint64 ac_version_id;
 	NMDeviceState state;
 	bool realized:1;
-	bool unmanaged_explicit:1;
+	NMUnmanFlagOp unmanaged_explicit;
 } DeviceCheckpoint;
 
 NM_GOBJECT_PROPERTIES_DEFINE_BASE (
@@ -224,9 +224,19 @@ nm_checkpoint_rollback (NMCheckpoint *self)
 		}
 
 activate:
+		/* Manage the device again if needed */
+		if (   nm_device_get_unmanaged_flags (device, NM_UNMANAGED_USER_EXPLICIT)
+		    && dev_checkpoint->unmanaged_explicit != NM_UNMAN_FLAG_OP_SET_UNMANAGED) {
+			_LOGD ("rollback: restore unmanaged user-explicit");
+			nm_device_set_unmanaged_by_flags_queue (device,
+			                                        NM_UNMANAGED_USER_EXPLICIT,
+			                                        dev_checkpoint->unmanaged_explicit,
+			                                        NM_DEVICE_STATE_REASON_NOW_MANAGED);
+		}
+
 		if (dev_checkpoint->state == NM_DEVICE_STATE_UNMANAGED) {
 			if (   nm_device_get_state (device) != NM_DEVICE_STATE_UNMANAGED
-			    || dev_checkpoint->unmanaged_explicit) {
+			    || dev_checkpoint->unmanaged_explicit == NM_UNMAN_FLAG_OP_SET_UNMANAGED) {
 				_LOGD ("rollback: explicitly unmanage device");
 				nm_device_set_unmanaged_by_flags_queue (device,
 				                                        NM_UNMANAGED_USER_EXPLICIT,
@@ -370,19 +380,21 @@ device_checkpoint_create (NMDevice *device,
 	NMConnection *applied_connection;
 	NMSettingsConnection *settings_connection;
 	const char *path;
-	gboolean unmanaged_explicit;
 	NMActRequest *act_request;
 
 	path = nm_exported_object_get_path (NM_EXPORTED_OBJECT (device));
-	unmanaged_explicit = !!nm_device_get_unmanaged_flags (device,
-	                                                      NM_UNMANAGED_USER_EXPLICIT);
 
 	dev_checkpoint = g_slice_new0 (DeviceCheckpoint);
 	dev_checkpoint->device = g_object_ref (device);
 	dev_checkpoint->original_dev_path = g_strdup (path);
 	dev_checkpoint->state = nm_device_get_state (device);
 	dev_checkpoint->realized = nm_device_is_real (device);
-	dev_checkpoint->unmanaged_explicit = unmanaged_explicit;
+
+	if (nm_device_get_unmanaged_mask (device, NM_UNMANAGED_USER_EXPLICIT)) {
+		dev_checkpoint->unmanaged_explicit =
+			!!nm_device_get_unmanaged_flags (device, NM_UNMANAGED_USER_EXPLICIT);
+	} else
+		dev_checkpoint->unmanaged_explicit = NM_UNMAN_FLAG_OP_FORGET;
 
 	applied_connection = nm_device_get_applied_connection (device);
 	if (applied_connection) {