platform: let platform operations only consider kernel response

Also downgrade <error> logging messages to <warn>. An external
condition should never be able to trigger an <error>, and clearly
there is always a external race that can cause a netlink command
to fail.
This commit is contained in:
Thomas Haller
2017-08-21 16:11:31 +02:00
parent 774c8a811e
commit 5a69b27a64

View File

@@ -4183,26 +4183,13 @@ do_add_link_with_lookup (NMPlatform *platform,
event_handler_read_netlink (platform, FALSE); event_handler_read_netlink (platform, FALSE);
if (nmp_cache_lookup_link_full (cache, 0, name, FALSE, NM_LINK_TYPE_NONE, NULL, NULL)) {
/* hm, a link with such a name already exists. Try reloading first. */
do_request_link (platform, 0, name);
obj = nmp_cache_lookup_link_full (cache, 0, name, FALSE, NM_LINK_TYPE_NONE, NULL, NULL);
if (obj) {
_LOGE ("do-add-link[%s/%s]: link already exists: %s",
name,
nm_link_type_to_string (link_type),
nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_ID, NULL, 0));
return FALSE;
}
}
nle = _nl_send_nlmsg (platform, nlmsg, &seq_result, DELAYED_ACTION_RESPONSE_TYPE_VOID, NULL); nle = _nl_send_nlmsg (platform, nlmsg, &seq_result, DELAYED_ACTION_RESPONSE_TYPE_VOID, NULL);
if (nle < 0) { if (nle < 0) {
_LOGE ("do-add-link[%s/%s]: failed sending netlink request \"%s\" (%d)", _LOGE ("do-add-link[%s/%s]: failed sending netlink request \"%s\" (%d)",
name, name,
nm_link_type_to_string (link_type), nm_link_type_to_string (link_type),
nl_geterror (nle), -nle); nl_geterror (nle), -nle);
NM_SET_OUT (out_link, NULL);
return FALSE; return FALSE;
} }
@@ -4212,25 +4199,18 @@ do_add_link_with_lookup (NMPlatform *platform,
_NMLOG (seq_result == WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_OK _NMLOG (seq_result == WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_OK
? LOGL_DEBUG ? LOGL_DEBUG
: LOGL_ERR, : LOGL_WARN,
"do-add-link[%s/%s]: %s", "do-add-link[%s/%s]: %s",
name, name,
nm_link_type_to_string (link_type), nm_link_type_to_string (link_type),
wait_for_nl_response_to_string (seq_result, s_buf, sizeof (s_buf))); wait_for_nl_response_to_string (seq_result, s_buf, sizeof (s_buf)));
if (seq_result == WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_OK) if (out_link) {
obj = nmp_cache_lookup_link_full (cache, 0, name, FALSE, link_type, NULL, NULL);
if (!obj) {
/* either kernel signaled failure, or it signaled success and the link object
* is not (yet) in the cache. Try to reload it... */
do_request_link (platform, 0, name);
obj = nmp_cache_lookup_link_full (cache, 0, name, FALSE, link_type, NULL, NULL); obj = nmp_cache_lookup_link_full (cache, 0, name, FALSE, link_type, NULL, NULL);
*out_link = NMP_OBJECT_CAST_LINK (obj);
} }
if (out_link) return seq_result == WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_OK;
*out_link = obj ? &obj->link : NULL;
return !!obj;
} }
static NMPlatformError static NMPlatformError
@@ -4289,9 +4269,8 @@ do_delete_object (NMPlatform *platform, const NMPObject *obj_id, struct nl_msg *
WaitForNlResponseResult seq_result = WAIT_FOR_NL_RESPONSE_RESULT_UNKNOWN; WaitForNlResponseResult seq_result = WAIT_FOR_NL_RESPONSE_RESULT_UNKNOWN;
int nle; int nle;
char s_buf[256]; char s_buf[256];
gboolean success = TRUE; gboolean success;
const char *log_detail = ""; const char *log_detail = "";
NMPCache *cache = nm_platform_get_cache (platform);
event_handler_read_netlink (platform, FALSE); event_handler_read_netlink (platform, FALSE);
@@ -4301,13 +4280,14 @@ do_delete_object (NMPlatform *platform, const NMPObject *obj_id, struct nl_msg *
NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name, NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name,
nmp_object_to_string (obj_id, NMP_OBJECT_TO_STRING_ID, NULL, 0), nmp_object_to_string (obj_id, NMP_OBJECT_TO_STRING_ID, NULL, 0),
nl_geterror (nle), -nle); nl_geterror (nle), -nle);
goto out; return FALSE;
} }
delayed_action_handle_all (platform, FALSE); delayed_action_handle_all (platform, FALSE);
nm_assert (seq_result); nm_assert (seq_result);
success = TRUE;
if (seq_result == WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_OK) { if (seq_result == WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_OK) {
/* ok */ /* ok */
} else if (NM_IN_SET (-((int) seq_result), ESRCH, ENOENT)) } else if (NM_IN_SET (-((int) seq_result), ESRCH, ENOENT))
@@ -4322,21 +4302,14 @@ do_delete_object (NMPlatform *platform, const NMPObject *obj_id, struct nl_msg *
else else
success = FALSE; success = FALSE;
_NMLOG (success ? LOGL_DEBUG : LOGL_ERR, _NMLOG (success ? LOGL_DEBUG : LOGL_WARN,
"do-delete-%s[%s]: %s%s", "do-delete-%s[%s]: %s%s",
NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name, NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name,
nmp_object_to_string (obj_id, NMP_OBJECT_TO_STRING_ID, NULL, 0), nmp_object_to_string (obj_id, NMP_OBJECT_TO_STRING_ID, NULL, 0),
wait_for_nl_response_to_string (seq_result, s_buf, sizeof (s_buf)), wait_for_nl_response_to_string (seq_result, s_buf, sizeof (s_buf)),
log_detail); log_detail);
out: return success;
if (!nmp_cache_lookup_obj (cache, obj_id))
return TRUE;
/* such an object still exists in the cache. To be sure, refetch it (and
* hope it's gone) */
do_request_one_type (platform, NMP_OBJECT_GET_TYPE (obj_id));
return !nmp_cache_lookup_obj (cache, obj_id);
} }
static WaitForNlResponseResult static WaitForNlResponseResult
@@ -4397,7 +4370,7 @@ do_change_link_result (NMPlatform *platform,
log_level = LOGL_DEBUG; log_level = LOGL_DEBUG;
result = NM_PLATFORM_ERROR_NOT_FOUND; result = NM_PLATFORM_ERROR_NOT_FOUND;
} else { } else {
log_level = LOGL_ERR; log_level = LOGL_WARN;
result = NM_PLATFORM_ERROR_UNSPECIFIED; result = NM_PLATFORM_ERROR_UNSPECIFIED;
} }
_NMLOG (log_level, _NMLOG (log_level,