From nobody Mon Oct 19 06:24:42 2026 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 4j7QWH1wgKz6vsPf for ; Mon, 19 Oct 2026 06:24:43 +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) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4j7QWH068Kz3Psh for ; Mon, 19 Oct 2026 06:24:43 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792391083; 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=v7JMr94aSJptJOxiOO912r1So9yBiSYbo5ZkVT5D8Ds=; b=sl+H6Ec6brDGZ0ZZqzg6xPHuVWC2Ec7ZGejegPXjgj78II9z6KeJidQ8UQ1doqgSHy1wFL 4+tLsT4ZyNKUugqJuiBZUQTjnfwMaeblUYGh3GygUi/1Az1dxKRMpBH2lJPxOZOD523lSx DdhnDnExD5b8YiG5nu7LOyEEVkuOWXvWdSg/wWer51Pg4BtelUu07PHT9Bg2iD0DButPwe cSxriAQBFtrIHOe5cij2Ru1H3gBFNvwI1qpMW9vtEHKOn/gG1/lAy34zRRIhjTzPY/knzO 9n2tGwps9DVemtF1BMFtXbLd8ecZtEnfNeANdvWIbe5bsltUBJ0P+dQJugZwyA== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792391083; b=HWZGxMBofL3dmgRZCNvAonKn5noywrTpNVChoMkAmWGu5DT9y03X41Jjno0dup29kIU37A +BjQ5n1iwv+pruBLwBubZwhO0yaQ315HzlLh7qbwgTVhP/atoBbonuV56QmKllLfsc9+Mf PaDKodZm06LuM9ENfLQWhuFYLhrad51bJ/gpg05Vp90a5ctqjWGqOifaiVggrN6Biu+4E1 hD0pBrSclvyuN7w4V9W0VDaRGArNeEt6RiZ7Ccfzg9MTAXrNKKzAMDh9c4gqDabbjCSVak iFpPDmWaePjurYRaJN2BAa2qguj5yb5y/Fl25U+7mYCMCBPai7WfLcDnri9r5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792391083; 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=v7JMr94aSJptJOxiOO912r1So9yBiSYbo5ZkVT5D8Ds=; b=AZhgtKC6iw+ZX+mm+uZR3zztUDv+moh4ybKEO8MBlVCno0ABYYurQeJ+u3rgKCaLIdADc8 Ryfo5dw3nF7I0qKbQe4H8Rr85e0+ujhM6NfJsGmdYTh6MzTj7nNC5wkX5eEFI5kyWWeO6I QiIDA2qSCnQvtEwcksmBS7Bbx1crauRqt0V56pE4ijXAkV5ftOhVoJwpivs4r16MxkJyUc o3R3JS+CrDviQDlc7375YrMzsSHeCDkJ22euPLrAKF/vZ7Vp6FQAOffYAKADXHI3KCCs97 ym20gP8woDF37BJhaOU8stIX23pl/b0GcZVJC5UEOGH8AwuFp1fwnagHjhe6EQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4j7QWG6rFPz1NKt for ; Mon, 19 Oct 2026 06:24:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 32bb2 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 19 Oct 2026 06:24:42 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 3b66efc6e9b8 - main - nvmecontrol: add format dry-run support List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: Commit messages for the main branch of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list 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: 3b66efc6e9b8999053f11a449056fad5ebc1c1ac Auto-Submitted: auto-generated Date: Mon, 19 Oct 2026 06:24:42 +0000 Message-Id: <6ad5b7aa.32bb2.58e2f594@gitrepo.freebsd.org> The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=3b66efc6e9b8999053f11a449056fad5ebc1c1ac commit 3b66efc6e9b8999053f11a449056fad5ebc1c1ac Author: Warner Losh AuthorDate: 2026-10-19 04:43:00 +0000 Commit: Warner Losh CommitDate: 2026-10-19 06:22:51 +0000 nvmecontrol: add format dry-run support Add -n/--dry-run to resolve and print the Format NVM command without submitting it. This lets users verify namespace selection and format parameters before making destructive media changes. Reviewed by: seuros, chuck Differential Revision: https://reviews.freebsd.org/D59835 --- sbin/nvmecontrol/format.c | 22 +++++++++++++++++----- sbin/nvmecontrol/nvmecontrol.8 | 5 +++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/sbin/nvmecontrol/format.c b/sbin/nvmecontrol/format.c index ee0ecc34aeaa..ccf0981103c0 100644 --- a/sbin/nvmecontrol/format.c +++ b/sbin/nvmecontrol/format.c @@ -59,6 +59,7 @@ static struct options { uint32_t ses; bool Eflag; bool Cflag; + bool dry_run; const char *dev; } opt = { .lbaf = NONE, @@ -69,6 +70,7 @@ static struct options { .ses = SES_NONE, .Eflag = false, .Cflag = false, + .dry_run = false, .dev = NULL, }; @@ -78,6 +80,8 @@ static const struct opts format_opts[] = { "Cryptographic erase"), OPT("erase", 'E', arg_none, opt, Eflag, "User data erase"), + OPT("dry-run", 'n', arg_none, opt, dry_run, + "Print the Format NVM command without submitting it"), OPT("lbaf", 'f', arg_uint32, opt, lbaf, "LBA Format to apply to the media"), OPT("ms", 'm', arg_uint32, opt, ms, @@ -186,7 +190,7 @@ format(const struct cmd *f, int argc, char *argv[]) struct nvme_pt_command pt; char *path; const char *target; - uint32_t nsid, scan_nsid; + uint32_t cdw10, nsid, scan_nsid; int lbaf, ms, pi, pil, ses, fd; u_int i; uint32_t sector_size; @@ -220,7 +224,7 @@ format(const struct cmd *f, int argc, char *argv[]) else ses = opt.ses; - open_dev(target, &fd, 1, 1); + open_dev(target, &fd, !opt.dry_run, 1); get_nsid(fd, &path, &nsid); if (nsid == 0) { nsid = NVME_GLOBAL_NAMESPACE_TAG; @@ -232,7 +236,7 @@ format(const struct cmd *f, int argc, char *argv[]) * string to get the controller substring and namespace ID. */ close(fd); - open_dev(path, &fd, 1, 1); + open_dev(path, &fd, !opt.dry_run, 1); } free(path); @@ -316,11 +320,19 @@ format(const struct cmd *f, int argc, char *argv[]) pil = 0; } + cdw10 = (ses << 9) + (pil << 8) + (pi << 5) + (ms << 4) + lbaf; + if (opt.dry_run) { + printf("Format NVM: opc=%#x nsid=%#010x cdw10=%#010x " + "(lbaf=%d mset=%d pi=%d pil=%d ses=%d)\n", + NVME_OPC_FORMAT_NVM, nsid, cdw10, lbaf, ms, pi, pil, ses); + close(fd); + exit(0); + } + memset(&pt, 0, sizeof(pt)); pt.cmd.opc = NVME_OPC_FORMAT_NVM; pt.cmd.nsid = htole32(nsid); - pt.cmd.cdw10 = htole32((ses << 9) + (pil << 8) + (pi << 5) + - (ms << 4) + lbaf); + pt.cmd.cdw10 = htole32(cdw10); if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) err(EX_IOERR, "format request failed"); diff --git a/sbin/nvmecontrol/nvmecontrol.8 b/sbin/nvmecontrol/nvmecontrol.8 index 793016652e73..19015a8c90df 100644 --- a/sbin/nvmecontrol/nvmecontrol.8 +++ b/sbin/nvmecontrol/nvmecontrol.8 @@ -153,6 +153,7 @@ .Aq Ar device-id .Nm .Ic format +.Op Fl n .Op Fl f Ar fmt .Op Fl s Ar sector-size .Op Fl m Ar mset @@ -505,6 +506,10 @@ Use Extended Data Structure. Format either specified namespace, or all namespaces of specified controller, using specified parameters: .Bl -tag -width 8n +.It Fl n , Fl Fl dry-run +Print the resolved Format NVM command without submitting it to the controller. +Identify commands needed to resolve and validate the format parameters are +still performed. .It Fl f Ar fmt The index .Ar fmt