summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2017-07-05 13:47:32 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2017-08-28 10:33:04 +0200
commitfb5834c3c1e4bcdf9003b50382f920959a8447b4 (patch)
treedba6dc020dc849f0b825f66595e5ffae26d79e12
parentf43222d4118fa4c58235f60de0d532531ba1bd8a (diff)
checkpoint: better restore device managed state on rollback
Manage a device again if it was managed before the checkpoint. https://bugzilla.redhat.com/show_bug.cgi?id=1464904 (cherry picked from commit 67bfdbfc9189856dd7428d27f7d8fbe9c2ee7446)
-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 d59bc5743e..04f00e899b 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) {