// SPDX-License-Identifier: GPL-2.0

ndctl-inject-error(1)
=====================

NAME
----
ndctl-inject-error - inject media errors at a namespace offset

SYNOPSIS
--------
[verse]
'ndctl inject-error' <namespace> [<options>]

include::namespace-description.txt[]

ndctl-inject-error can be used to ask the platform to simulate media errors
in the NVDIMM address space to aid debugging and development of features
related to error handling.

By default, injecting an error actually only injects an error to the first 'n'
bytes of the block, where 'n' is the output of ndctl_cmd_ars_cap_get_size().
In other words, we only inject one 'ars_unit' per sector. This is sufficient
for Linux to mark the whole sector as bad, and will show up as such in the
various 'badblocks' lists in the kernel. If multiple blocks are being injected,
only the first 'n' bytes of each block specified will be injected as errors.
This can be overridden by the --saturate option, which will force the entire
block to be injected as an error.

WARNING: These commands are DANGEROUS and can cause data loss. They are
only provided for testing and debugging purposes.

EXAMPLES
--------

Inject errors in namespace0.0 at block 12 for 2 blocks (i.e. 12, 13)
[verse]
ndctl inject-error --block=12 --count=2 namespace0.0

Check status of injected errors on namespace0.0
[verse]
ndctl inject-error --status namespace0.0

Uninject errors at block 12 for 2 blocks on namespace0.0
[verse]
ndctl inject-error --uninject --block=12 --count=2 namespace0.0

OPTIONS
-------
-B::
--block=::
	Namespace block offset in 512 byte sized blocks where the error is
	to be injected.

	NOTE: The offset is interpreted in different ways based on the "mode"
	of the namespace. For "raw" mode, the offset is the base namespace
	offset. For "fsdax" mode (i.e. a "pfn" namespace), the offset is
	relative to the user-visible part of the namespace, and the offset
	introduced by the kernel's metadata will be accounted for. For a
	"sector" mode namespace (i.e. a "BTT" namespace), the offset is
	relative to the base namespace, as the BTT translation details are
	internal to the kernel, and can't be accounted for while injecting
	errors.

-n::
--count=::
	Number of blocks to inject as errors. This is also in terms of fixed,
	512 byte blocks.

-d::
--uninject::
	This option will ask the platform to remove any injected errors for the
	specified block offset, and count.

	WARNING: This will not clear the kernel's internal badblock tracking,
	those can only be cleared by doing a write to the affected locations.
	Hence use the --clear option only if you know exactly what you are
	doing. For normal usage, injected errors should only be cleared by
	doing writes. Do not expect have the original data intact after
	injecting an error, and clearing it using --clear - it will be lost,
	as the only "real" way to clear the error location is to write to it
	or zero it (truncate/hole-punch).

-t::
--status::
	This option will retrieve the status of injected errors. Note that
	this will not retrieve all known/latent errors (i.e. non injected
	ones), and is NOT equivalent to performing an Address Range Scrub.

-N::
--no-notify::
	This option is only valid when injecting errors. By default, the error
	inject command and will ask platform firmware to trigger a notification
	in the kernel, asking it to update its state of known errors.
	With this option, the error will still be injected, the kernel will not
	get a notification, and the error will appear as a latent media error
	when the location is accessed. If the platform firmware does not
	support this feature, this will have no effect.

-S::
--saturate::
	This option forces error injection or un-injection to cover the entire
	address range covered by the specified block(s).

-v::
--verbose::
	Emit debug messages for the error injection process

include::human-option.txt[]

-r::
--region=::
include::xable-region-options.txt[]

-b::
--bus=::
include::xable-bus-options.txt[]

include::../copyright.txt[]

SEE ALSO
--------
linkndctl:ndctl-list[1],
