From patchwork Thu Nov 28 12:36:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cornelia Huck X-Patchwork-Id: 11265913 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D385E109A for ; Thu, 28 Nov 2019 12:43:07 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5FF572084D for ; Thu, 28 Nov 2019 12:43:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="O26DWBBK" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5FF572084D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:48608 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iaJ8U-0005Pw-3g for patchwork-qemu-devel@patchwork.kernel.org; Thu, 28 Nov 2019 07:43:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:44901) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iaJ2t-0002a1-P6 for qemu-devel@nongnu.org; Thu, 28 Nov 2019 07:37:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iaJ2j-0003k5-Ju for qemu-devel@nongnu.org; Thu, 28 Nov 2019 07:37:10 -0500 Received: from us-smtp-2.mimecast.com ([205.139.110.61]:35229 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iaJ2j-0003Yv-4f for qemu-devel@nongnu.org; Thu, 28 Nov 2019 07:37:09 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1574944626; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=25id685A4PXBUQO11zS19p8OOo+nuDKZeBi9NPkYXmw=; b=O26DWBBKbL4O586YZa8aZEDF08Z3yRT4/gaYM7DeL7VKwEDovl+7HkZ5DE9iJnVnOiDnAt w73pzIR6axkG03EHl4dUgH6X85zUIJ4pLqJuq2IxwIMDlr8nSK3tTxiOS6GNxh3H6ug+qJ 7V53eimOsne70RmXmDPVHVaktA6r8F0= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-136-hgj0fQIpNJG0Sfa0FDKlZg-1; Thu, 28 Nov 2019 07:37:03 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 92BE7800D4C; Thu, 28 Nov 2019 12:37:02 +0000 (UTC) Received: from localhost (ovpn-116-200.ams2.redhat.com [10.36.116.200]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 33571100E805; Thu, 28 Nov 2019 12:37:02 +0000 (UTC) From: Cornelia Huck To: Michael Roth Subject: [PATCH RFC] qga: fence guest-set-time if hwclock not available Date: Thu, 28 Nov 2019 13:36:58 +0100 Message-Id: <20191128123658.28351-1-cohuck@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-MC-Unique: hgj0fQIpNJG0Sfa0FDKlZg-1 X-Mimecast-Spam-Score: 0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 205.139.110.61 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Cornelia Huck , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" The Posix implementation of guest-set-time invokes hwclock to set/retrieve the time to/from the hardware clock. If hwclock is not available, the user is currently informed that "hwclock failed to set hardware clock to system time", which is quite misleading. This may happen e.g. on s390x, which has a different timekeeping concept anyway. Let's check for the availability of the hwclock command and return QERR_UNSUPPORTED for guest-set-time if it is not available. Signed-off-by: Cornelia Huck --- Not sure if that is the correct approach, but the current error message is really quite confusing. Gave it a quick test with an s390x and an x86_64 guest; invoking 'virsh domtime ' now fails with 'not currently supported' on s390x and continues to work as before on x86_64. --- qga/commands-posix.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 1c1a165daed8..bd298a38b716 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -149,6 +149,13 @@ int64_t qmp_guest_get_time(Error **errp) return tq.tv_sec * 1000000000LL + tq.tv_usec * 1000; } +static int check_hwclock_available(const char *path) +{ + struct stat st; + + return (stat(path, &st) < 0) ? 0 : 1; +} + void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp) { int ret; @@ -156,6 +163,17 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp) pid_t pid; Error *local_err = NULL; struct timeval tv; + const char *hwclock_path = "/sbin/hwclock"; + static int hwclock_available = -1; + + if (hwclock_available < 0) { + hwclock_available = check_hwclock_available(hwclock_path); + } + + if (!hwclock_available) { + error_setg(errp, QERR_UNSUPPORTED); + return; + } /* If user has passed a time, validate and set it. */ if (has_time) { @@ -195,7 +213,7 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp) /* Use '/sbin/hwclock -w' to set RTC from the system time, * or '/sbin/hwclock -s' to set the system time from RTC. */ - execle("/sbin/hwclock", "hwclock", has_time ? "-w" : "-s", + execle(hwclock_path, "hwclock", has_time ? "-w" : "-s", NULL, environ); _exit(EXIT_FAILURE); } else if (pid < 0) {