diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2017-07-05 13:47:32 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2017-08-28 10:33:04 +0200 |
commit | fb5834c3c1e4bcdf9003b50382f920959a8447b4 (patch) | |
tree | dba6dc020dc849f0b825f66595e5ffae26d79e12 | |
parent | f43222d4118fa4c58235f60de0d532531ba1bd8a (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.c | 24 |
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) { |