From nobody Mon Feb 12 18:53:41 2024 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4TYYWp3RLBz5BMfs; Mon, 12 Feb 2024 18:53:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4TYYWp1LjZz4m25; Mon, 12 Feb 2024 18:53:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1707764022; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=v1HmO89g20G9+4/Vx5pTy1LnhgkF6U98iPdED5Zgqp8=; b=HaeveTalokkTBuayvKV1Xa+VcpTNjHnO4DlPuZuke8f36VrMWvjgxHVpZXDTKPcqW6LRR2 J2aENfk+nSE/aKxR6GgTQ3GI0dAY/2pA7wI8YU7Zsh3t454WpO6FFxu2ageag90Oa2Gn/f JNytgBLyWY5s0HiSpc6Ny53nmH2Ql/Cd9X4DV0xBgIlHJ05e3qfqYufpSiZ/QK9yyIx+rF j0TajXOM9mB67OT3NkKeo/V2tGH0GDZao2uLPSrIb+5UCTtNXpI+cZysdEi8dIz9bs6OSF aVB4FHnBvWuKYqYZPXD2cIXj7r9b0Q1Gx2zVLTpOLAlm0xhpSYyZdBhOVzzrHQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1707764022; a=rsa-sha256; cv=none; b=FJ71tbYuUcRhXvabXBSHZNCn9DJyXz+Pp7rUYhoSmW0jAGb4W9mUB2hUTffZYg/BKG/+A9 3TmCK1LRV4bWoywWSOauyzqVLd45cSl6d1z7PSpiVbeWYMXBP6kKiRfyw8GV1wOET1AoEM 7FMsJD+2owo1ZG9kdWhX9M/JHgNu7yKRdf/6IpT4zxwR9W1P+cB9pLNgHQtb3NGETLlbO6 6A+bZ47W+eBgpcqEIq/sSrPtV46C/AmwgqhdWVkIJ+qNBAbLAHNJnIyLKzxF80+5o42yMH 6A/7CXA/qMBFzTapiYWi3NMy3Im4q91150mNn+AjeE8cqjxP4c4PwVhLQd0AfQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1707764022; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=v1HmO89g20G9+4/Vx5pTy1LnhgkF6U98iPdED5Zgqp8=; b=AGUih8nIylP8gESuDY1zeb0Xirs2eUeugbwLt8pgRF9vk0ywvw4MrmXTAUXGNBoC3x4T9+ XOhxHCv8JVqBoPyI1W6p+2QFErweJU7LJHk3m9wXEXOVDeRbIjtOJMWEjWK9Ps0BQQYCgB H5aE/5Z1r6vzi54Gi2yJq5uw1xjVyQtLgMaUTDxf1DUBnS6L8S//sQWcpmuJU9ha7cWBv5 HqjBQEzCtScfNNhRQoho9qy9EQJxRqxEd8ghXl4IJUDYyH1aeXR/bXAWkhiaTRIrLv89nU ASf+8hLGM56m9mT+zgvFccX7CPq4fGWkMXhhIFk2hax0B8C/ZqO6+PhaZsQWMw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4TYYWp0Blwzjqj; Mon, 12 Feb 2024 18:53:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 41CIrfZm030607; Mon, 12 Feb 2024 18:53:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 41CIrfdp030604; Mon, 12 Feb 2024 18:53:41 GMT (envelope-from git) Date: Mon, 12 Feb 2024 18:53:41 GMT Message-Id: <202402121853.41CIrfdp030604@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 0df5f65908dd - main - reboot: Implement zfs support List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 0df5f65908dd1913212535e6c4dd4c73ce19c305 Auto-Submitted: auto-generated The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=0df5f65908dd1913212535e6c4dd4c73ce19c305 commit 0df5f65908dd1913212535e6c4dd4c73ce19c305 Author: Warner Losh AuthorDate: 2024-02-12 18:45:37 +0000 Commit: Warner Losh CommitDate: 2024-02-12 18:45:37 +0000 reboot: Implement zfs support Implement full support for ZFS -k support. For ZFS, we have to set a property that gets cleared by the boot loaeder for whether or not to process nextboot.conf. Do this using system("zfsbootcfg..." rather than coding the small subset of that program inline to avoid CDDL contamination of reboot and the complications of disabling CDDL and/or ZFS. The few bytes needed to implement reboot for systems with zfs is not worth saving for systems w/o ZFS. Only set nextboot_enable=YES for UFS filesystems. They are the only one that need that as the first line. Its presence on ZFS can cause the kernel to not be oneshot. Sponsored by: Netflix Reviewed by: kevans, kib Differential Revision: https://reviews.freebsd.org/D43824 --- sbin/reboot/reboot.c | 58 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/sbin/reboot/reboot.c b/sbin/reboot/reboot.c index d91fc6c97b0f..d598c857d255 100644 --- a/sbin/reboot/reboot.c +++ b/sbin/reboot/reboot.c @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -56,11 +57,6 @@ static uint64_t get_pageins(void); static bool dohalt; -static void -write_nextboot(const char *fn, const char *kernel, bool force) -{ - FILE *fp; - #define E(...) do { \ if (force) { \ warn( __VA_ARGS__ ); \ @@ -69,13 +65,58 @@ write_nextboot(const char *fn, const char *kernel, bool force) err(1, __VA_ARGS__); \ } while (0) \ +static void +zfsbootcfg(const char *pool, bool force) +{ + char *k; + int rv; + + asprintf(&k, + "zfsbootcfg -z %s -n freebsd:nvstore -k nextboot_enable -v YES", + pool); + if (k == NULL) + E("No memory for zfsbootcfg"); + + rv = system(k); + if (rv == 0) + return; + if (rv == -1) + E("system zfsbootcfg"); + if (rv == 127) + E("zfsbootcfg not found in path"); + E("zfsbootcfg returned %d", rv); +} + +static void +write_nextboot(const char *fn, const char *kernel, bool force) +{ + FILE *fp; + struct statfs sfs; + bool supported = false; + bool zfs = false; + + if (statfs("/boot", &sfs) != 0) + err(1, "statfs /boot"); + if (strcmp(sfs.f_fstypename, "ufs") == 0) { + /* + * Only UFS supports the full nextboot protocol. + */ + supported = true; + } else if (strcmp(sfs.f_fstypename, "zfs") == 0) { + zfs = true; + } + + if (zfs) { + zfsbootcfg(sfs.f_mntfromname, force); + } + fp = fopen(fn, "w"); if (fp == NULL) E("Can't create %s to boot %s", fn, kernel); - if (fprintf(fp, - "nextboot_enable=\"YES\"\n" - "kernel=\"%s\"\n", kernel) < 0) { + if (fprintf(fp,"%skernel=\"%s\"\n", + supported ? "nextboot_enable=\"YES\"\n" : "", + kernel) < 0) { int e; e = errno; @@ -86,7 +127,6 @@ write_nextboot(const char *fn, const char *kernel, bool force) E("Can't write %s", fn); } fclose(fp); -#undef E } int