<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 2.6.10) -->
<?rfc docmapping="yes"?>
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-haynes-nfsv4-flexfiles-v2-08" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="Flex File Layout v2">Parallel NFS (pNFS) Flexible File Layout Version 2</title>
    <seriesInfo name="Internet-Draft" value="draft-haynes-nfsv4-flexfiles-v2-08"/>
    <author initials="T." surname="Haynes" fullname="Thomas Haynes">
      <organization>Hammerspace</organization>
      <address>
        <email>loghyr@gmail.com</email>
      </address>
    </author>
    <date/>
    <area>General</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 146?>

<t>Parallel NFS (pNFS) allows a separation between the metadata (onto a
metadata server) and data (onto a storage device) for a file.  The
Flexible File Version 2 Layout Type is defined in this document as
an extension to pNFS that allows the use of storage devices that
require only a limited degree of interaction with the metadata
server and use already-existing protocols.  Data protection is also
added to provide integrity.  Both Client-side mirroring and the
erasure coding algorithms are used for data protection.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-nfsv4.github.io/flexfiles-v2/draft-haynes-nfsv4-flexfiles-v2.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-haynes-nfsv4-flexfiles-v2/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Network File System Version 4 Working Group mailing list (<eref target="mailto:nfsv4@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/nfsv4/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/nfsv4/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-nfsv4/flexfiles-v2"/>.</t>
    </note>
    <note>
      <name>Note to Readers</name>
      <?line 157?>

<t>This is an individual submission and does not reflect Working Group
consensus.  The "About This Document" section above has the current
discussion venue, latest rendering, and source location.</t>
    </note>
  </front>
  <middle>
    <?line 163?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>In Parallel NFS (pNFS) (see <xref section="12" sectionFormat="of" target="RFC8881"/>), the metadata
server returns layout type structures that describe where file data is
located.  There are different layout types for different storage systems
and methods of arranging data on storage devices.  <xref target="RFC8435"/> defined
the Flexible File Version 1 Layout Type used with file-based data
servers that are accessed using the NFS protocols: NFSv3 <xref target="RFC1813"/>,
NFSv4.0 <xref target="RFC7530"/>, NFSv4.1 <xref target="RFC8881"/>, and NFSv4.2 <xref target="RFC7862"/>.</t>
      <t>A metadata server that supports the Flexible File Version 2 Layout
Type <bcp14>MUST</bcp14> be an NFSv4.2 server.  The new operations defined by this
document for the metadata server (the TRUST_STATEID family on the
metadata server / storage device control session, and the
CB_CHUNK_REPAIR back-channel callback to clients) are NFSv4.2
operations and have no representation in NFSv4.1 or earlier minor
versions.  Storage devices can speak NFSv3, NFSv4.1, or NFSv4.2, but
some encoding types and coupling configurations narrow that choice;
see <xref target="sec-ff_device_addr4"/> for the exact rules.</t>
      <t>To provide a global state model equivalent to that of the files
layout type, a back-end control protocol might be implemented between
the metadata server and NFSv4.1+ storage devices.  An implementation
can either define its own proprietary mechanism or it could define a
control protocol in a Standards Track document.  The requirements for
a control protocol are specified in <xref target="RFC8881"/> and clarified in
<xref target="RFC8434"/>.</t>
      <t>The control protocol described in this document is based on NFS.  It
does not provide for knowledge of stateids to be passed between the
metadata server and the storage devices.  Instead, the storage
devices are configured such that the metadata server has full access
rights to the data file system and then the metadata server uses
synthetic ids to control client access to individual data files.</t>
      <t>In traditional mirroring of data, the server is responsible for
replicating, validating, and repairing copies of the data file.  With
client-side mirroring, the metadata server provides a layout that
presents the available mirrors to the client.  The client then picks
a mirror to read from and ensures that all writes go to all mirrors.
The client only considers the write transaction to have succeeded if
all mirrors are successfully updated.  In case of error, the client
can use the LAYOUTERROR operation to inform the metadata server,
which is then responsible for the repairing of the mirrored copies of
the file.</t>
      <t>This client side mirroring provides for replication of data but does
not provide for integrity of data.  In the event of an error, a user
would be able to repair the file by silvering the mirror contents.
I.e., they would pick one of the mirror instances and replicate it to
the other instance locations.</t>
      <t>However, lacking integrity checks, silent corruptions are not able to
be detected and the choice of what constitutes the good copy is
difficult.  This document defines the Flexible File Version 2 Layout
Type, an independent layout type that adds error-detection integrity
(checksum) for erasure coding.  It does not modify the Flexible File
Version 1 Layout Type (<xref target="RFC8435"/>); the two coexist.  Data blocks are
transformed into a header and a chunk.  This document also introduces
new operations that allow the client to roll back writes to the data
file.</t>
      <t>Using the process detailed in <xref target="RFC8178"/>, the revisions in this
document become an extension of NFSv4.2 <xref target="RFC7862"/>.  They are built on
top of the external data representation (XDR) <xref target="RFC4506"/> generated
from <xref target="RFC7863"/>.</t>
      <t>This document defines <tt>LAYOUT4_FLEX_FILES_V2</tt>, a new and independent
layout type that coexists with the Flexible File Version 1 Layout Type
(<tt>LAYOUT4_FLEX_FILES</tt>, <xref target="RFC8435"/>).  The two layout types are
wire-format-incompatible: a flexible file v1 layout receiver
cannot parse flexible file v2 layout bytes, and a flexible file
v2 layout receiver cannot parse flexible file v1 layout bytes.
Semantically, however, the flexible file v2 layout is a superset
of the flexible file v1 layout: any flexible file v1 layout has
a natural flexible file v2 layout representation using a single
FFV2<em>ENCODING_PASSTHROUGH mirror (see
<xref target="sec-encoding-passthrough"/>), with the flexible file v1 layout's
data servers mapped into ffv2_stripes4 and the flexible file v1
layout's layout-level ffl_stripe_unit mapped into per-mirror
ffv2m_striping_unit_size and ffv2m_striping.  The reverse does
not hold: flexible file v2 layouts that use any CHUNK-based
encoding (any FFV2_ENCODING</em>* value other than
FFV2_ENCODING_PASSTHROUGH) have no flexible file v1 layout
representation, because the flexible file v1 layout has neither
the chunk envelope (chunk_guard4, per-chunk checksum) nor the
per-mirror encoding choice that those encodings require.  A
server <bcp14>MAY</bcp14> support both layout types simultaneously; a client
selects the desired layout type in its LAYOUTGET request.</t>
    </section>
    <section anchor="requirements-language">
      <name>Requirements Language</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="sec-motivation">
      <name>Motivation</name>
      <t>Workloads that need both the throughput of parallel pNFS
data servers and the durability of erasure coding have
driven the work in this draft.  The deployments span
scientific-instrumentation pipelines that produce
petabytes of detector data per year, training-checkpoint
files written hot from machine-learning jobs, archive
workloads in which a single file may hold the only copy of
an experiment's result, and ordinary production
filesystems where read patterns evolve across a file's
lifetime.  These deployments are documented in detail in
<xref target="sec-use-cases"/>; the protocol shape that follows is the
result of looking at them and asking what a pNFS layout
type would have to provide.</t>
      <t>The first thing the deployments share is that erasure
coding moves work off the data servers that are already
the bottleneck in the write-heavy parallel case.
Server-side erasure coding makes each data server compute
its share of the parity transform on every write,
multiplying the per-write CPU cost by (k + m) across the
storage tier and serializing on the data server's limited
compute.  Client-side erasure coding shifts that compute
to the writers, which scale horizontally with the
workload, and lets the data servers stay close to their
strength -- storing and serving bytes.  Flexible file v1
layout (<xref target="RFC8435"/>) already chose client-side compute by
placing replication at the writer; this draft extends that
choice to client-side erasure coding.  Benchmark
measurements summarized in <xref target="sec-implementation-status"/>
confirm that the resulting overhead is competitive with
server-side encoding on realistic workloads and that the
encoding compute scales with the writer population rather
than with the data-server count.</t>
      <t>Client-side erasure coding has a corollary that protocol
designers cannot avoid: when a client fans a stripe out
across multiple data servers and fails mid-write, no
single data server has whole-transaction visibility.  The
state left behind on each data server is a partial
fragment of a write that may or may not have completed
elsewhere.  A server-side coordinator that holds the whole
stripe -- the flexible file v1 case -- can resilver from a
surviving copy without any client involvement.  In the v2
case there is no such coordinator, and the on-wire
protocol specifies how the partial state is reconciled.
This is the load-bearing constraint that shapes the rest
of the design.</t>
      <t>A natural-looking answer is to add a distributed-consensus
protocol between the data servers and have them agree on
which write committed.  That answer is rejected here.
Distributed consensus is operationally expensive,
introduces a synchronization cost on every write, and
makes the data servers themselves stateful peers in a way
that closes off the simpler implementations the protocol
is designed to accommodate.  Instead, this draft uses two
narrowly-scoped primitives that together provide just
enough on-wire reconciliation: the chunk_guard4
compare-and-swap (CAS) and the CB_CHUNK_REPAIR callback.</t>
      <t>Every CHUNK_WRITE carries a cohort header (a 64-bit
writer-chosen chunk_cohort_id4 plus the writer's 32-bit
layout-granted client id) once for the batch, and the
data server performs a per-chunk compare-and-swap against
its own chunk_guard4 (a 32-bit per-chunk generation
counter plus the last writer's client id) when the client
sets cwa_guard on receipt.  If two writers race for the
same chunk, exactly one wins on each data server, the
loser receives NFS4ERR_CHUNK_GUARDED for that chunk, and
the chunks the loser intended to write are left
unchanged.  No data server needs to consult its peers;
the CAS is local.  The cost on the metadata server is
bounded by the 12-byte cohort header per CHUNK_WRITE
plus a 32-bit per-layout client identifier
(<xref target="sec-chunk_guard4"/>, <xref target="sec-ffv2-mirror4"/>).
Independent collisions on different chunks resolve
independently; there is no file-wide lock and no global
ordering across writes.</t>
      <t>When the per-chunk CAS detects that a stripe ended up
non-atomic -- some shards under writer A's guard, others
under writer B's, or a writer crashed mid-fan-out -- the
metadata server selects a repair actor via
CB_CHUNK_REPAIR, and that actor
drives the repair: it acquires CHUNK_LOCK on the affected
range, reads the surviving shards, decodes through the
erasure transform, writes the reconstructed shards via
CHUNK_WRITE_REPAIR, and clears the errored state via
CHUNK_REPAIRED.  The repair actor may be a client, a data
server (in a tightly coupled deployment), or a proxy server;
exactly one holds the chunk-range lock per repair episode
so the data servers still do not coordinate among themselves.
The repair-actor selection rule is given in
<xref target="sec-repair-selection"/>.</t>
      <t>These two primitives -- the per-chunk CAS and the
callback-driven repair -- replace what would otherwise
require a distributed-consensus protocol.  The CAS handles
the common case at local cost, where independent writers
racing for different chunks resolve independently and
concurrent writers on the same chunk get a clean win/loss
decision.  CB_CHUNK_REPAIR handles the rare case of
partial-failure non-atomicity with a single coordinator
selected per repair episode.  The cost model is asymmetric
on purpose: the hot path pays for an 8-byte header and a
local CAS; the cold path pays for a selected actor and a
small number of round-trips.</t>
      <t>The CHUNK operation set in this draft is the minimum
sufficient to drive the chunk state machine
(<xref target="sec-system-model-chunk-state"/>) plus the repair flow
above.  CHUNK_WRITE places PENDING content; CHUNK_FINALIZE
signals that the writer is done with a generation;
CHUNK_COMMIT promotes that generation to durable, globally
visible state; CHUNK_READ retrieves it; CHUNK_HEADER_READ
provides the fast probe that lets repair coordinators and
recovering writers inspect chunk metadata without reading
payloads.  CHUNK_LOCK, CHUNK_UNLOCK, CHUNK_ERROR,
CHUNK_REPAIRED, CHUNK_WRITE_REPAIR, and CHUNK_ROLLBACK
together drive the repair flow.  Each operation does one
well-scoped job; the complexity is in the state machine
the operations drive, not in the operation set itself.
Each of these primitives closes a specific gap in the
lifecycle or the repair path.  The detailed treatment of
the operation set is in <xref target="sec-new-ops"/>.</t>
      <t>The same design discipline shapes the rest of the
specification.  The protocol describes wire format and
server obligations; it does not pin a data-server
backend, a control protocol between metadata server and
data server, a checksum algorithm, or a file-attribute
representation on the data server.  Different
implementations resolve these choices differently and
remain conformant.  TRUST_STATEID
(<xref target="sec-tight-coupling-control"/>) is one such control
protocol that this draft defines; storage devices with
their own established control protocols are conformant
without implementing it.  The tagged checksum4
(<xref target="sec-checksum4"/>) lets the metadata server pick any
registered checksum algorithm per file.  The
authorization-outcome parity rule
(<xref target="sec-state-locking"/>) lets data servers that do not
expose a POSIX file namespace satisfy the tight coupling
requirements without materializing POSIX uid/gid bits.</t>
      <t>A protocol-level consequence of placing erasure coding at
the client is that the layout is able to describe a
file's storage shape over its full lifetime -- including
the transition windows when the file is being assimilated
from a non-erasure-coded source, re-encoded from one
encoding to another, or recovered from a correlated encoding
failure through a mirror under a different encoding.
This draft allows a single file's layout to contain
mirrors under different encodings.  The
heterogeneous-mirror capability is not a steady-state
expectation; most files have one encoding most of the
time.  It is the protocol shape that lets transitions
happen while the file remains readable.  The deployment
cases that drive the allowance are catalogued in
<xref target="sec-use-cases"/>.</t>
      <t>Scope note: the consistency goal of flexible file v2
layout is RAID consistency across the shards that make
up an encoded stripe, not POSIX write ordering across
arbitrary application writes.  The protocol does not
attempt to make overlapping application writes from
different clients atomic; that is the province of file
locking (<xref section="12" sectionFormat="of" target="RFC8881"/>) and of application-level
coordination.  What the protocol does guarantee is that
the shards comprising a given stripe agree on which
write produced them -- expressed on the wire as agreement
on the chunk_guard4 value of every chunk that carries
those shards -- so that readers and repair actors never
observe a half-applied stripe.  Readers who need
cross-write ordering beyond a single stripe <bcp14>MUST</bcp14> use the
existing NFSv4 locking primitives.</t>
    </section>
    <section anchor="sec-use-cases">
      <name>Use Cases</name>
      <t>The protocol is designed around three workload classes.  The
labels below reflect the relative frequency of each class in
installations that choose flexible file v2 layout for its combination of
integrity and performance; individual deployments may diverge.</t>
      <dl>
        <dt>Single writer, multiple readers (the common case):</dt>
        <dd>
          <t>A file written by one client and subsequently read by many.
Examples include artifacts deposited by batch jobs, container
images, and media files.  The protocol is optimized for this
case; see <xref target="sec-system-model-progress"/>.</t>
        </dd>
        <dt>Multiple writers without sustained contention (occasional):</dt>
        <dd>
          <t>Files with multiple concurrent writers where races on the same
chunk are rare.  Examples include shared-directory append-only
logs and distributed builds.  The chunk_guard4 CAS primitive and
per-chunk locking cover this case without penalizing the common
single writer path.</t>
        </dd>
        <dt>Multiple writers, disjoint regions (rare):</dt>
        <dd>
          <t>High-performance computing (HPC) checkpoint workloads, in which
many ranks write disjoint regions of the same file in lockstep.
The protocol relies on block alignment to keep per-chunk
contention rare despite overall high writer count.  Contention
that does occur is resolved via the deterministic tiebreaker
rule defined in <xref target="sec-chunk_guard4"/>.  Deployments that use an
XOR-based erasure encoding (see <xref target="sec-mojette-encoding"/>) and
expect frequent small edits from this workload class <bcp14>MAY</bcp14> use the
optional delta-write protocol defined in
<xref target="I-D.haynes-nfsv4-flexfiles-v2-delta-writes"/>, which lets the
client forward per-projection XOR deltas directly to each data
server, avoiding client-side read-modify-write of the full
stripe on the small-edit path.</t>
        </dd>
      </dl>
      <t>Scale targets include multi-thousand-client deployments (on the
order of tens of thousands of concurrent clients for HPC
checkpointing), parallel-filesystem replacements, and multi-rack
shared-storage clusters.  The repair protocol (see
<xref target="sec-repair-selection"/>) is designed to let such deployments
tolerate data-server failures and concurrent writer races without
blocking the critical path for the first two workload classes.</t>
    </section>
    <section anchor="definitions">
      <name>Definitions</name>
      <dl>
        <dt>block:</dt>
        <dd>
          <t>the application's view of file data.  A block is a unit of file
content as observed by an NFS client at the POSIX layer or by the
local file system.  A chunk's payload, after any decoding the client
performs, is presented to the application as one or more blocks.</t>
        </dd>
        <dt>shard:</dt>
        <dd>
          <t>the encoding's view.  A shard is a single piece of an encoded stripe
produced by an erasure-coding (or replication) transformation.  A
stripe of k data shards plus m parity shards is the unit an encoding
encodes and decodes.  The word "shard" only has meaning while the
encoding is reasoning about a stripe; once a shard is at rest on a data
server it is, by virtue of having been transmitted, the payload of a
chunk.</t>
        </dd>
        <dt>chunk:</dt>
        <dd>
          <t>the protocol's unit of file data on the wire, carrying an
envelope that distinguishes it from a block: a compare-and-swap
guard (chunk_guard4 -- atomicity, see <xref target="sec-chunk_guard4"/>), a
checksum (per-chunk integrity), a provenance identifier
(chunk_owner4, see <xref target="sec-chunk_owner4"/>), a lifecycle state
(PENDING / FINALIZED / COMMITTED via the chunk state machine,
see <xref target="sec-system-model-chunk-state"/>), and per-chunk locking that
survives stateid revocation through lock escrow.  A chunk is the
addressable unit named in the CHUNK operations defined in this
document and durably persisted by a data server.  A chunk's
payload may be a block (mirrored layout) or a shard
(erasure-coded layout); the wire protocol does not distinguish.
The chunk size <bcp14>MAY</bcp14> differ from the size of the block or shard it
carries.  See <xref target="sec-system-model-chunk-not-block"/> for the
load-bearing role each envelope property plays in the protocol's
consistency story.</t>
        </dd>
      </dl>
      <t>The three terms describe the same data at three different layers and
should be used accordingly.  The encoding transforms blocks into shards;
the wire protocol transmits shards as chunk payloads; the data server
persists chunks.  On read the path reverses.</t>
      <t>A protocol-internal note: the chunk state machine
(<xref target="sec-system-model-chunk-state"/>) and several CHUNK operations
refer to the per-chunk-offset state records as "blocks" (PENDING /
FINALIZED / COMMITTED / errored).  This is a finer-grained use of
the word, internal to the data server's chunk metadata, and should
not be confused with the application-layer "block" defined above.
Where ambiguity matters, this document writes "chunk-state block"
or relies on context (operation names, state names) to disambiguate.</t>
      <dl>
        <dt>client-side erasure coding:</dt>
        <dd>
          <t>Erasure coding in which the encode and decode transforms are
performed on the pNFS client, and encoded shards are written
directly to the data servers (rather than being computed at
a server-side coordinator).  This is the deployment shape
Flexible File Version 2 Layout Type is designed for; the
chunk substrate and CHUNK operations that make it safe are
specified in <xref target="sec-system-model"/> and <xref target="sec-new-ops"/>.
Contrast: server-side erasure coding, where a coordinator
holds the entire stripe and produces parity, is out of scope
for this document.</t>
        </dd>
        <dt>client-side mirroring:</dt>
        <dd>
          <t>a feature in which the client, not the server, is responsible for
updating all of the mirrored copies of a layout segment.</t>
        </dd>
        <dt>compare-and-swap (CAS):</dt>
        <dd>
          <t>an atomic primitive from concurrent programming in which an
update is conditional on a prior observed value: the operation
succeeds only if the current value matches an expected prior value,
and otherwise fails so the caller can retry.  In this document, the
chunk_guard4 mechanism (see <xref target="sec-chunk_guard4"/>) implements CAS at
the chunk level; the "expected prior value" is the chunk_guard4 the
writer observed at read time, and the "fail" outcome is
NFS4ERR_CHUNK_GUARDED.</t>
        </dd>
        <dt>control communication requirements:</dt>
        <dd>
          <t>the specification for information on layouts, stateids, file metadata,
and file data that must be communicated between the metadata server and
the storage devices.  There is a separate set of requirements for each
layout type.</t>
        </dd>
        <dt>control protocol:</dt>
        <dd>
          <t>the particular mechanism that an implementation of a layout type would
use to meet the control communication requirement for that layout type.
This need not be a protocol as normally understood.  In some cases,
the same protocol may be used as a control protocol and storage protocol.</t>
        </dd>
        <dt>(file) data:</dt>
        <dd>
          <t>that part of the file system object that contains the data to be read
or written.  It is the contents of the object rather than the attributes
of the object.</t>
        </dd>
        <dt>data block:</dt>
        <dd>
          <t>A block (as defined above) in the client's cache for a file.</t>
        </dd>
        <dt>data file:</dt>
        <dd>
          <t>The data portion of the file, stored on the data server.</t>
        </dd>
        <dt>data server:</dt>
        <dd>
          <t>a pNFS server that provides the file's data when the file system
object is accessed over a file-based protocol.</t>
        </dd>
        <dt>erasure coding:</dt>
        <dd>
          <t>A data protection scheme where a stripe of data is encoded into
shards (k data shards and m parity shards) so that the original
content can be reconstructed from any sufficient subset of the
shards.  Shards are transmitted as the payload of CHUNK operations
and stored on different data servers.</t>
        </dd>
        <dt>escrow (lock escrow, metadata-server escrow):</dt>
        <dd>
          <t>a state in which a chunk lock is held by the metadata server on
behalf of an as-yet-unselected future owner.  Escrow preserves
the lock-continuity invariant across two survivability
scenarios: (a) client failure while holding chunk locks
(client-revocation case: the locks are transferred to the
metadata server rather than dropped), and (b)
metadata-server-instance change (restart / HA failover: a new
incarnation reclaims the escrows the departing incarnation
installed).  The escrowed lock is marked on the wire by the
reserved cg_client_id value CHUNK_GUARD_CLIENT_ID_MDS (see
<xref target="sec-chunk_guard_mds"/>) and named by an escrow_id4
(<xref target="sec-escrow_id4"/>).  A repair actor adopts an escrow via
CHUNK_LOCK with CHUNK_LOCK_FLAGS_ADOPT driven by
CB_CHUNK_REPAIR; a new metadata-server incarnation reclaims
outstanding escrows via CHUNK_ESCROW_TAKEOVER.  A
"metadata-server escrow owner" is the metadata server acting
in this placeholder role; "in escrow" describes a lock in this
state.  The full model is <xref target="sec-system-model-escrow"/>.</t>
        </dd>
        <dt>fencing:</dt>
        <dd>
          <t>the process by which the metadata server prevents the storage devices
from processing I/O from a specific client to a specific file.</t>
        </dd>
        <dt>file layout type:</dt>
        <dd>
          <t>a layout type in which the storage devices are accessed via the NFS
protocol (see <xref section="5.12.4" sectionFormat="of" target="RFC8881"/>).</t>
        </dd>
        <dt>gid:</dt>
        <dd>
          <t>the group id, a numeric value that identifies to which group a file
belongs.</t>
        </dd>
        <dt>layout:</dt>
        <dd>
          <t>the information a client uses to access file data on a storage device.
This information includes specification of the protocol (layout type)
and the identity of the storage devices to be used.</t>
        </dd>
        <dt>layout iomode:</dt>
        <dd>
          <t>a grant of either read-only or read/write I/O to the client.</t>
        </dd>
        <dt>layout segment:</dt>
        <dd>
          <t>a sub-division of a layout.  That sub-division might be by the layout
iomode (see Sections 3.3.20 and 12.2.9 of <xref target="RFC8881"/>), a striping pattern
(see <xref section="13.3" sectionFormat="of" target="RFC8881"/>), or requested byte range.</t>
        </dd>
        <dt>layout stateid:</dt>
        <dd>
          <t>a 128-bit quantity returned by a server that uniquely defines the
layout state provided by the server for a specific layout that describes
a layout type and file (see <xref section="12.5.2" sectionFormat="of" target="RFC8881"/>).  Further,
<xref section="12.5.3" sectionFormat="of" target="RFC8881"/> describes differences in handling between
layout stateids and other stateid types.</t>
        </dd>
        <dt>layout type:</dt>
        <dd>
          <t>a specification of both the storage protocol used to access the data
and the aggregation scheme used to lay out the file data on the underlying
storage devices.</t>
        </dd>
        <dt>loose coupling:</dt>
        <dd>
          <t>when the control protocol is a storage protocol.</t>
        </dd>
        <dt>(file) metadata:</dt>
        <dd>
          <t>the part of the file system object that contains various descriptive
data relevant to the file object, as opposed to the file data itself.
This could include the time of last modification, access time, EOF
position, etc.</t>
        </dd>
        <dt>metadata server:</dt>
        <dd>
          <t>the pNFS server that provides metadata information for a file system
object.  It is also responsible for generating, recalling, and revoking
layouts for file system objects, for performing directory operations,
and for performing I/O operations to regular files when the clients
direct these to the metadata server itself.</t>
        </dd>
        <dt>mirror:</dt>
        <dd>
          <t>a copy of a layout segment.  Note that if one copy of the mirror is
updated, then all copies must be updated.</t>
        </dd>
        <dt>non-systematic encoding:</dt>
        <dd>
          <t>An erasure coding scheme in which the encoded shards do not contain
verbatim copies of the original data.  Every read requires decoding,
even when no shards are lost.  The Mojette non-systematic transform is
an example.</t>
        </dd>
        <dt>proxy server:</dt>
        <dd>
          <t>a peer of the metadata server, defined in
<xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/> (hereafter "the
proxy server draft"), that admits client I/O on the metadata
server's behalf -- either as a translator for clients that
cannot speak the file's native encoding, or as a proxy-mediated
data path during whole-file move and repair operations.  A
proxy server may have additional roles.  This document cites
the proxy server draft only when referencing a specific rule
or section within it; other mentions of "proxy server" or "the
proxy server draft" in this document refer to the same reference
without repeating the citation.</t>
        </dd>
        <dt>recalling a layout:</dt>
        <dd>
          <t>a graceful recall, via a callback, of a specific layout by the metadata
server to the client.  Graceful here means that the client would have
the opportunity to flush any WRITEs, etc., before returning the layout
to the metadata server.</t>
        </dd>
        <dt>replication of data:</dt>
        <dd>
          <t>Data replication is making and storing multiple copies of data in
different locations.</t>
        </dd>
        <dt>resilvering:</dt>
        <dd>
          <t>the act of rebuilding a mirrored copy of a layout segment from a
known good copy of the layout segment.  Note that this can also be done
to create a new mirrored copy of the layout segment.</t>
        </dd>
        <dt>revoking a layout:</dt>
        <dd>
          <t>an invalidation of a specific layout by the metadata server.
Once revocation occurs, the metadata server will not accept as valid any
reference to the revoked layout, and a storage device will not accept
any client access based on the layout.</t>
        </dd>
        <dt>rsize:</dt>
        <dd>
          <t>the data transfer buffer size used for READs.</t>
        </dd>
        <dt>stateid:</dt>
        <dd>
          <t>a 128-bit quantity returned by a server that uniquely defines the set
of locking-related state provided by the server.  Stateids may designate
state related to open files, byte range locks, delegations, or layouts.</t>
        </dd>
        <dt>storage device:</dt>
        <dd>
          <t>the target to which clients may direct I/O requests when they hold
an appropriate layout.  See <xref section="2.1" sectionFormat="of" target="RFC8434"/> for further
discussion of the difference between a data server and a storage device.</t>
        </dd>
        <dt>storage protocol:</dt>
        <dd>
          <t>the protocol used by clients to do I/O operations to the storage
device.  Each layout type specifies the set of storage protocols.</t>
        </dd>
        <dt>systematic encoding:</dt>
        <dd>
          <t>An erasure coding scheme in which the first k of the k + m encoded
shards are identical to the original k data blocks.  A healthy read
(no failures) requires no decoding -- the data shards are read directly.
Decoding is triggered only when data shards are missing.  Reed-Solomon
Vandermonde and Mojette systematic are examples.</t>
        </dd>
        <dt>tight coupling:</dt>
        <dd>
          <t>an arrangement in which the control protocol is one designed
specifically for control communication.  It may be either a proprietary
protocol adapted specifically to a particular metadata server or a
protocol based on a Standards Track document.  The specific
tight coupling variant defined by this document, in which the
control protocol is the TRUST_STATEID family, is referred to as
trusted stateid tight coupling (see <xref target="sec-tight-coupling-control"/>).</t>
        </dd>
        <dt>trusted stateid tight coupling:</dt>
        <dd>
          <t>the specific tight coupling control protocol defined in this
document, consisting of the operations TRUST_STATEID, REVOKE_STATEID,
and BULK_REVOKE_STATEID.  Within the scope of this document,
unqualified references to "tight coupling" or "tightly coupled" refer
to trusted stateid tight coupling unless the context explicitly
discusses the general concept.  Other tight coupling control
protocols (proprietary or future Standards Track) may exist but
are not covered by this specification.</t>
        </dd>
        <dt>uid:</dt>
        <dd>
          <t>the user id, a numeric value that identifies which user owns a file.</t>
        </dd>
        <dt>write hole:</dt>
        <dd>
          <t>A write hole is a data corruption scenario where either two clients
are trying to write to the same chunk or one client is overwriting an
existing chunk of data.</t>
        </dd>
        <dt>wsize:</dt>
        <dd>
          <t>the data transfer buffer size used for WRITEs.</t>
        </dd>
      </dl>
      <section removeInRFC="true" anchor="naming-the-layout-type-reviewer-note">
        <name>Naming the layout type (reviewer note)</name>
        <t>The layout type defined by this document is referred to by several
forms in the surrounding prose.  This note fixes the vocabulary so
the reader (and the sweep in the source) can keep them straight.
It follows the register RFC 8435 established for its own layout
type: a formal title-case name for headings and IANA registrations,
a lowercase running-text form, and separate XDR / struct-prefix
identifiers.  The parallel is exact -- everywhere RFC 8435 says
"flexible file layout" this document says "flexible file v2
layout", and everywhere RFC 8435 says "Flexible File Layout Type"
this document says "Flexible File Version 2 Layout Type".</t>
        <t>Formal name (headings, IANA registrations, the abstract):
"Flexible File Version 2 Layout Type".  This is the form to
use when naming the layout type as such -- for example, the
Section 5 heading, the IANA registry title, and the sentence
that introduces the layout type in the abstract.  A short
formal variant "Flexible File Version 2 Layout" drops "Type"
when "Type" would be redundant with the surrounding noun
(as in the IANA-registered creation-hint name).</t>
        <t>Running-text form (body prose): "flexible file v2 layout".
This is the form for sentences that mention the layout in
passing rather than naming it as an object of definition --
"the flexible file v2 layout supports multipathing to multiple
storage devices", "the flexible file v2 layout does not use
lou_body".  It parallels RFC 8435's lowercase "flexible file
layout" and is preferred over the title-case form for
sentences where the emphasis is on the mechanism, not the
name.  Do NOT write "flexible file v2 layout version 2" -- the
"v2" already carries the version, and appending "version 2"
is a rendering hazard.</t>
        <t>Short form (narrow tables and reviewer-aid appendix material
where cell width or repetition would otherwise dominate):
"FFv2", with "FFv1" reserved for the predecessor defined by
<xref target="RFC8435"/>.  The short forms are NOT appropriate in body
prose, headings, IANA registrations, or the abstract; body
prose that would otherwise repeat the layout name uses the
running-text form above.  Their scoped use is in tables where
"flexible file v2 layout" would break the column layout (e.g.,
the four-variant wire-path comparison table in the
Implementation Status appendix).</t>
        <t>XDR identifier: <tt>LAYOUT4_FLEX_FILES_V2</tt>.  This is the name
assigned to the layout type by the layout-type registry
(<xref target="RFC8434"/>) and is the constant a receiver compares against
when dispatching on layout type.  It parallels
<tt>LAYOUT4_FLEX_FILES</tt> for the predecessor layout type
(<xref target="RFC8435"/>).  Use the XDR identifier whenever the sentence
is about the value that appears on the wire; use the
"Flexible File Version 2 Layout Type" formal name whenever
the sentence is about the layout type as a specification.</t>
        <t>Struct-name prefix: <tt>ffv2_</tt> (as in <tt>ffv2_layout4</tt>,
<tt>ffv2_mirror4</tt>, <tt>ffv2_stripes4</tt>).  This parallels RFC 8435's
<tt>ff_</tt> prefix (as in <tt>ff_layout4</tt>, <tt>ff_device_addr4</tt>).  The
per-struct field prefix follows the RFC 8435 pattern of
struct-initials plus underscore: <tt>ffv2l_</tt> for
<tt>ffv2_layout4</tt>, <tt>ffv2m_</tt> for <tt>ffv2_mirror4</tt>, <tt>ffv2ds_</tt> for
<tt>ffv2_data_server4</tt>, and so on.</t>
        <t>Every field prefix carries the full <tt>ffv2</tt> stem; a bare <tt>f</tt>
plus struct initials is not used, so that a reader scanning
an XDR block can tell at a glance which specification a field
belongs to.</t>
        <t>Where two struct names would reduce to the same initials, the
prefix takes one letter from each word of the struct name so
that the prefixes stay distinct: <tt>ffv2l_</tt> for <tt>ffv2_layout4</tt>
but <tt>ffv2lu_</tt> for <tt>ffv2_layoutupdate4</tt>, <tt>ffv2lh_</tt> for
<tt>ffv2_layouthint4</tt>, and <tt>ffv2lr_</tt> for <tt>ffv2_layoutreturn4</tt>.
This matters most for <tt>ffv2_layout4</tt> and <tt>ffv2_layoutupdate4</tt>,
which both carry a field named for flags: <tt>ffv2l_flags</tt> is the
<tt>ffv2_flags4</tt> bitmask on the layout, while <tt>ffv2lu_flags</tt> is
the <tt>ffv2_layoutstats_flags4</tt> bitmask on a layout-statistics
report.  The two are different types with different registries,
and an implementation that conflates them will encode the wrong
bitmask.</t>
        <t>Document title and file abbreviation: the front-matter title is
"Parallel NFS (pNFS) Flexible File Layout Version 2" and the
<tt>abbrev</tt> used in the running header is "Flex File Layout v2".
These are document-metadata conventions and do not participate
in the body-prose vocabulary; the running text follows the
forms above, not the front-matter forms.</t>
      </section>
    </section>
    <section anchor="coupling-of-storage-devices">
      <name>Coupling of Storage Devices</name>
      <t>A server implementation may choose either a loosely coupled model or a
tightly coupled model between the metadata server and the storage devices.
<xref target="RFC8434"/> describes the general problems facing pNFS implementations.
This document details how the new flexible file v2 layout addresses
these issues.  To implement the tightly coupled model, a control protocol
has to be defined.  As the flexible file v2 layout imposes no special
requirements on the client, the control protocol will need to provide:</t>
      <ol spacing="normal" type="1"><li>
          <t>management of both security and LAYOUTCOMMITs; and</t>
        </li>
        <li>
          <t>a global stateid model and management of these stateids.</t>
        </li>
      </ol>
      <t>When implementing the loosely coupled model, the only control protocol
will be a version of NFS, with no ability to provide a global stateid
model or to prevent clients from using layouts inappropriately.  To enable
client use in that environment, this document specifies how security,
state, and locking are managed.</t>
      <t>The loosely and tightly coupled locking models defined in <xref section="2.3" sectionFormat="of" target="RFC8435"/> apply equally to this layout type, including the use
of anonymous stateids with loosely coupled storage devices, the
handling of lock and delegation stateids, and the mandatory byte range
lock requirements for the tightly coupled model.</t>
      <section anchor="layoutcommit">
        <name>LAYOUTCOMMIT</name>
        <t>Regardless of the coupling model, the metadata server has the
responsibility, upon receiving a LAYOUTCOMMIT (see <xref section="18.42" sectionFormat="of" target="RFC8881"/>) to ensure that the semantics of pNFS are respected (see
<xref section="3.1" sectionFormat="of" target="RFC8434"/>).  These do include a requirement that data
written to a data storage device be stable before the occurrence of
the LAYOUTCOMMIT.</t>
        <t>It is the responsibility of the client to make sure the data file is
stable before the metadata server begins to query the storage devices
about the changes to the file.  If any WRITE to a storage device did not
result with stable_how equal to FILE_SYNC, a LAYOUTCOMMIT to the metadata
server <bcp14>MUST</bcp14> be preceded by a COMMIT to the storage devices written to.
Note that if the client has not done a COMMIT to the storage device, then
the LAYOUTCOMMIT might not be synchronized to the last WRITE operation
to the storage device.</t>
      </section>
      <section anchor="sec-Fencing-Clients">
        <name>Fencing Clients from the Storage Device</name>
        <t>With loosely coupled storage devices, the metadata server uses synthetic
uids (user ids) and gids (group ids) for the data file, where the uid
owner of the data file is allowed read/write access and the gid owner
is allowed read-only access.  As part of the layout (see ffv2ds_user
and ffv2ds_group in <xref target="sec-ffv2_layout"/>), the client is provided
with the user and group to be used in the Remote Procedure Call
(RPC) <xref target="RFC5531"/> credentials needed to access the data file.
Fencing off of clients is achieved by the metadata server changing
the synthetic uid and/or gid owners of the data file on the storage
device to implicitly revoke the outstanding RPC credentials.  A
client presenting the wrong credential for the desired access will
get an NFS4ERR_ACCESS error.</t>
        <t>With this loosely coupled model, the metadata server is not able to fence
off a single client; it is forced to fence off all clients.  However,
as the other clients react to the fencing, returning their layouts and
trying to get new ones, the metadata server can hand out a new uid and
gid to allow access.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> to implement common access control methods at the
storage device file system to allow only the metadata server root
(super user) access to the storage device and to set the owner of all
directories holding data files to the root user.  This approach provides
a practical model to enforce access control and fence off cooperative
clients, but it cannot protect against malicious clients; hence, it
provides a level of security equivalent to AUTH_SYS.  It is <bcp14>RECOMMENDED</bcp14>
that the communication between the metadata server and storage device
be secure from eavesdroppers and man-in-the-middle protocol tampering.
The security measure could be physical security (e.g., the servers
are co-located in a physically secure area), encrypted communications,
or some other technique.</t>
        <t>With tightly coupled storage devices, the metadata server
and the storage device agree on the authorization decision
for each client access: a client allowed by the metadata
server to read or write a file is allowed the same access
at the storage device, and a client denied at the metadata
server is denied at the storage device.  How the storage
device reaches that decision is not constrained by this
specification.  Some storage devices replicate the user,
group, mode bits, and ACL of the metadata file onto a
POSIX-shaped local representation of the data file and let
their native filesystem enforce the decision; others (such
as storage devices backed by an object store, a
control-protocol-driven backend, or a backend with no
exposed file namespace) consult the control protocol
directly without ever materializing a POSIX file
representation.  Both approaches are conformant; the
specification's requirement is the authorization-outcome
parity, not the mechanism that produces it.</t>
        <t>The client authenticates with the storage device and
receives the same authorization outcome it would have
received via the metadata server.  In the case of tight
coupling, fencing is the responsibility of the control
protocol and is not described in detail in this document.
Implementations of the tightly coupled locking model (see
<xref target="sec-state-locking"/>) will need a way to prevent access by
certain clients to specific files by invalidating the
corresponding stateids on the storage device; in such a
scenario, the client receives NFS4ERR_BAD_STATEID.</t>
        <t>The client need not know the model used between the metadata server and
the storage device.  It need only react consistently to any errors in
interacting with the storage device.  It <bcp14>SHOULD</bcp14> both return the layout
and error to the metadata server and ask for a new layout.  At that point,
the metadata server can either hand out a new layout, hand out no layout
(forcing the I/O through it), or deny the client further access to
the file.</t>
        <section anchor="implementation-notes-for-synthetic-uidsgids">
          <name>Implementation Notes for Synthetic uids/gids</name>
          <t>The selection method for the synthetic uids and gids to be used for
fencing in loosely coupled storage devices is strictly an implementation
issue.  That is, an administrator might restrict a range of such ids
available to the Lightweight Directory Access Protocol (LDAP) 'uid' field
<xref target="RFC4519"/>.  The administrator might also be able to choose an id that
would never be used to grant access.  Then, when the metadata server had
a request to access a file, a SETATTR would be sent to the storage device
to set the owner and group of the data file.  The user and group might
be selected in a round-robin fashion from the range of available ids.</t>
          <t>Those ids would be sent back as ffv2ds_user and ffv2ds_group to the
client, who would present them as the RPC credentials to the storage
device.  When the client is done accessing the file and the metadata
server knows that no other client is accessing the file, it can
reset the owner and group to restrict access to the data file.</t>
          <t>When the metadata server wants to fence off a client, it changes the
synthetic uid and/or gid to the restricted ids.  Note that using a
restricted id ensures that there is a change of owner and at least one
id available that never gets allowed access.</t>
          <t>Under an AUTH_SYS security model, synthetic uids and gids of 0 <bcp14>SHOULD</bcp14> be
avoided.  These typically either grant super access to files on a storage
device or are mapped to an anonymous id.  In the first case, even if the
data file is fenced, the client might still be able to access the file.
In the second case, multiple ids might be mapped to the anonymous ids.</t>
        </section>
        <section anchor="example-of-using-synthetic-uidsgids">
          <name>Example of using Synthetic uids/gids</name>
          <t>The user loghyr creates a file "ompha.c" on the metadata server, which
then creates a corresponding data file on the storage device.</t>
          <t>The metadata server entry may look like:</t>
          <figure anchor="fig-meta-ompha">
            <name>Metadata's view of ompha.c</name>
            <sourcecode type="shell"><![CDATA[
-rw-r--r--    1 loghyr  staff    1697 Dec  4 11:31 ompha.c
]]></sourcecode>
          </figure>
          <t>On the storage device, the file may be assigned some unpredictable
synthetic uid/gid to deny access:</t>
          <figure anchor="fig-data-ompha">
            <name>Data's view of ompha.c</name>
            <sourcecode type="shell"><![CDATA[
-rw-r-----    1 19452   28418    1697 Dec  4 11:31 data_ompha.c
]]></sourcecode>
          </figure>
          <t>When the file is opened on a client and accessed, the user will try to
get a layout for the data file.  Since the layout knows nothing about
the user (and does not care), it does not matter whether the user loghyr
or garbo opens the file.  The client has to present an uid of 19452
to get write permission.  If it presents any other value for the uid,
then it must give a gid of 28418 to get read access.</t>
          <t>Further, if the metadata server decides to fence the file, it <bcp14>SHOULD</bcp14>
change the uid and/or gid such that these values neither match earlier
values for that file nor match a predictable change based on an earlier
fencing.</t>
          <figure anchor="fig-fenced-ompha">
            <name>Fenced Data's view of ompha.c</name>
            <sourcecode type="shell"><![CDATA[
-rw-r-----    1 19453   28419    1697 Dec  4 11:31 data_ompha.c
]]></sourcecode>
          </figure>
          <t>The set of synthetic gids on the storage device <bcp14>SHOULD</bcp14> be selected such
that there is no mapping in any of the name services used by the storage
device, i.e., each group <bcp14>SHOULD</bcp14> have no members.</t>
          <t>If the layout segment has an iomode of LAYOUTIOMODE4_READ, then the
metadata server <bcp14>SHOULD</bcp14> return a synthetic uid that is not set on the
storage device.  Only the synthetic gid would be valid.</t>
          <t>The client is thus solely responsible for enforcing file permissions
in a loosely coupled model.  To allow loghyr write access, it will send
an RPC to the storage device with a credential of 1066:1067.  To allow
garbo read access, it will send an RPC to the storage device with a
credential of 1067:1067.  The value of the uid does not matter as long
as it is not the synthetic uid granted when getting the layout.</t>
          <t>While pushing the enforcement of permission checking onto the client
may seem to weaken security, the client may already be responsible
for enforcing permissions before modifications are sent to a server.
With cached writes, the client is always responsible for tracking who is
modifying a file and making sure to not coalesce requests from multiple
users into one request.</t>
        </section>
      </section>
      <section anchor="sec-state-locking">
        <name>State and Locking Models</name>
        <t>The coupling model in effect for a given metadata-server /
storage-device pair is not negotiated over the NFS protocol.
The metadata server determines the coupling model from
out-of-band signals: administrative configuration, the
choice and capabilities of the control protocol between
the metadata server and the storage device, the storage
device's data-path protocol version, and the storage
device's backend architecture.  At the NFS protocol level,
the metadata server's expectations of the storage device
follow these classifications:</t>
        <ul spacing="normal">
          <li>
            <t>Storage devices implementing the NFSv3 or NFSv4.0
protocols on the data path are treated as loosely
coupled.</t>
          </li>
          <li>
            <t>NFSv4.1+ storage devices that do not return the
EXCHGID4_FLAG_USE_PNFS_DS flag in EXCHANGE_ID indicate
that they are to be treated as loosely coupled.  From
the locking viewpoint, they are treated in the same way
as NFSv4.0 storage devices.</t>
          </li>
          <li>
            <t>NFSv4.1+ storage devices that identify themselves with
the EXCHGID4_FLAG_USE_PNFS_DS flag set in EXCHANGE_ID
can potentially be tightly coupled.  They use a back-end
control protocol to implement the global stateid model
described in <xref target="RFC8881"/>.</t>
          </li>
        </ul>
        <t>Tight coupling additionally requires a control protocol
between the metadata server and the storage device,
discovered or advertised out-of-band as described above.</t>
        <t>Some storage devices cannot operate under the loosely
coupled model at all.  The loose coupling model in this
specification relies on the storage device authorizing
client access against synthetic uid and gid values
(<xref target="sec-Fencing-Clients"/>), which presupposes that the data
file has a local representation on the storage device
against which POSIX-style ownership checks can be applied.
Storage devices whose backend has no exposed file namespace
-- for example, object-store-backed data servers, or data
servers driven entirely through a control protocol against
a non-POSIX backend -- do not have that local representation
and <bcp14>MUST</bcp14> operate in the tightly coupled model with a
control protocol that conveys the authorization decision
directly.  A metadata server deploying with such a storage
device cannot fall back to loose coupling.</t>
        <section anchor="loosely-coupled-locking-model">
          <name>Loosely Coupled Locking Model</name>
          <t>When locking-related operations are requested, they are primarily dealt
with by the metadata server, which generates the appropriate stateids.
When an NFSv4 version is used as the data access protocol, the metadata
server may make stateid-related requests of the storage devices.  However,
it is not required to do so, and the resulting stateids are known only
to the metadata server and the storage device.</t>
          <t>Given this basic structure, locking-related operations are handled
as follows:</t>
          <ul spacing="normal">
            <li>
              <t>OPENs are dealt with by the metadata server.  Stateids are
selected by the metadata server and associated with the client
ID describing the client's connection to the metadata server.
The metadata server may need to interact with the storage device to
locate the file to be opened, but no locking-related functionality
need be used on the storage device.</t>
            </li>
            <li>
              <t>OPEN_DOWNGRADE and CLOSE only require local execution on the
metadata server.</t>
            </li>
            <li>
              <t>Advisory byte range locks can be implemented locally on the
metadata server.  As in the case of OPENs, the stateids associated
with byte range locks are assigned by the metadata server and only
used on the metadata server.</t>
            </li>
            <li>
              <t>Delegations are assigned by the metadata server that initiates
recalls when conflicting OPENs are processed.  No storage device
involvement is required.</t>
            </li>
            <li>
              <t>TEST_STATEID and FREE_STATEID are processed locally on the
metadata server, without storage device involvement.</t>
            </li>
          </ul>
          <t>All I/O operations to the storage device are done using the anonymous
stateid.  Thus, the storage device has no information about the openowner
and lockowner responsible for issuing a particular I/O operation.
As a result:</t>
          <ul spacing="normal">
            <li>
              <t>Mandatory byte range locking cannot be supported because the
storage device has no way of distinguishing I/O done on behalf of
the lock owner from those done by others.</t>
            </li>
            <li>
              <t>Enforcement of share reservations is the responsibility of the
client.  Even though I/O is done using the anonymous stateid, the
client <bcp14>MUST</bcp14> ensure that it has a valid stateid associated with the
openowner.</t>
            </li>
          </ul>
          <t>In the event that a stateid is revoked, the metadata server is responsible
for preventing client access, since it has no way of being sure that
the client is aware that the stateid in question has been revoked.</t>
          <t>As the client never receives a stateid generated by a storage device,
there is no client lease on the storage device and no prospect of lease
expiration, even when access is via NFSv4 protocols.  Clients will
have leases on the metadata server.  In dealing with lease expiration,
the metadata server may need to use fencing to prevent revoked stateids
from being relied upon by a client unaware of the fact that they have
been revoked.</t>
        </section>
        <section anchor="tightly-coupled-locking-model">
          <name>Tightly Coupled Locking Model</name>
          <t>When locking-related operations are requested, they are primarily dealt
with by the metadata server, which generates the appropriate stateids.
These stateids <bcp14>MUST</bcp14> be made known to the storage device using control
protocol facilities.  This document defines one such control protocol
-- the TRUST_STATEID, REVOKE_STATEID, and BULK_REVOKE_STATEID
operations in <xref target="sec-tight-coupling-control"/> -- for deployments in
which the storage devices are NFSv4.2 servers willing to implement
the new operations.  A storage device with its own established
back-end control protocol that provides the equivalent functional
capabilities is conformant under this specification without
implementing the TRUST_STATEID family; see
<xref target="sec-tight-coupling-control"/> for the conformance framing.</t>
          <t>When using the TRUST_STATEID control protocol defined in
<xref target="sec-tight-coupling-control"/>, the metadata server and a storage
device establish that they can use it via a two-part handshake,
both parts of which <bcp14>MUST</bcp14> succeed before the metadata server may
issue TRUST_STATEID against that storage device for production
traffic:</t>
          <dl>
            <dt>Capability probe:</dt>
            <dd>
              <t>At control-session setup the metadata
server sends a TRUST_STATEID against the anonymous stateid
(see <xref target="sec-tight-coupling-probe"/>).  A storage device that
supports tight coupling <bcp14>MUST</bcp14> reject the probe with
NFS4ERR_INVAL; a storage device that does not support tight
coupling returns NFS4ERR_NOTSUPP and the metadata server
falls back to loose coupling.  The metadata server records
result per storage device by setting the
FFV2_COUPLING_TRUSTED_STATEID bit in ffv2dv_coupling on
success (leaving the bit clear on NFS4ERR_NOTSUPP).</t>
            </dd>
            <dt>Control-session gating:</dt>
            <dd>
              <t>The metadata server presents
EXCHGID4_FLAG_USE_PNFS_MDS at EXCHANGE_ID when it opens the
control session to the storage device
(see <xref target="sec-tight-coupling-control-session"/>).  The storage
device <bcp14>MUST</bcp14> reject any incoming TRUST_STATEID,
REVOKE_STATEID, or BULK_REVOKE_STATEID that does not arrive
on such a session with NFS4ERR_PERM.  This is the
authorization mechanism that distinguishes the metadata
server from ordinary pNFS clients, which connect with
EXCHGID4_FLAG_USE_PNFS_DS or EXCHGID4_FLAG_USE_NON_PNFS and
are therefore structurally unable to invoke these operations.</t>
            </dd>
          </dl>
          <t>Given this basic structure, locking-related operations are handled
as follows:</t>
          <ul spacing="normal">
            <li>
              <t>OPENs are dealt with primarily on the metadata server.  Stateids
are selected by the metadata server and associated with the client
ID describing the client's connection to the metadata server.
The metadata server needs to interact with the storage device to
locate the file to be opened and to make the storage device aware of
the association between the metadata-server-chosen stateid and the
client and openowner that it represents.  OPEN_DOWNGRADE and CLOSE
are executed initially on the metadata server, but the state change
<bcp14>MUST</bcp14> be propagated to the storage device.</t>
            </li>
            <li>
              <t>Advisory byte range locks can be implemented locally on the
metadata server.  As in the case of OPENs, the stateids associated
with byte range locks are assigned by the metadata server and are
available for use on the metadata server.  Because I/O operations
are allowed to present lock stateids, the metadata server needs the
ability to make the storage device aware of the association between
the metadata-server-chosen stateid and the corresponding open stateid
it is associated with.</t>
            </li>
            <li>
              <t>Mandatory byte range locks can be supported when both the metadata
server and the storage devices have the appropriate support.  As in
the case of advisory byte range locks, these are assigned by the
metadata server and are available for use on the metadata server.
To enable mandatory lock enforcement on the storage device, the
metadata server needs the ability to make the storage device aware
of the association between the metadata-server-chosen stateid and
the client, openowner, and lock (i.e., lockowner, byte range, and
lock-type) that it represents.  Because I/O operations are allowed
to present lock stateids, this information needs to be propagated to
all storage devices to which I/O might be directed rather than only
to storage device that contain the locked region.</t>
            </li>
            <li>
              <t>Delegations are assigned by the metadata server that initiates
recalls when conflicting OPENs are processed.  Because I/O operations
are allowed to present delegation stateids, the metadata server
requires the ability:  </t>
              <ol spacing="normal" type="1"><li>
                  <t>to make the storage device aware of the association between
the metadata-server-chosen stateid and the filehandle and
delegation type it represents</t>
                </li>
                <li>
                  <t>to break such an association.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>TEST_STATEID is processed locally on the metadata server, without
storage device involvement.</t>
            </li>
            <li>
              <t>FREE_STATEID is processed on the metadata server, but the metadata
server requires the ability to propagate the request to the
corresponding storage devices.</t>
            </li>
          </ul>
          <t>Scope of this document.  The wire-level control-protocol
operations this document defines -- TRUST_STATEID,
REVOKE_STATEID, and BULK_REVOKE_STATEID
(<xref target="sec-tight-coupling-control"/>) -- carry only the association
between a layout stateid, the ffv2m_client_id the metadata
server assigned to the client, and (for TRUST_STATEID) the
iomode, expiry, and principal.  They do NOT carry openowner,
lockowner, byte range, lock-type, the identity of an
associated open stateid, or delegation-type.</t>
          <t>The bullets above (OPEN state, advisory byte range lock state,
mandatory byte range lock state, and delegation state)
enumerate the associations the storage device would need in
order to enforce POSIX-conformant OPEN, byte range locking,
and delegation semantics against per-client identity rather
than against the loose coupling synthetic uid/gid.  These are
inherited from the general tight coupling locking model in
<xref section="2.3" sectionFormat="of" target="RFC8435"/>.  Trusted-stateid tight coupling as
defined by this document satisfies these associations only
for the layout stateid; a deployment that requires mandatory
byte range locking, delegation recall, or the finer-grained
open/lock stateid associations <bcp14>MUST</bcp14> use a back-end control
protocol between the metadata server and the storage device
that carries this state.  Such a back-end control protocol is
out of scope for this document.</t>
          <t>A deployment that does not need those finer-grained
associations -- for example, a flexible file v2 layout
deployment whose per-file access-control decisions live entirely
on the metadata server
and whose storage devices see only chunk-level CAS on layout
stateids -- is conformant with the trusted stateid tight coupling
model using only the TRUST_STATEID family.  That
scope covers the layout stateid and, transitively via
ffv2m_client_id, the writer identity carried on CHUNK
operations.</t>
          <t>Because the client will possess and use stateids valid on the storage
device, there will be a client lease on the storage device, and the
possibility of lease expiration does exist.  The best approach for the
storage device is to retain these locks as a courtesy.  However, if it
does not do so, control protocol facilities need to provide the means
to synchronize lock state between the metadata server and storage device.</t>
          <t>Clients will also have leases on the metadata server that are subject
to expiration.  In dealing with lease expiration, the metadata server
would be expected to use control protocol facilities enabling it to
invalidate revoked stateids on the storage device.  In the event the
client is not responsive, the metadata server may need to use fencing
to prevent revoked stateids from being acted upon by the storage device.</t>
        </section>
      </section>
      <section anchor="sec-tight-coupling-control">
        <name>Tight Coupling Control Protocol</name>
        <t>When an NFSv4.2 storage device participates in a tightly coupled
deployment, the metadata server and the storage devices need a
control protocol that:</t>
        <ol spacing="normal" type="1"><li>
            <t>registers the layout stateid with each storage device so the
storage device can validate client I/O independently; and</t>
          </li>
          <li>
            <t>revokes trust promptly when the metadata server withdraws the
client's authorization -- for example, on CB_LAYOUTRECALL
timeout, lease expiry, or layout return after error.</t>
          </li>
        </ol>
        <t>This specification defines one such control protocol, designated
trusted stateid tight coupling, as three new NFSv4.2 operations:
TRUST_STATEID, REVOKE_STATEID, and BULK_REVOKE_STATEID.  These operations are sent by the
metadata server to each storage device over a dedicated control
session (see <xref target="sec-tight-coupling-control-session"/>) and <bcp14>MUST NOT</bcp14>
be sent by pNFS clients.</t>
        <t>Other tight coupling control protocols may exist or be defined
elsewhere.  Existing pNFS server implementations with established
back-end control protocols -- for example, dCache <xref target="DCACHE"/>,
which has its own control protocol between its metadata
service and its data servers -- satisfy the tightly coupled
locking model
(<xref target="sec-state-locking"/>) through their own mechanisms and are
conformant under this specification provided they meet the
functional capabilities described there.  Such implementations
need not adopt the TRUST_STATEID family, and their interoperability
with the TRUST_STATEID family is outside the scope of this
document.</t>
        <t>A storage device that does not implement TRUST_STATEID is treated
as not supporting trusted stateid tight coupling specifically; the
capability probe in <xref target="sec-tight-coupling-probe"/> detects this and
the metadata server falls back to loose coupling
(<xref target="sec-tight-coupling-compat"/>) or, if the storage device's own
control protocol is in use, that protocol governs.  Within the
remainder of <xref target="sec-tight-coupling-control"/> and its subsections,
unqualified references to "tight coupling" or "tightly coupled"
refer to the trusted stateid variant defined here.</t>
        <t>The receiver of these operations is any server the metadata
server delegates client-I/O admission to.  In this document that
is the storage device (data server).  The same mechanism applies to
a proxy server -- a proxy server may or may not additionally act
as a data server, but in either role it needs the metadata server
to register a layout stateid before it can admit client I/O.
Where this section says "storage device," read it as "storage
device, or proxy server"; the flag check and the three operations
are identical for both roles.</t>
        <section anchor="sec-tight-coupling-probe">
          <name>Capability Discovery</name>
          <t>A storage device indicates support for trusted stateid tight
coupling implicitly, by processing TRUST_STATEID rather than
returning NFS4ERR_NOTSUPP.  (A storage device that supports a
non-TRUST_STATEID form of tight coupling but not the
trusted stateid variant defined here will return NFS4ERR_NOTSUPP
on this probe; from this specification's perspective it is
treated the same as a storage device that does not support tight
coupling at all.)  The metadata server probes each storage device
during control-session setup:</t>
          <figure anchor="fig-trust-stateid-probe">
            <name>TRUST_STATEID capability probe</name>
            <artwork><![CDATA[
SEQUENCE + PUTROOTFH + TRUST_STATEID(
    tsa_layout_stateid = ANONYMOUS_STATEID,
    tsa_client_id      = 0,
    tsa_iomode         = LAYOUTIOMODE4_READ,
    tsa_expire         = 0,
    tsa_principal      = "")
]]></artwork>
          </figure>
          <t>The anonymous stateid is used deliberately: a correctly implemented
storage device <bcp14>MUST</bcp14> reject it (see <xref target="sec-TRUST_STATEID"/>), so the
probe cannot accidentally register garbage in the trust table.  The
metadata server interprets the probe response as follows:</t>
          <dl>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>trusted stateid tight coupling is not supported on this
storage device.  The metadata server leaves the
FFV2_COUPLING_TRUSTED_STATEID bit clear in ffv2dv_coupling
for this storage device.  If ffv2dv_coupling has no other
tight coupling bits set for this storage device, the
metadata server falls back to the synthetic-uid model
(anonymous stateid plus fencing).</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>trusted stateid tight coupling is supported.  The anonymous
stateid was correctly rejected.  The metadata server sets the
FFV2_COUPLING_TRUSTED_STATEID bit in ffv2dv_coupling for this
storage device.</t>
            </dd>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the storage device accepted an anonymous stateid into
its trust table.  This is a storage device bug.  The metadata
server <bcp14>MAY</bcp14> treat the capability as confirmed to avoid
downgrading to loose coupling, but it <bcp14>MUST</bcp14> immediately issue
REVOKE_STATEID to remove the bogus entry.</t>
            </dd>
          </dl>
          <t>The capability is recorded per storage device, not per file.
Partial support across a mirror set is permitted: each
ffv2_device_versions4 entry returned by GETDEVICEINFO carries
its own ffv2dv_coupling value, set independently.</t>
        </section>
        <section anchor="sec-tight-coupling-control-session">
          <name>Control Session</name>
          <t>The metadata server establishes an NFSv4.2 session to each
tight coupling capable storage device at startup.  On this session
the metadata server acts as the storage device's client and
presents EXCHGID4_FLAG_USE_PNFS_MDS in its EXCHANGE_ID args.</t>
          <t>That is a repurposing of the flag, and implementers should
understand it as one.  <xref section="13.1" sectionFormat="of" target="RFC8881"/> determines a
server's pNFS role from the eir_flags it returns, not from what
the client asks for, and treats the argument flags as role
requests; read literally, EXCHGID4_FLAG_USE_PNFS_MDS in the args
asks the peer to act as this client's metadata server, which is
not what a metadata server wants from a storage device.  The flag
is used here precisely because it carries no other meaning on this
path.  <xref section="13.1" sectionFormat="of" target="RFC8881"/> does name a flag for a client
connecting to a data server, EXCHGID4_FLAG_USE_PNFS_DS, but a pNFS
client presents that one too, so it cannot separate a metadata
server from a client.  EXCHGID4_FLAG_USE_PNFS_MDS is the one role
request a client has no reason to make of a storage device, and
that is what leaves it free to mark the control session.</t>
          <t>Presenting it does not conflict with <xref target="RFC8881"/>.
<xref section="13.1" sectionFormat="of" target="RFC8881"/> permits a client to request zero or
more of the three role flags even where the combination requested
is contradictory, and constrains only the combinations a server
may return in its eir_flags.  A storage device that also serves a
metadata server role, and that selects among its roles from the
requested ones, should account for this document's use of the flag
when composing its eir_flags.</t>
          <t>The storage device <bcp14>MUST</bcp14> verify that any incoming TRUST_STATEID,
REVOKE_STATEID, or BULK_REVOKE_STATEID compound arrives on a
session whose owning client presented EXCHGID4_FLAG_USE_PNFS_MDS
in its EXCHANGE_ID args.  Requests that arrive on any other
session <bcp14>MUST</bcp14> be rejected with NFS4ERR_PERM.  This is the sole
access control on these operations; a pNFS client connecting to
the storage device does not present EXCHGID4_FLAG_USE_PNFS_MDS
and therefore cannot invoke them.</t>
          <t>The EXCHGID4_FLAG_USE_PNFS_MDS check replaces any path- or
filehandle-level gating.  TRUST_STATEID operates on a filehandle
that may be any file on the storage device, and the metadata
server is the sole authority that can legitimately speak this
protocol.</t>
          <t>Because the EXCHGID4_FLAG_USE_PNFS_MDS check relies on the
owning client's self-declaration at EXCHANGE_ID time, the
storage device cannot by itself distinguish a legitimate
metadata server from any other host that sets the flag.  The
wire protocol provides no primitive that binds a request to a
particular pNFS role; the flag is a hint whose operational
meaning is only as strong as the deployment's authentication
or isolation choice.</t>
          <t>The deployment requirement is that only entities the
deployment considers legitimate metadata servers can (a)
establish a control session with EXCHGID4_FLAG_USE_PNFS_MDS
against the storage device and (b) invoke TRUST_STATEID,
REVOKE_STATEID, or BULK_REVOKE_STATEID on it.  Deployments
have historically satisfied this requirement using one or more
of the following mechanisms; the wire protocol does not
prescribe which is chosen:</t>
          <ul spacing="normal">
            <li>
              <t>RPCSEC_GSS with a machine principal that the storage device
has been configured to accept as a metadata server.  The
storage device validates the principal against a local
policy list before accepting the flag.</t>
            </li>
            <li>
              <t>TLS (<xref target="RFC9289"/>) with a client certificate that the storage
device has been configured to accept as a metadata server.
The storage device validates the certificate against a local
policy list before accepting the flag.</t>
            </li>
            <li>
              <t>Network-path isolation: the control-session path runs on a
network segment (dedicated management VLAN, private link,
or similar) that pNFS clients cannot reach, so only
configured metadata servers can open a session at all.</t>
            </li>
            <li>
              <t>Operating-system-level filesystem access control on the
storage device: the underlying export that backs the pNFS
data files is configured so that only the metadata server's
OS identity (typically root, or a dedicated privileged uid)
can access it.  A pNFS client that reaches the storage
device but presents any other uid receives permission
errors before it can invoke any operation, control-plane
or otherwise.</t>
            </li>
          </ul>
          <t>A single host <bcp14>MAY</bcp14> legitimately act in multiple pNFS roles
against the same storage device -- for example, an entity
that is a metadata server for one export and a plain pNFS
client for another.  The wire protocol does not distinguish
these roles at the operation level; the deployment is
responsible for arranging that the storage device can tell
them apart, typically by using distinct credentials or
distinct sessions for the two roles (each session presents
EXCHGID4_FLAG_USE_PNFS_MDS according to the role the entity
is acting in on that session).</t>
          <t>The security consequences of these choices -- what an
unauthenticated attacker can invoke if none of the mechanisms
above is deployed, and what an authenticated caller can still
achieve by misrepresenting role -- are discussed in
<xref target="sec-security-trust-stateid"/>.</t>
        </section>
        <section anchor="sec-tight-coupling-layoutget">
          <name>Flow at LAYOUTGET</name>
          <t>For each new or refreshed layout segment, the metadata server:</t>
          <ol spacing="normal" type="1"><li>
              <t>chooses the layout stateid (as it would without tight coupling);</t>
            </li>
            <li>
              <t>identifies the trusted stateid capable storage devices in
the mirror set (those for which ffv2dv_coupling has the
FFV2_COUPLING_TRUSTED_STATEID flag set);</t>
            </li>
            <li>
              <t>fans out TRUST_STATEID to each such storage device,
specifying the layout stateid, the layout iomode, a
tsa_expire derived from the metadata server's lease (see
<xref target="sec-tight-coupling-lease"/>), and the client's authenticated
identity in tsa_principal;</t>
            </li>
            <li>
              <t>waits for all fan-outs to complete (or reach their per-storage-device timeout) before returning the layout.</t>
            </li>
          </ol>
          <t>If every storage device in the mirror set rejects the TRUST_STATEID
fan-out, the metadata server <bcp14>MUST NOT</bcp14> return the layout; instead it
returns NFS4ERR_LAYOUTTRYLATER.  If some storage devices accept and
others reject, the metadata server <bcp14>MAY</bcp14> return a layout covering
only the accepting storage devices, provided the accepting subset
still meets the minimum servable coverage for the file's
encoding: at least one replica for FFV2_ENCODING_PASSTHROUGH or
FFV2_ENCODING_REPLICATED, or at least k of the k + m storage
devices for an erasure-coded encoding at (k, m) parameters.
If it does not, the metadata server <bcp14>MUST NOT</bcp14> return a partial
layout and instead returns NFS4ERR_LAYOUTTRYLATER as in the
all-reject case.  A storage device that returns
NFS4ERR_DELAY is retried until either success or the metadata
server's LAYOUTGET-response budget is exhausted.  If a storage
device returns NFS4ERR_NOTSUPP at this time (having accepted
the probe earlier), the metadata server <bcp14>MUST</bcp14> clear the
FFV2_COUPLING_TRUSTED_STATEID flag in ffv2dv_coupling for this
storage device.  If no tight coupling flags remain set for
this device, the metadata server falls back to the
synthetic-uid model and re-issues the layout accordingly.</t>
        </section>
        <section anchor="sec-tight-coupling-principal">
          <name>Principal Binding and the Kerberos Gap</name>
          <t>The flexible file v1 layout has a known gap: a client authenticated
to the metadata server with Kerberos has no way to present the same
authenticated identity to the storage device, because flexible file
v1 layouts carry only ffds_user / ffds_group (POSIX uid/gid for
AUTH_SYS).  A strict Kerberos deployment on the flexible file v1
layout must either allow AUTH_SYS from the metadata server's subnet
or accept that the flexible file v1 layout's data path is not
Kerberos-protected.</t>
          <t>The tsa_principal field in TRUST_STATEID closes that gap.  When a
client authenticates to the metadata server as a Kerberos
principal (e.g., alice@REALM), the metadata server passes that
principal name to each storage device in tsa_principal.  The
storage device then enforces a two-part check on each CHUNK
operation that presents the layout stateid:</t>
          <t>a.  the stateid is in the trust table and has not expired; and</t>
          <t>b.  the caller's authenticated identity (the RPCSEC_GSS display
    name on the CHUNK compound) matches tsa_principal.</t>
          <t>Both conditions <bcp14>MUST</bcp14> hold.  On principal mismatch the storage
device <bcp14>MUST</bcp14> return NFS4ERR_ACCESS -- the semantics are "you do
not have an authorized layout for this file", which matches the
existing fencing error and avoids the confusion of
NFS4ERR_WRONGSEC (which directs the client to re-authenticate
with a different flavor) or NFS4ERR_BAD_STATEID (which directs
the client to return the layout).</t>
          <t>The metadata server <bcp14>MUST</bcp14> populate tsa_principal with the
RPCSEC_GSS display name of the authenticated client when the
client authenticated to the metadata server via RPCSEC_GSS.  The
metadata server <bcp14>MUST</bcp14> set tsa_principal to the empty string only
for AUTH_SYS and TLS clients (for which there is no server-verified per-user identity).  Setting tsa_principal to the empty
string for an RPCSEC_GSS client disables the principal check on
the storage device and silently re-opens the flexible file v1 layout
Kerberos gap; it is a metadata server bug, not a protocol option.</t>
          <t>If tsa_principal is the empty string, no principal check applies.
This is the expected setting for AUTH_SYS and TLS clients:</t>
          <ul spacing="normal">
            <li>
              <t>AUTH_SYS clients have no server-verified identity.  The
storage device's stateid check and the AUTH_SYS uid/gid on the
data file together constitute the authorization.  In a tightly
coupled deployment the data file's owner/group need not match
the metadata file's, since ffv2ds_user and ffv2ds_group are
ignored (see <xref target="sec-ffv2-mirror4"/>).</t>
            </li>
            <li>
              <t>TLS clients have transport-layer authentication via mutual TLS
(<xref target="RFC9289"/>).  The TLS layer authenticates the client machine;
the stateid check confirms the metadata server authorized that
machine to access this file.  The machine-level authentication
is handled beneath the RPC layer and is not reflected in
tsa_principal.  Opportunistic TLS (STARTTLS without certificate
verification) provides encryption but not authentication, and
therefore has the same authorization properties as plain
AUTH_SYS.</t>
            </li>
          </ul>
          <t>When a client's I/O is routed through a proxy server -- that
is, the layout the metadata server returns to the client has
FFV2_DS_FLAGS_PROXY set on the proxy's ffv2_data_server4 entry --
the storage device observes CHUNK operations arriving from the
proxy server's address rather than from the client directly.  The tsa_principal the metadata server
populates in TRUST_STATEID is the principal the storage device
will observe on those CHUNK operations, and <xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>'s credential-forwarding rules (in particular rule 1,
"Credential pass-through") require the proxy server to forward the
client's credentials verbatim on every CHUNK operation it issues
on the client's behalf.  Therefore:</t>
          <ul spacing="normal">
            <li>
              <t>For an RPCSEC_GSS client whose I/O is proxied through a proxy server,
the metadata server <bcp14>MUST</bcp14> set tsa_principal to the client's
RPCSEC_GSS display name (identical to the non-proxied case).
The storage device's principal check on CHUNK operations will
match against the client's principal on the forwarded
compound, not the proxy server's service identity.</t>
            </li>
            <li>
              <t>For an AUTH_SYS client whose I/O is proxied through a proxy server,
the metadata server <bcp14>MUST</bcp14> set tsa_principal to the empty
string (identical to the non-proxied case).  The proxy server forwards
the client's AUTH_SYS uid/gid; the storage device's stateid
check plus the forwarded AUTH_SYS uid/gid constitute the
authorization.</t>
            </li>
          </ul>
          <t>The metadata server <bcp14>MUST NOT</bcp14> set tsa_principal to the proxy server's own
service principal.  Doing so would require the proxy server to
authenticate to the storage device as itself (bypassing
credential forwarding) which is explicitly prohibited by rule 4 of <xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/> ("proxy server service identity is for the
control plane only").</t>
        </section>
        <section anchor="sec-tight-coupling-trust-gap">
          <name>Client-Detected Trust Gap</name>
          <t>A window exists between a successful TRUST_STATEID fan-out and
the client's first I/O to the storage device.  A transient failure
may cause the storage device to forget or reject the entry before
the client's first CHUNK_WRITE arrives.  The client cannot
distinguish this case from legitimate revocation; both surface as
NFS4ERR_BAD_STATEID on the storage device.</t>
          <t>The recovery path:</t>
          <ol spacing="normal" type="1"><li>
              <t>The client sends LAYOUTERROR(layout_stateid, device_id,
NFS4ERR_BAD_STATEID) to the metadata server.</t>
            </li>
            <li>
              <t>The metadata server retries TRUST_STATEID against the
reporting storage device.  If the retry succeeds, the
metadata server returns NFS4_OK for LAYOUTERROR.  The client
retries the original I/O.</t>
            </li>
            <li>
              <t>If the retry fails -- the storage device is unreachable or
returns a hard error -- the metadata server issues
CB_LAYOUTRECALL for that device and the client returns the
layout segment covering that storage device.  The client is
expected to re-request via LAYOUTGET.</t>
            </li>
          </ol>
          <t>This is the same LAYOUTERROR path used for NFS4ERR_ACCESS or
NFS4ERR_PERM in the fencing model (see <xref target="sec-Fencing-Clients"/>),
with the metadata server's action being "retry TRUST_STATEID"
instead of "rotate uid/gid".</t>
        </section>
        <section anchor="sec-tight-coupling-lease">
          <name>Lease and Renewal</name>
          <t>tsa_expire in a TRUST_STATEID request is a wall-clock expiry
instant expressed as an nfstime4.  The metadata server <bcp14>MUST</bcp14> set
tsa_expire to the current wall-clock time plus the metadata
server's client lease period.</t>
          <t>Clock-synchronization assumption: the metadata server and each
storage device <bcp14>MUST</bcp14> maintain wall-clock synchronization within
one lease period, e.g., via NTP <xref target="RFC5905"/> or an equivalent
mechanism.  Under this assumption, a tsa_expire computed by the
metadata server and evaluated by the storage device is
interpreted consistently within the storage device's local
clock.  Deployments unable to guarantee sub-lease-period clock
synchronization <bcp14>MUST</bcp14> either (a) shorten the effective TRUST_STATEID
lease so it exceeds the worst-case skew by at least 2x, or (b)
route I/O through the metadata server as the fallback path (no
tight coupling control session, no TRUST_STATEID) so lease
enforcement stays on the metadata server's clock alone.  A storage device that
detects sustained clock divergence from the metadata server
(e.g., via periodic wall-clock exchange as part of its
tight coupling control-session heartbeats) <bcp14>SHOULD</bcp14> log the
divergence and <bcp14>MAY</bcp14> refuse further TRUST_STATEID entries with
NFS4ERR_DELAY until the divergence is corrected.</t>
          <t>The metadata server <bcp14>MUST</bcp14> re-issue TRUST_STATEID for an entry
before tsa_expire while the corresponding layout is outstanding.
The <bcp14>RECOMMENDED</bcp14> trigger is: when an entry is within half the
lease period of its tsa_expire, re-issue TRUST_STATEID with a
refreshed tsa_expire.  Renewing on every SEQUENCE that keeps the
layout stateid alive is correct but produces
metadata-server-to-storage-device traffic proportional to the
client's SEQUENCE rate, which is undesirable in steady state.</t>
          <t>If an entry expires on the storage device before the metadata
server renews it -- for example, because the metadata server is
partitioned from the storage device for longer than the lease
period -- the storage device <bcp14>MUST</bcp14> return NFS4ERR_BAD_STATEID to
the client on the next CHUNK operation.  The client returns the
layout to the metadata server and re-requests.  This is the same
recovery path as the trust gap described above.</t>
        </section>
        <section anchor="sec-tight-coupling-ds-crash">
          <name>Storage Device Crash Recovery</name>
          <t>A storage device <bcp14>MAY</bcp14> persist its trust table across restarts.  An
implementation that does so <bcp14>MUST</bcp14> also persist its server-instance
identity, returning the same eir_server_owner.so_minor_id on
EXCHANGE_ID after the restart (per <xref section="18.35" sectionFormat="of" target="RFC8881"/>), so that
clients and the metadata server observe the device as
continuously available and the persisted trust entries remain
valid against the layout stateids that were issued before the
restart.</t>
          <t>A storage device that does NOT persist its trust table empties
the table on restart and <bcp14>MUST</bcp14> present a new server instance
(incremented so_minor_id) so that clients detect the restart.
The remainder of this section describes the recovery path for
the volatile case.</t>
          <t>The client detects a volatile storage device restart via
NFS4ERR_BADSESSION or NFS4ERR_STALE_CLIENTID on its data server
session.  The client returns the affected layout segment to the
metadata server via LAYOUTRETURN and re-requests via LAYOUTGET.
The metadata server then fans out fresh TRUST_STATEID operations
to the recovered storage device.</t>
          <t>Planned storage device restarts (software upgrade, etc.) <bcp14>SHOULD</bcp14>
drain in-flight CHUNK operations before shutting down.</t>
        </section>
        <section anchor="sec-tight-coupling-mds-crash">
          <name>Metadata Server Crash Recovery</name>
          <t>A metadata server <bcp14>MAY</bcp14> persist all its trust-management state
across restarts.  An implementation that does so <bcp14>MUST</bcp14> also
persist its server-instance identity, returning the same
eir_server_owner.so_minor_id on EXCHANGE_ID after the restart
(per <xref section="18.35" sectionFormat="of" target="RFC8881"/>), so that storage devices observe the
metadata server as continuously available and accept incoming
TRUST_STATEID and REVOKE_STATEID operations against the existing
trust entries without revalidation.  No grace period is required.</t>
          <t>A metadata server that presents a new server instance
(incremented so_minor_id) on restart follows the recovery path
in the remainder of this section.</t>
          <t>When the metadata server restarts as a new instance, its control
sessions to the storage devices are lost.  Trust entries remain
on the storage devices until tsa_expire, but the metadata server
is no longer renewing them; the entries are effectively orphaned
until the metadata server completes grace.</t>
          <t>When the metadata server reconnects to a storage device with a
new boot epoch -- that is, the EXCHANGE_ID returns a new server
owner on the storage device's view of the metadata server -- the
storage device <bcp14>SHOULD</bcp14> mark all trust entries established under
the prior metadata-server epoch as pending-revalidation.  While an
entry is pending-revalidation:</t>
          <ul spacing="normal">
            <li>
              <t>I/O that presents the entry's stateid <bcp14>MUST</bcp14> receive
NFS4ERR_DELAY, not NFS4ERR_BAD_STATEID.  NFS4ERR_DELAY tells
the client to retry with the same stateid -- the metadata
server is recovering and may yet revalidate the entry.
NFS4ERR_BAD_STATEID would instead cause the client to return
the layout immediately, producing a thundering herd against
the metadata server during grace.</t>
            </li>
            <li>
              <t>An entry remains pending-revalidation until the metadata
server either re-issues TRUST_STATEID for it (which transitions
it back to trusted) or until the entry's tsa_expire elapses
(which removes it).</t>
            </li>
          </ul>
          <t>The metadata server's recovery sequence is:</t>
          <ol spacing="normal" type="1"><li>
              <t>Reconnect to each storage device and establish a fresh
control session.</t>
            </li>
            <li>
              <t>Optionally issue BULK_REVOKE_STATEID with an all-zeros
clientid to each storage device.  This clears the prior trust
table eagerly; skipping this step is correct, because orphan
entries expire via tsa_expire.</t>
            </li>
            <li>
              <t>Enter grace and accept RECLAIM operations from clients.  For
each reclaimed layout, fan out TRUST_STATEID to the relevant
storage devices.</t>
            </li>
            <li>
              <t>Exit grace.  Clients that did not reclaim in time have their
state revoked; the metadata server issues REVOKE_STATEID or
BULK_REVOKE_STATEID on their behalf.</t>
            </li>
          </ol>
          <t>Metadata servers <bcp14>SHOULD</bcp14> persist the set of outstanding
TRUST_STATEID entries (clientid, layout stateid, storage device
address, tsa_expire) to stable storage.  With this persistence
the metadata server can re-issue TRUST_STATEID for all known
entries immediately upon reconnecting to each storage device,
before clients begin reclaiming.  This shrinks the window during
which the storage device returns NFS4ERR_DELAY for client I/O.
Persistence is a latency optimization, not a correctness
requirement: the re-layout path handles recovery in all cases.</t>
        </section>
        <section anchor="sec-tight-coupling-compat">
          <name>Backward Compatibility</name>
          <ul spacing="normal">
            <li>
              <t>NFSv3 storage devices are unchanged.  They are always treated
as loosely coupled; TRUST_STATEID does not exist on NFSv3
servers.</t>
            </li>
            <li>
              <t>NFSv4.2 storage devices for which the TRUST_STATEID probe
returns NFS4ERR_NOTSUPP are treated as loosely coupled;
fencing is the only revocation mechanism, the same as for
NFSv3.</t>
            </li>
            <li>
              <t>NFSv4.2 storage devices for which the probe returns
NFS4ERR_INVAL support tight coupling; the metadata server uses
TRUST_STATEID at LAYOUTGET and REVOKE_STATEID or
BULK_REVOKE_STATEID for revocation instead of fencing.</t>
            </li>
          </ul>
          <t>A single deployment <bcp14>MAY</bcp14> contain a mix of tight-coupled and
loose-coupled storage devices; each is negotiated independently
via the probe.</t>
        </section>
      </section>
    </section>
    <section anchor="device-addressing-and-discovery">
      <name>Device Addressing and Discovery</name>
      <t>Data operations to a storage device require the client to know the
network address of the storage device.  The NFSv4.1+ GETDEVICEINFO
operation (<xref section="18.40" sectionFormat="of" target="RFC8881"/>) is used by the client to
retrieve that information.</t>
      <section anchor="sec-ff_device_addr4">
        <name>ffv2_device_addr4</name>
        <t>The ffv2_device_addr4 data structure (see <xref target="fig-ff_device_addr4"/>)
is returned by the server as the layout type specific opaque field
da_addr_body in the device_addr4 structure by a successful GETDEVICEINFO
operation for LAYOUT_FLEX_FILES_V2.</t>
        <t>ffv2_device_addr4 and ffv2_device_versions4 are the flexible
file v2 layout counterparts to ff_device_addr4 and
ff_device_versions4 in <xref target="RFC8435"/>.  The two structures are
similar in shape but carry a flexible-file-v2-specific enrichment:
the boolean ffdv_tightly_coupled from RFC 8435 has been widened
to the uint32_t bitfield ffv2dv_coupling, which lets a storage
device advertise more than one coupling capability at the same
time (<xref target="sec-tight-coupling-control"/>).  Because the field type
has changed, the flexible file v2 layout structs are named
distinctly to avoid confusion with the RFC 8435 originals.</t>
        <figure anchor="fig-ff_device_versions4">
          <name>ffv2_device_versions4</name>
          <sourcecode type="xdr"><![CDATA[
   /*
    * ffv2dv_coupling flags -- bitwise-OR of the values below.
    *
    * A zero value (no flags set) indicates the loose coupling
    * synthetic-uid model of RFC 8435: the client presents an
    * anonymous stateid and a synthetic uid issued by the
    * metadata server, and the storage device validates access
    * via that synthetic uid.  The constant
    * FFV2_COUPLING_SYNTHETIC_UIDS is provided as a
    * documentation aid.
    *
    * FFV2_COUPLING_TIGHTLY_COUPLED indicates that the storage
    * device participates in tight coupling with the metadata
    * server via a back-end control protocol between the
    * metadata server and the data servers; the
    * specific mechanism is deployment-configured and outside
    * the scope of this document.
    *
    * FFV2_COUPLING_TRUSTED_STATEID indicates that the storage
    * device implements the TRUST_STATEID, REVOKE_STATEID, and
    * BULK_REVOKE_STATEID operations defined in the Tight
    * Coupling Control Protocol section.
    *
    * The two tight coupling flags are orthogonal: a storage
    * device MAY set either, both, or neither.  See the Tight
    * Coupling Control Protocol section for the semantics of
    * each combination.
    */
   const FFV2_COUPLING_SYNTHETIC_UIDS  = 0x00000000;
   const FFV2_COUPLING_TIGHTLY_COUPLED = 0x00000001;
   const FFV2_COUPLING_TRUSTED_STATEID = 0x00000002;

   struct ffv2_device_versions4 {
           uint32_t        ffv2dv_version;
           uint32_t        ffv2dv_minorversion;
           uint32_t        ffv2dv_rsize;
           uint32_t        ffv2dv_wsize;
           uint32_t        ffv2dv_coupling;
   };
]]></sourcecode>
        </figure>
        <figure anchor="fig-ff_device_addr4">
          <name>ffv2_device_addr4</name>
          <sourcecode type="xdr"><![CDATA[
   struct ffv2_device_addr4 {
           multipath_list4       ffv2da_netaddrs;
           ffv2_device_versions4 ffv2da_versions<>;
   };
]]></sourcecode>
        </figure>
        <t>The ffv2da_netaddrs field is used to locate the storage device.  It
<bcp14>MUST</bcp14> be set by the server to a list holding one or more of the device
network addresses.</t>
        <t>The ffv2da_versions array allows the metadata server to present choices
as to NFS version, minor version, and coupling capabilities to the
client.  The ffv2dv_version and ffv2dv_minorversion represent the NFS
protocol to be used to access the storage device.  This layout
specification defines the semantics for ffv2dv_versions 3 and 4.  If
ffv2dv_version equals 3, then the server <bcp14>MUST</bcp14> set ffv2dv_minorversion to
0 and ffv2dv_coupling to FFV2_COUPLING_SYNTHETIC_UIDS.  The client <bcp14>MUST</bcp14>
then access the storage device using the NFSv3 protocol <xref target="RFC1813"/>.
If ffv2dv_version equals 4, then the server <bcp14>MUST</bcp14> set ffv2dv_minorversion
to 1 or 2, and the client <bcp14>MUST</bcp14> access the storage device using NFSv4
with the specified minor version.</t>
        <t>Three additional constraints narrow the valid set of
(ffv2dv_version, ffv2dv_minorversion, ffv2dv_coupling) tuples
in specific cases:</t>
        <ul spacing="normal">
          <li>
            <t>When a mirror's encoding type uses CHUNK operations (that
is, any FFV2<em>ENCODING</em>* value other than
FFV2_ENCODING_PASSTHROUGH), the corresponding storage device
<bcp14>MUST</bcp14> be advertised with ffv2dv_version = 4 and
ffv2dv_minorversion = 2.  CHUNK operations are NFSv4.2 ops
defined in this document; NFSv3 and NFSv4.1 storage devices
cannot serve a non-PASSTHROUGH mirror.</t>
          </li>
          <li>
            <t>When ffv2dv_coupling has the FFV2_COUPLING_TRUSTED_STATEID
flag set, the storage device <bcp14>MUST</bcp14> be advertised with
ffv2dv_version = 4 and ffv2dv_minorversion = 2.  The
TRUST_STATEID family of operations is defined as NFSv4.2;
NFSv4.1 storage devices cannot participate in
trusted stateid tight coupling.</t>
          </li>
          <li>
            <t>When a mirror's encoding type uses CHUNK operations, the
corresponding storage device <bcp14>MUST</bcp14> be advertised with
ffv2dv_coupling having at least one tight coupling flag set
(FFV2_COUPLING_TIGHTLY_COUPLED or
FFV2_COUPLING_TRUSTED_STATEID, or both).  The chunk
lifecycle depends on the metadata-server-registered layout
stateid and the per-client identity conveyed to the data
server (<xref target="sec-CHUNK_WRITE"/>); a synthetic-uid-only storage
device has neither the trust-table entry required to
validate a presented stateid nor the client-id binding
required to authorize the writer, and therefore cannot
serve a non-PASSTHROUGH mirror.</t>
          </li>
        </ul>
        <t>PASSTHROUGH is the only encoding that admits loose coupling
(FFV2_COUPLING_SYNTHETIC_UIDS); every non-PASSTHROUGH encoding
requires ffv2dv_version = 4, ffv2dv_minorversion = 2, and at
least one tight coupling flag set in ffv2dv_coupling.
PASSTHROUGH itself may be advertised under any of the
following (ffv2dv_version, ffv2dv_minorversion) tuples:
(3, 0), (4, 1), or (4, 2); the first two of these tuples
are valid only for PASSTHROUGH under
FFV2_COUPLING_SYNTHETIC_UIDS, because they precede or lack
the NFSv4.2 features on which the CHUNK operations and the
TRUST_STATEID family depend.</t>
        <t>Note that while the client might determine that it cannot use any of
the configured combinations of ffv2dv_version, ffv2dv_minorversion, and
ffv2dv_coupling, when it gets the device list from the metadata
server, there is no way to indicate to the metadata server as to
which device it is version incompatible.  However, if the client
waits until it retrieves the layout from the metadata server, it can
at that time clearly identify the storage device in question (see
<xref target="sec-version-errors"/>).</t>
        <t>The ffv2dv_rsize and ffv2dv_wsize are used to communicate the maximum
rsize and wsize supported by the storage device.  As the storage
device can have a different rsize or wsize than the metadata server,
the ffv2dv_rsize and ffv2dv_wsize allow the metadata server to
communicate that information on behalf of the storage device.</t>
        <t>ffv2dv_coupling informs the client which tight coupling
capabilities the storage device supports.  The two
tight coupling flags are orthogonal:</t>
        <ul spacing="normal">
          <li>
            <t>FFV2_COUPLING_TIGHTLY_COUPLED asserts that the deployment
has a back-end control protocol between the metadata server
and the data servers (the RFC 8435 general tight coupling
concept); this document does not specify what that protocol
is or how it operates.  A dCache <xref target="DCACHE"/> deployment, for
example, would set this flag based on its own metadata-server
/ pool control plane.</t>
          </li>
          <li>
            <t>FFV2_COUPLING_TRUSTED_STATEID asserts that the storage
device implements the TRUST_STATEID, REVOKE_STATEID, and
BULK_REVOKE_STATEID operations defined in this document
(<xref target="sec-tight-coupling-control"/>).  This is the tight coupling
mechanism this specification adds; a storage
device <bcp14>MUST NOT</bcp14> advertise this flag until the metadata
server has confirmed the capability via the probe in
<xref target="sec-tight-coupling-probe"/>.</t>
          </li>
        </ul>
        <t>A storage device <bcp14>MAY</bcp14> advertise either, both, or neither
flag.  When both are set, the deployment supports two
tight coupling paths concurrently and <bcp14>MAY</bcp14> use either for a
given operation.  When neither is set (ffv2dv_coupling equals
FFV2_COUPLING_SYNTHETIC_UIDS), the storage device is loosely
coupled and the RFC 8435 synthetic-uid model applies (see
<xref target="sec-Fencing-Clients"/>).</t>
        <t>If ffv2dv_coupling has no tight coupling flag set, then the
client <bcp14>MUST</bcp14> commit writes to the storage devices for the file
before sending a
LAYOUTCOMMIT to the metadata server.  That is, the writes <bcp14>MUST</bcp14> be
committed by the client to stable storage via issuing WRITEs with
stable_how = FILE_SYNC or by issuing a COMMIT after WRITEs with
stable_how != FILE_SYNC (see <xref section="3.3.7" sectionFormat="of" target="RFC1813"/>).</t>
      </section>
      <section anchor="storage-device-multipathing">
        <name>Storage Device Multipathing</name>
        <t>The flexible file v2 layout supports multipathing to multiple
storage device addresses.  Storage-device-level multipathing is used
for bandwidth scaling via trunking and for higher availability of use
in the event of a storage device failure.  Multipathing allows the
client to switch to another storage device address that may be that
of another storage device that is exporting the same data stripe
unit, without having to contact the metadata server for a new layout.</t>
        <t>To support storage device multipathing, ffv2da_netaddrs contains an
array of one or more storage device network addresses.  This array
(data type multipath_list4) represents a list of storage devices
(each identified by a network address), with the possibility that
some storage device will appear in the list multiple times.</t>
        <t>The client is free to use any of the network addresses as a
destination to send storage device requests.  If some network
addresses are less desirable paths to the data than others, then the
metadata server <bcp14>SHOULD NOT</bcp14> include those network addresses in
ffv2da_netaddrs.  If less desirable network addresses exist to provide
failover, the <bcp14>RECOMMENDED</bcp14> method to offer the addresses is to provide
them in a replacement device-ID-to-device-address mapping or a
replacement device ID.  When a client finds no response from the
storage device using all addresses available in ffv2da_netaddrs, it
<bcp14>SHOULD</bcp14> send a GETDEVICEINFO to attempt to replace the existing
device-ID-to-device-address mappings.  If the metadata server detects
that all network paths represented by ffv2da_netaddrs are unavailable,
the metadata server <bcp14>SHOULD</bcp14> send a CB_NOTIFY_DEVICEID (if the client
has indicated it wants device ID notifications for changed device
IDs) to change the device-ID-to-device-address mappings to the
available addresses.  If the device ID itself will be replaced, the
metadata server <bcp14>SHOULD</bcp14> recall all layouts with the device ID and thus
force the client to get new layouts and device ID mappings via
LAYOUTGET and GETDEVICEINFO.</t>
        <t>Generally, if two network addresses appear in ffv2da_netaddrs, they
will designate the same storage device.  When the storage device is
accessed over NFSv4.1 or a higher minor version, the two storage
device addresses will support the implementation of client ID or
session trunking (the latter is <bcp14>RECOMMENDED</bcp14>) as defined in <xref target="RFC8881"/>.
The two storage device addresses will share the same server owner or
major ID of the server owner.  It is not always necessary for the two
storage device addresses to designate the same storage device with
trunking being used.  For example, the data could be read-only, and
the data consist of exact replicas.</t>
      </section>
    </section>
    <section anchor="flexible-file-version-2-layout-type">
      <name>Flexible File Version 2 Layout Type</name>
      <t>The original layouttype4 introduced in <xref target="RFC5662"/> is extended as shown in
<xref target="fig-orig-layout"/>.  The layout_content4 and layout4 structures are
reused unchanged from <xref target="RFC5662"/>; the layouttype4 enum is extended
with the new LAYOUT4_FLEX_FILES_V2 value.  The full enum and
surrounding structures below are reproduced for reader
convenience; only the new constant LAYOUT4_FLEX_FILES_V2 is part
of the XDR extracted from this document (see
<xref target="fig-orig-layout-extract"/>).</t>
      <figure anchor="fig-orig-layout">
        <name>The original layout type (illustrative; reused from RFC 5662 with extension)</name>
        <sourcecode type="xdr"><![CDATA[
       enum layouttype4 {
           LAYOUT4_NFSV4_1_FILES   = 1,
           LAYOUT4_OSD2_OBJECTS    = 2,
           LAYOUT4_BLOCK_VOLUME    = 3,
           LAYOUT4_FLEX_FILES      = 4,
           LAYOUT4_SCSI            = 5,
           LAYOUT4_FLEX_FILES_V2   = 6
       };

       struct layout_content4 {
           layouttype4             loc_type;
           opaque                  loc_body<>;
       };

       struct layout4 {
           offset4                 lo_offset;
           length4                 lo_length;
           layoutiomode4           lo_iomode;
           layout_content4         lo_content;
       };
]]></sourcecode>
      </figure>
      <t>The extracted XDR contribution for this extension is the new
layouttype4 constant alone:</t>
      <figure anchor="fig-orig-layout-extract">
        <name>New layouttype4 value (extracted)</name>
        <sourcecode type="xdr"><![CDATA[
   /// const LAYOUT4_FLEX_FILES_V2 = 6;
]]></sourcecode>
      </figure>
      <t>This document defines structures associated with the layouttype4
value LAYOUT4_FLEX_FILES_V2.  <xref target="RFC8881"/> specifies the loc_body structure
as an XDR type "opaque".  The opaque layout is uninterpreted by the
generic pNFS client layers but is interpreted by the flexible file
layout type implementation.  This section defines the structure of
this otherwise opaque value, ffv2_layout4.</t>
      <section anchor="ffv2encodingtype4">
        <name>ffv2_encoding_type4</name>
        <figure anchor="fig-ffv2_encoding_type4">
          <name>The encoding type</name>
          <sourcecode type="xdr"><![CDATA[
   /// enum ffv2_encoding_type4 {
   ///     FFV2_ENCODING_PASSTHROUGH             = 1,
   ///     FFV2_ENCODING_MOJETTE_SYSTEMATIC      = 2,
   ///     FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC  = 3,
   ///     FFV2_ENCODING_RS_VANDERMONDE          = 4,
   ///     FFV2_ENCODING_REPLICATED                = 5,
   ///     FFV2_ENCODING_XOR_PARITY              = 6,
   ///     FFV2_ENCODING_LINUX_MD_RAID           = 7
   /// };
]]></sourcecode>
        </figure>
        <t>The ffv2_encoding_type4 (see <xref target="fig-ffv2_encoding_type4"/>) encompasses
a new IANA registry for 'Flexible File Version 2 Layout Type Erasure Coding
Type Registry'.  I.e., instead of defining a new Layout Type for
each erasure coding, we define a new Erasure Encoding Type.  The
encoding types this document defines fall into two groups:</t>
        <ul spacing="normal">
          <li>
            <t>FFV2_ENCODING_PASSTHROUGH is the non-chunked, non-integrity
on-ramp from flexible file v1 layout.  It uses NFSv3 WRITE / READ
or NFSv4 READ / WRITE directly against each replica's data server.
No CHUNK_WRITE, no CHUNK_READ, no per-chunk CRC.  See
<xref target="sec-encoding-passthrough"/>.</t>
          </li>
          <li>
            <t>Every other standards-track encoding (any FFV2<em>ENCODING</em>*
value other than FFV2_ENCODING_PASSTHROUGH; see
<xref target="tbl-coding-types"/>) uses the new operations defined here:
in particular CHUNK_WRITE and CHUNK_READ, which carry the per-chunk checksum this
version of the layout type relies on for end-to-end integrity.
The encoding type selects how chunks are produced from
application data; the wire and the storage device are the
same in every case.  See the individual encoding sections
for the mathematical constructions of each encoding and for
the wire-compatibility relationships among the Galois Field
GF(2^8) family.</t>
          </li>
        </ul>
        <t>The 32-bit ffv2_encoding_type4 value space is partitioned by
intended scope -- Standards Track, Experimental, Vendor (open),
and Private / proprietary -- with different allocation policies
per range, so that vendors can assign encoding values without
consuming standards-track codepoints.  See
<xref target="tbl-coding-ranges"/> and the accompanying prose in
<xref target="iana-considerations"/> for the range assignments and allocation
policies.</t>
        <section anchor="sec-heterogeneous-mirrors">
          <name>Heterogeneous Mirror Sets</name>
          <t>A single flexible file v2 layout's <tt>ffv2l_mirrors</tt> array <bcp14>MAY</bcp14> carry mirror
entries of different encoding types.  The protocol does not
require the entries to agree -- one mirror can be
FFV2_ENCODING_PASSTHROUGH, another can be
FFV2_ENCODING_RS_VANDERMONDE, both describing the same file's
data range.  This combination is the structural primitive for
three operations that motivate keeping PASSTHROUGH in the
layout type's vocabulary:</t>
          <dl>
            <dt>Assimilate:</dt>
            <dd>
              <t>A file that exists today as a plain copy on
storage outside flexible file v2 layout -- no chunk envelope, no per-chunk
CRC -- enters the namespace as a PASSTHROUGH mirror against
the source bytes as they are.  The metadata server then
adds one or more encoded mirrors (MIRRORED, RS, Mojette) to
the same layout and synchronizes them from the PASSTHROUGH
source.  Clients can read the file via the PASSTHROUGH
mirror immediately; the encoded mirrors become available as
they are populated.  No "rewrite before serve" step is
required.</t>
            </dd>
            <dt>Copy / migrate between encodings:</dt>
            <dd>
              <t>Changing a file from
one encoding to another is "add a mirror in the target
encoding to the same layout, let it sync from any healthy
source mirror, retire the source mirror."  PASSTHROUGH is
the special case where one endpoint of that migration is
"no encoding."</t>
            </dd>
            <dt>Repair across encodings:</dt>
            <dd>
              <t>When an encoded mirror has a
chunk whose CRC fails and whose parity cannot reconstruct,
a PASSTHROUGH mirror in the same layout is an authoritative
source: CHUNK_READ a peer encoded mirror or read the
PASSTHROUGH byte range, then CHUNK_WRITE the repaired
chunk.  The reverse is also true: a byte range on the
PASSTHROUGH copy whose contents the metadata server suspects
has drifted can be repaired by reconstructing from the
verified-CRC chunks of an encoded peer.  Two encodings of
the same file are two independent recovery paths.</t>
            </dd>
          </dl>
          <t>The metadata server is responsible for keeping the entries in
a heterogeneous mirror set in sync; the protocol does not
require client awareness of which encoding produced which
mirror beyond what the layout already states.</t>
          <t>The wire-level coordination that makes a heterogeneous mirror
set safe to operate -- in particular, the rule that a client
arriving during a transition sees a single layout naming the
proxy server rather than two layouts naming the source and
destination encodings, and the rule that the metadata server's
commit of a transition is a single transaction -- is specified
in the proxy server draft
(<xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>), in the
sections "Layout Shape During a Proxy Operation" and "Atomic
commit on PROXY_DONE".  This document specifies the per-mirror
encoding naming primitive; the proxy server document specifies
the transactional machinery that uses it.</t>
          <t>The full description of each encoding type is deferred to its
own section.  The mapping between the enum values above and
those sections is:</t>
          <table anchor="tbl-encoding-type-sections">
            <name>Encoding type value to section mapping</name>
            <thead>
              <tr>
                <th align="right">Value</th>
                <th align="left">Encoding type</th>
                <th align="left">Description</th>
                <th align="left">Section</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="right">1</td>
                <td align="left">FFV2_ENCODING_PASSTHROUGH</td>
                <td align="left">On-ramp from the flexible file v1 layout; direct NFSv3/v4 I/O, no chunk envelope</td>
                <td align="left">
                  <xref target="sec-encoding-passthrough"/></td>
              </tr>
              <tr>
                <td align="right">2</td>
                <td align="left">FFV2_ENCODING_MOJETTE_SYSTEMATIC</td>
                <td align="left">Discrete Radon projections, systematic (data shards passed through)</td>
                <td align="left">
                  <xref target="sec-mojette-encoding"/></td>
              </tr>
              <tr>
                <td align="right">3</td>
                <td align="left">FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC</td>
                <td align="left">Discrete Radon projections, non-systematic (all shards transformed)</td>
                <td align="left">
                  <xref target="sec-mojette-encoding"/></td>
              </tr>
              <tr>
                <td align="right">4</td>
                <td align="left">FFV2_ENCODING_RS_VANDERMONDE</td>
                <td align="left">Reed-Solomon Vandermonde over GF(2^8); arbitrary (k, m)</td>
                <td align="left">
                  <xref target="sec-rs-encoding"/></td>
              </tr>
              <tr>
                <td align="right">5</td>
                <td align="left">FFV2_ENCODING_REPLICATED</td>
                <td align="left">Chunked replication; N-way redundancy at N x storage</td>
                <td align="left">
                  <xref target="sec-encoding-replicated"/></td>
              </tr>
              <tr>
                <td align="right">6</td>
                <td align="left">FFV2_ENCODING_XOR_PARITY</td>
                <td align="left">Single-parity RAID-5 shape; k + 1, m=1, pure XOR</td>
                <td align="left">
                  <xref target="sec-encoding-xor-parity"/></td>
              </tr>
              <tr>
                <td align="right">7</td>
                <td align="left">FFV2_ENCODING_LINUX_MD_RAID</td>
                <td align="left">Linux md/raid6 P + Q double-parity; k + 2, m=2, GF(2^8)</td>
                <td align="left">
                  <xref target="sec-encoding-linux-md-raid"/></td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="encoding-type-interoperability">
          <name>Encoding Type Interoperability</name>
          <t>The data servers do not interpret erasure-coded data -- they store and
return opaque chunks.  The NFS wire protocol likewise does not depend
on the encoding mathematics.  However, a client that writes data using
one encoding type <bcp14>MUST</bcp14> be able to read it back, and a different
client implementation <bcp14>MUST</bcp14> be able to read data written by the first
client if both claim to support the same encoding type.</t>
          <t>This interoperability requirement means that each registered
encoding type <bcp14>MUST</bcp14> fully specify the encoding and decoding
mathematics such that two independent implementations produce
byte-identical encoded output for the same input.  The specification
of a new encoding type <bcp14>MUST</bcp14> include one of the following:</t>
          <ol spacing="normal" type="1"><li>
              <t>A complete mathematical specification of the encoding and decoding
algorithms, including all parameters (e.g., field polynomial,
matrix construction, element size) sufficient for an independent
implementation to produce interoperable results.</t>
            </li>
            <li>
              <t>A reference to a published patent or pending patent application
that contains the algorithm specification.  Implementors can then
evaluate the licensing terms and decide whether to support the
encoding type.</t>
            </li>
            <li>
              <t>A declaration that the encoding type is a proprietary
implementation.  In this case, the encoding type name <bcp14>SHOULD</bcp14>
include an organizational prefix (e.g.,
FFV2_ENCODING_ACME_FOOBAR) to signal that interoperability is
limited to implementations licensed by that organization.</t>
            </li>
          </ol>
          <t>Option 1 is <bcp14>RECOMMENDED</bcp14> for encoding types intended for broad
interoperability.  Options 2 and 3 allow vendors to register encoding
types for use within their own ecosystems while preserving the
encoding type namespace.</t>
          <t>The rationale for this requirement is that erasure coding moves
computation from the server to the client.  If the client cannot
determine how data was encoded, it cannot decode it.  Unlike layout
types (where the server controls the storage format), encoding types
require client-side agreement on the mathematics.</t>
        </section>
      </section>
      <section anchor="sec-ffv2_layout">
        <name>ffv2_layout4</name>
        <section anchor="sec-ffv2_flags4">
          <name>ffv2_flags4</name>
          <figure anchor="fig-ffv2_flags4">
            <name>The ffv2_flags4</name>
            <sourcecode type="xdr"><![CDATA[
   /// const FFV2_FLAGS_NO_LAYOUTCOMMIT  = FF_FLAGS_NO_LAYOUTCOMMIT;
   /// const FFV2_FLAGS_NO_IO_THRU_MDS   = FF_FLAGS_NO_IO_THRU_MDS;
   /// const FFV2_FLAGS_NO_READ_IO       = FF_FLAGS_NO_READ_IO;
   /// const FFV2_FLAGS_WRITE_ONE_MIRROR =
   ///     FF_FLAGS_WRITE_ONE_MIRROR;
   /// const FFV2_FLAGS_ONLY_ONE_WRITER  = 0x00000010;
   ///
   /// typedef uint32_t            ffv2_flags4;
]]></sourcecode>
          </figure>
          <t>The ffv2_flags4 in <xref target="fig-ffv2_flags4"/>  is a bitmap that allows the
metadata server to inform the client of particular conditions that
may result from more or less tight coupling of the storage devices.</t>
          <t>Each flag below describes both the semantics when set and the
normative requirement it places on the client.  When a flag is
not set, the client <bcp14>MUST</bcp14> follow the default behavior described
for its unset state.</t>
          <dl>
            <dt>FFV2_FLAGS_NO_LAYOUTCOMMIT:</dt>
            <dd>
              <t>When set, the client <bcp14>MAY</bcp14> omit the LAYOUTCOMMIT to the
metadata server.  When unset, the client <bcp14>MUST</bcp14> send LAYOUTCOMMIT
per <xref section="18.42." sectionFormat="of" target="RFC8881"/></t>
            </dd>
            <dt>FFV2_FLAGS_NO_IO_THRU_MDS:</dt>
            <dd>
              <t>When set, the client <bcp14>MUST NOT</bcp14> proxy I/O operations through
the metadata server, even after detecting a network disconnect
to a storage device.  When unset, the client <bcp14>MAY</bcp14> retry failed
I/O via the metadata server.</t>
            </dd>
            <dt>FFV2_FLAGS_NO_READ_IO:</dt>
            <dd>
              <t>When set, the client <bcp14>MUST NOT</bcp14> issue READ against layouts of
iomode LAYOUTIOMODE4_RW, and <bcp14>MUST</bcp14> instead request a separate
layout of iomode LAYOUTIOMODE4_READ for any read I/O.  When
unset, the client <bcp14>MAY</bcp14> issue READ against either iomode.</t>
            </dd>
            <dt>FFV2_FLAGS_WRITE_ONE_MIRROR:</dt>
            <dd>
              <t>When set, the client <bcp14>MAY</bcp14> update only one mirror of each
layout segment (see <xref target="sec-CSM"/>) and rely on the metadata server
(or a proxy server acting on its behalf) or a peer data server
to propagate the update to the remaining mirrors.  When unset,
the client <bcp14>MUST</bcp14> update all mirrors.</t>
              <t>The metadata server <bcp14>MUST NOT</bcp14> set FFV2_FLAGS_WRITE_ONE_MIRROR
on a layout whose ffv2l_mirrors carry more than one distinct
ffv2m_encoding_type_data value unless a propagation actor is
available that speaks every encoding present in the layout.
Cross-encoding propagation requires the actor to decode
through the source mirror's encoding transform and re-encode
for each target mirror's transform, which the metadata server
itself cannot do for chunked encodings (it does not hold the
encoded shards); a proxy server is the entity that performs
cross-encoding translation.  On a
mixed-encoding layout without a proxy server for the affected
file, the metadata server <bcp14>MUST</bcp14> leave
FFV2_FLAGS_WRITE_ONE_MIRROR unset and require the client to
update all mirrors directly.</t>
            </dd>
            <dt>FFV2_FLAGS_ONLY_ONE_WRITER:</dt>
            <dd>
              <t>When set, the client is the exclusive writer for the layout
and <bcp14>MAY</bcp14> issue CHUNK_WRITE without setting cwa_guard, retaining
the ability to use CHUNK_ROLLBACK in the event of a write hole
caused by overwriting.  When unset, the client <bcp14>MUST</bcp14> set
cwa_guard on every CHUNK_WRITE so that chunk_guard4 CAS can
prevent collisions across concurrent writers.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="ffv2fileinfo4">
        <name>ffv2_file_info4</name>
        <figure anchor="fig-ffv2_file_info4">
          <name>The ffv2_file_info4</name>
          <sourcecode type="xdr"><![CDATA[
   /// struct ffv2_file_info4 {
   ///     stateid4                ffv2fi_stateid;
   ///     nfs_fh4                 ffv2fi_fh_vers;
   /// };
]]></sourcecode>
        </figure>
        <t>The ffv2_file_info4 is a new structure that resolves the
stateid-vs-fh_vers pairing issue discussed in <xref section="5.1" sectionFormat="of" target="RFC8435"/>.  In <xref target="RFC8435"/>'s flexible file v1 layout, a singleton
ffv2ds_stateid was paired with an ffv2ds_fh_vers array, forcing every
fh_vers on a data server to share one stateid.  In
<xref target="fig-ffv2_file_info4"/> each fh_vers has its own stateid alongside it.</t>
        <t>The stateid value ffv2fi_stateid <bcp14>MUST</bcp14> carry depends on the
coupling mode advertised for the corresponding
(ffv2dv_version, ffv2dv_minorversion, ffv2dv_coupling) tuple
(see <xref target="sec-ff_device_addr4"/>):</t>
        <ul spacing="normal">
          <li>
            <t>If ffv2dv_coupling for this entry equals
FFV2_COUPLING_SYNTHETIC_UIDS (loose coupling), ffv2fi_stateid
<bcp14>MUST</bcp14> be the anonymous stateid; the client authenticates to
the data server via the synthetic ffv2ds_user / ffv2ds_group
(<xref target="sec-Fencing-Clients"/>) rather than by presenting a
meaningful stateid.</t>
          </li>
          <li>
            <t>If ffv2dv_coupling for this entry has the
FFV2_COUPLING_TRUSTED_STATEID flag set, ffv2fi_stateid <bcp14>MUST</bcp14>
be the layout stateid the metadata server issued in the
LAYOUTGET that produced this layout.  The data server
validates presented stateids against its per-file trust
table populated by TRUST_STATEID
(<xref target="sec-tight-coupling-control"/>).</t>
          </li>
          <li>
            <t>If ffv2dv_coupling for this entry has only
FFV2_COUPLING_TIGHTLY_COUPLED set (a back-end control
protocol other than trusted stateid, with no TRUST_STATEID
support advertised), ffv2fi_stateid carries whatever
stateid the deployment's back-end control protocol expects
the client to present; this document does not further
specify that value.</t>
          </li>
        </ul>
        <t>Because ffv2ds_file_info&lt;&gt; has one element per
(version, minorversion, coupling) tuple advertised on the
data server (parallel to ffv2da_versions&lt;&gt;), a single data
server that exposes both loose and tight combinations
carries multiple ffv2_file_info4 entries with different
stateid values.  The client selects one tuple to use for
I/O; it presents that tuple's stateid on subsequent CHUNK
operations.</t>
      </section>
      <section anchor="sec-ffv2_ds_flags4">
        <name>ffv2_ds_flags4</name>
        <figure anchor="fig-ffv2_ds_flags4">
          <name>The ffv2_ds_flags4</name>
          <sourcecode type="xdr"><![CDATA[
   /// const FFV2_DS_FLAGS_ACTIVE        = 0x00000001;
   /// const FFV2_DS_FLAGS_PARITY        = 0x00000004;
   /// const FFV2_DS_FLAGS_REPAIR        = 0x00000008;
   /// const FFV2_DS_FLAGS_PROXY         = 0x00000010;
   /// typedef uint32_t            ffv2_ds_flags4;
]]></sourcecode>
        </figure>
        <t>The ffv2_ds_flags4 (in <xref target="fig-ffv2_ds_flags4"/>) flags detail the
state of the data servers.  With erasure coding algorithms,
there are both Systematic and Non-Systematic approaches.  In
the Systematic approach, the bits for integrity are placed
amongst the resulting transformed chunk.  Such an
implementation would typically see FFV2_DS_FLAGS_ACTIVE data
servers with FFV2_DS_FLAGS_REPAIR entries added by the
metadata server when a failed ACTIVE has been replaced.</t>
        <t>With the Non-Systematic approach, the data and integrity live
on different data servers.  Such an implementation would
typically see FFV2_DS_FLAGS_ACTIVE and FFV2_DS_FLAGS_PARITY
data servers, again with FFV2_DS_FLAGS_REPAIR entries appearing
as needed.</t>
        <t>The FFV2_DS_FLAGS_REPAIR flag informs the client that the
indicated data server is a replacement for a previously failed
ACTIVE data server, whose content has been (or is being)
reconstructed from the surviving shards of the mirror set.
Its payload was placed there by a repair actor executing the
flow in <xref target="sec-repair-selection"/> rather than directly by the
original writer.  The flag is the client's indication that
reads from this data server return erasure-decoded content
rather than content produced by the original write.</t>
        <t>Clients that rely on write-provenance information (for example,
deployments that track which client wrote which generation)
<bcp14>SHOULD</bcp14> be aware of the REPAIR flag so they do not treat the
reconstructed payload as if it had been written directly by the
cg_client_id recorded in the chunk_guard4; the guard values
still match across the mirror set by construction, but the
physical write path differs.</t>
        <t>Over the lifetime of a file, a single data server <bcp14>MAY</bcp14> transition
ACTIVE -&gt; REPAIR (on replacement) or REPAIR -&gt; ACTIVE (once the
metadata server has accepted the reconstructed content as
authoritative and the fail-over is complete); the metadata
server reflects the current flag set in the next layout it
returns.</t>
        <t>The following paragraphs describe the mechanics of these
transitions.  The client is not the driver in either
direction; both are metadata-server-initiated changes that a
client observes only by refreshing its layout.</t>
        <dl>
          <dt>ACTIVE -&gt; REPAIR:</dt>
          <dd>
            <t>Triggered when a client (or the metadata server itself,
via scrub) reports a failure via LAYOUTERROR against a
particular shard.  The metadata server picks a target for
the reconstructed content -- either an existing
FFV2_DS_FLAGS_REPAIR-flagged entry already in the layout,
or a fresh data server drawn from an out-of-band
deployment pool that the metadata server adds to the
layout with FFV2_DS_FLAGS_REPAIR set -- and initiates the
client-driven repair flow at <xref target="sec-repair-selection"/>.
Once the reconstructed shard is written and the
metadata server has accepted it (via CHUNK_REPAIRED),
the metadata server updates the affected layout to
remove the failed entry and mark the target entry as
FFV2_DS_FLAGS_REPAIR.  The metadata server <bcp14>SHOULD</bcp14> then
issue CB_LAYOUTRECALL against any client that holds an
outstanding layout for the affected file, so those
clients refresh via a subsequent LAYOUTGET and observe
the updated flag set.  Clients that never issued
LAYOUTGET during the incident window observe the new
layout on first fetch.</t>
          </dd>
          <dt>REPAIR -&gt; ACTIVE:</dt>
          <dd>
            <t>Triggered when the metadata server confirms the
reconstructed content has been durably committed and
the replaced data server is not returning.  This is a
metadata-server-internal state change; no client-visible
operations are required for the transition itself.  The
flag update is reflected in the next layout the metadata
server hands out (either the layout returned to the next
LAYOUTGET, or the layout delivered after a CB_LAYOUTRECALL
that the metadata server <bcp14>MAY</bcp14> issue to accelerate the
transition).</t>
          </dd>
        </dl>
        <t>Both transitions preserve the mirror set's array indexing:
the shard formerly held by the failed entry lives at the
same array position in the layout, under the REPAIR-flagged
entry.  A client reads by array position; the flag informs
the client of the read's provenance (originally written vs
reconstructed) but does not change the shard-index
addressing.  A client <bcp14>MUST NOT</bcp14> infer that a REPAIR-flagged
entry serves a different shard than the ACTIVE entry it
replaced.</t>
        <t>If the same payload identifier appears at the same shard
position across an ACTIVE entry (about to be retired) and a
REPAIR entry (being promoted) during a transition window,
the two entries are guaranteed to carry identical chunk
contents (the reconstructed content matches the original by
the erasure-coding correctness invariant, and the checksum
verifies).  There is no client-driven failover to a passive
data server; a client that observes a CHUNK_WRITE failure
against an ACTIVE <bcp14>MUST</bcp14> report the failure via LAYOUTERROR
and rely on the metadata-server-initiated repair flow above
to promote a replacement.</t>
        <t>The FFV2_DS_FLAGS_PROXY flag identifies a data-server entry
that names a proxy server rather than a real storage device.
A client whose local encoding capabilities cannot cover the
file's mirror set receives a layout in which one or more
mirror entries have FFV2_DS_FLAGS_PROXY set on their
ffv2_data_server4; the client directs I/O for that mirror
to the proxy, which translates on behalf of the client.  The
proxy server protocol itself is specified in the proxy server
draft; this document defines only the layout flag (this bit)
that lets the metadata server mark a data-server entry as
proxy-mediated.</t>
      </section>
      <section anchor="ffv2dataserver4">
        <name>ffv2_data_server4</name>
        <figure anchor="fig-ffv2_data_server4">
          <name>The ffv2_data_server4</name>
          <sourcecode type="xdr"><![CDATA[
   /// struct ffv2_data_server4 {
   ///     deviceid4               ffv2ds_deviceid;
   ///     uint32_t                ffv2ds_efficiency;
   ///     ffv2_file_info4         ffv2ds_file_info<>;
   ///     fattr4_owner            ffv2ds_user;
   ///     fattr4_owner_group      ffv2ds_group;
   ///     ffv2_ds_flags4          ffv2ds_flags;
   /// };
]]></sourcecode>
        </figure>
        <t>The ffv2_data_server4 (in <xref target="fig-ffv2_data_server4"/>) describes a data
file and how to access it via the different NFS protocols.</t>
        <ul spacing="normal">
          <li>
            <t>ffv2ds_deviceid names the data server; see the flexible
file v1 layout (<xref target="RFC8435"/>) for the deviceid model this
layout inherits.</t>
          </li>
          <li>
            <t>ffv2ds_efficiency is the metadata-server-assigned mirror
ranking used for read-mirror selection
(<xref target="sec-select-mirror"/>).</t>
          </li>
          <li>
            <t>ffv2ds_file_info&lt;&gt; pairs a filehandle and a stateid for
each (version, minorversion, coupling) tuple the layout
advertises on this data server (see <xref target="sec-ff_device_addr4"/>
and the discussion at ffv2_file_info4 above for the
stateid-value rules per coupling mode).</t>
          </li>
          <li>
            <t>ffv2ds_user and ffv2ds_group are the synthetic uid/gid the
client presents in the RPC credentials to the data server
under loose coupling (see <xref target="sec-Fencing-Clients"/>).  They
are present in every ffv2_data_server4 regardless of the
coupling advertised on this data server, because the
underlying file on the data server has a single uid/gid
irrespective of which NFS protocol combination the client
uses to reach it.  If ffv2dv_coupling for the tuple the
client selects has any tight coupling flag set
(FFV2_COUPLING_TIGHTLY_COUPLED or
FFV2_COUPLING_TRUSTED_STATEID), the client <bcp14>MUST</bcp14> ignore
ffv2ds_user and ffv2ds_group; the data server authorizes
the write via the trusted stateid table or the back-end
control protocol instead of via the synthetic uid.  If the
client selects a tuple with ffv2dv_coupling =
FFV2_COUPLING_SYNTHETIC_UIDS, the client <bcp14>MUST</bcp14> present
ffv2ds_user and ffv2ds_group in the RPC credentials.</t>
          </li>
          <li>
            <t>ffv2ds_flags carries the ffv2_ds_flags4 state (ACTIVE,
PARITY, REPAIR, PROXY; see <xref target="sec-ffv2_ds_flags4"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="ffv2dataprotection4">
        <name>ffv2_data_protection4</name>
        <figure anchor="fig-ffv2_data_protection4">
          <name>The ffv2_data_protection4</name>
          <sourcecode type="xdr"><![CDATA[
   /// struct ffv2_data_protection4 {
   ///     uint32_t ffv2dp_data;    /* data shards (k) */
   ///     uint32_t ffv2dp_parity;  /* parity shards (m) */
   /// };
]]></sourcecode>
        </figure>
        <t>The ffv2_data_protection4 (in <xref target="fig-ffv2_data_protection4"/>) describes
the data protection geometry as a pair of counts: the number of data
shards (ffv2dp_data, also known as k) and the number of parity or
redundancy shards (ffv2dp_parity, also known as m).  This structure is
used in both layout hints and layout responses, and applies
uniformly to all encoding types:</t>
        <table anchor="fig-protection-examples">
          <name>Example data protection configurations</name>
          <thead>
            <tr>
              <th align="left">Protection Mode</th>
              <th align="left">ffv2dp_data</th>
              <th align="left">ffv2dp_parity</th>
              <th align="left">Total Data Servers</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Mirroring (3-way)</td>
              <td align="left">1</td>
              <td align="left">2</td>
              <td align="left">3</td>
              <td align="left">3 copies, no encoding</td>
            </tr>
            <tr>
              <td align="left">Striping (6-way)</td>
              <td align="left">6</td>
              <td align="left">0</td>
              <td align="left">6</td>
              <td align="left">Parallel I/O, no redundancy</td>
            </tr>
            <tr>
              <td align="left">RS Vandermonde 4+2</td>
              <td align="left">4</td>
              <td align="left">2</td>
              <td align="left">6</td>
              <td align="left">Tolerates 2 data-server failures</td>
            </tr>
            <tr>
              <td align="left">Mojette-sys 8+2</td>
              <td align="left">8</td>
              <td align="left">2</td>
              <td align="left">10</td>
              <td align="left">Tolerates 2 data-server failures</td>
            </tr>
          </tbody>
        </table>
        <t>By expressing all protection modes as (ffv2dp_data, ffv2dp_parity) pairs,
a single structure serves mirroring, striping, and all erasure
encoding types.  The encoding type (<xref target="fig-ffv2_encoding_type4"/>) determines
how the shards are encoded; the protection structure determines
how many shards there are.</t>
        <t>The total number of data servers required is ffv2dp_data + ffv2dp_parity.
The storage overhead is ffv2dp_parity / ffv2dp_data (e.g., 50% for 4+2,
25% for 8+2).</t>
      </section>
      <section anchor="ffv2encodingtypedata4">
        <name>ffv2_encoding_type_data4</name>
        <figure anchor="fig-ffv2_coding_type_data4">
          <name>The ffv2_encoding_type_data4</name>
          <sourcecode type="xdr"><![CDATA[
   /// union ffv2_encoding_type_data4 switch
   ///         (ffv2_encoding_type4 ffv2etd_encoding) {
   ///     case FFV2_ENCODING_PASSTHROUGH:
   ///         ffv2_data_protection4   ffv2etd_protection;
   ///     case FFV2_ENCODING_REPLICATED:
   ///         ffv2_data_protection4   ffv2etd_protection;
   ///     default:
   ///         ffv2_data_protection4   ffv2etd_protection;
   /// };
]]></sourcecode>
        </figure>
        <t>The ffv2_encoding_type_data4 (in <xref target="fig-ffv2_coding_type_data4"/>)
describes the data protection geometry for the layout.  All
encoding types carry an ffv2_data_protection4
(<xref target="fig-ffv2_data_protection4"/>) specifying the number of data and
parity shards.  The encoding type enum determines how the shards
are encoded; the protection structure determines how many shards
there are.</t>
        <t>Although every arm of the union currently carries the same
type, the union form is intentional.  Future revisions of this
specification may assign distinct arm types to specific coding
types; using a union now avoids an incompatible change to the
XDR at that time.</t>
        <t>The (data, parity) tuple is interpreted per encoding type:</t>
        <ul spacing="normal">
          <li>
            <t>FFV2_ENCODING_PASSTHROUGH preserves the flexible file v1 layout-style notation
for backward compatibility: ffv2dp_data is 1 and ffv2dp_parity is
the number of additional copies (e.g., ffv2dp_parity=2 for
3-way mirroring).  The "1" data carrier is the file as
stored; the ffv2dp_parity additional copies are the flexible file v1 layout
mirror replicas.</t>
          </li>
          <li>
            <t>FFV2_ENCODING_REPLICATED uses the N + 0 notation: ffv2dp_data is
the number of replicas (e.g., ffv2dp_data=3 for 3-way
mirroring) and ffv2dp_parity <bcp14>MUST</bcp14> be 0.  Every replica is a
full, independent data carrier; mirroring carries no
parity reconstruction.</t>
          </li>
          <li>
            <t>Erasure encoding types (FFV2_ENCODING_RS_VANDERMONDE,
FFV2_ENCODING_MOJETTE_SYSTEMATIC,
FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC, and any future types
subsequently registered in the IANA registry established by
this document) use ffv2dp_data &gt;= 2 and ffv2dp_parity &gt;= 1.</t>
          </li>
        </ul>
      </section>
      <section anchor="ffv2stripes4">
        <name>ffv2_stripes4</name>
        <figure anchor="fig-ffv2_stripes4">
          <name>The ffv2_stripes4 structure</name>
          <sourcecode type="xdr"><![CDATA[
   /// enum ffv2_striping4 {
   ///     FFV2_STRIPING_NONE = 0,
   ///     FFV2_STRIPING_SPARSE = 1,
   ///     FFV2_STRIPING_DENSE = 2
   /// };
   ///
   /// struct ffv2_stripes4 {
   ///         ffv2_data_server4       ffv2s_data_servers<>;
   /// };
]]></sourcecode>
        </figure>
        <t>Each stripe contains a set of data servers in ffv2s_data_servers.
If the stripe is part of a ffv2_encoding_type_data4 of
FFV2_ENCODING_PASSTHROUGH or FFV2_ENCODING_REPLICATED, then the
length of ffv2s_data_servers <bcp14>MUST</bcp14> be 1: under both encoding
types each stripe's data lives on a single data server, with
replica multiplicity expressed in ffv2l_mirrors rather than in
ffv2s_data_servers.</t>
        <t>ffv2_stripes4 has no direct counterpart in <xref target="RFC8435"/>.  In
the flexible file v1 layout, a mirror's data servers are
listed directly on the mirror (via ffm_data_servers&lt;&gt; on
ff_mirror4).  The flexible file v2 layout introduces this
intermediate stripes level so a single mirror <bcp14>MAY</bcp14> carry
multiple stripe groups, and pushes the striping-mode metadata
(ffv2m_striping, ffv2m_striping_unit_size) down onto the mirror
(see <xref target="sec-ffv2-mirror4"/>) rather than onto the layout as
<xref target="RFC8435"/> does with the layout-level ffl_stripe_unit.  The
ffv2_striping4 enum (FFV2_STRIPING_NONE / _SPARSE / _DENSE)
inherits its meaning from <xref section="13.3" sectionFormat="of" target="RFC8881"/> and
<xref section="5.1" sectionFormat="of" target="RFC8435"/>; the flexible file v2 layout
evolution is that the striping mode is a per-mirror decision
rather than a per-layout one.</t>
      </section>
      <section anchor="sec-ffv2-mirror4">
        <name>ffv2_mirror4</name>
        <figure anchor="fig-ffv2_mirror4">
          <name>The ffv2_mirror4</name>
          <sourcecode type="xdr"><![CDATA[
   /// struct ffv2_mirror4 {
   ///         ffv2_encoding_type_data4  ffv2m_encoding_type_data;
   ///         ffv2_striping4            ffv2m_striping;
   ///         uint32_t                  ffv2m_striping_unit_size;
   ///         uint32_t                  ffv2m_client_id;
   ///         checksum_algorithm4       ffv2m_checksum_algorithm;
   ///         ffv2_stripes4             ffv2m_stripes<>;
   /// };
]]></sourcecode>
        </figure>
        <t>The ffv2_mirror4 (in <xref target="fig-ffv2_mirror4"/>) is the flexible
file v2 layout counterpart to ff_mirror4 in <xref target="RFC8435"/>.  The
flexible file v2 layout is a semantic superset of the flexible
file v1 layout: any ff_mirror4 can be re-expressed as an
ffv2_mirror4 by setting
ffv2m_encoding_type_data = FFV2_ENCODING_PASSTHROUGH,
ffv2m_striping and ffv2m_striping_unit_size to the flexible
file v1 layout's layout-level values, ffv2m_checksum_algorithm
to CHECKSUM_ALG_NONE, and wrapping the flexible file v1
layout's ffm_data_servers&lt;&gt; in a single-element
ffv2m_stripes&lt;&gt;.  The reverse does not hold: ffv2_mirror4
instances whose ffv2m_encoding_type_data is anything other than
FFV2_ENCODING_PASSTHROUGH have no ff_mirror4 representation.</t>
        <t>Relative to ff_mirror4, ffv2_mirror4 adds the following
per-mirror fields:</t>
        <ul spacing="normal">
          <li>
            <t>ffv2m_encoding_type_data: per-mirror encoding type choice
(see <xref target="fig-ffv2_encoding_type4"/>).  This enables a single
layout to carry mirrors under different encodings
(e.g., a PASSTHROUGH mirror alongside a Reed-Solomon
mirror over the same file; see <xref target="fig-example_mixing"/>) --
the transition-window and per-mirror-optimization patterns
that motivated the flexible file v2 layout.</t>
          </li>
          <li>
            <t>ffv2m_striping and ffv2m_striping_unit_size: pull the
striping-mode decision from the layout level down to the
mirror level.  The flexible file v1 layout's
ffl_stripe_unit is layout-wide; in the flexible file v2
layout different mirrors of the same file <bcp14>MAY</bcp14> use different
striping configurations.</t>
          </li>
          <li>
            <t>ffv2m_client_id: writer identity for chunk_guard4 CAS (see
<xref target="sec-chunk_guard4"/>).  No flexible file v1 layout
counterpart; introduced for the CHUNK operation set that
the flexible file v2 layout adds.</t>
          </li>
          <li>
            <t>ffv2m_checksum_algorithm: per-mirror integrity-checksum
algorithm.  No flexible file v1 layout counterpart;
introduced for the per-chunk checksum integrity the
flexible file v2 layout adds.</t>
          </li>
          <li>
            <t>ffv2m_stripes&lt;&gt;: replaces the flexible file v1 layout's
flat ffm_data_servers&lt;&gt;
with an array of ffv2_stripes4 (see <xref target="fig-ffv2_stripes4"/>),
allowing a single mirror to carry multiple stripe groups.</t>
          </li>
        </ul>
        <t>The ffv2m_checksum_algorithm field names the checksum
algorithm the client <bcp14>MUST</bcp14> use when computing
cwa_checksums on CHUNK_WRITE and cwra_checksums on
CHUNK_WRITE_REPAIR, and the algorithm the client <bcp14>MUST</bcp14>
expect in cr_checksum on CHUNK_READ responses, for chunks
in this mirror.  The metadata server picks the algorithm
at LAYOUTGET time; the value is one of the registered
checksum_algorithm4 codes (see <xref target="sec-checksum4"/>).
Different mirrors of the same file <bcp14>MAY</bcp14> name different
checksum algorithms, supporting transition cases where one
mirror is being migrated to a stronger algorithm while
others retain the previous algorithm.</t>
        <t>A client that does not implement the algorithm named in
ffv2m_checksum_algorithm <bcp14>MUST</bcp14> return the layout with
NFS4ERR_LAYOUT_CHECKSUM_NOT_SUPPORTED; the metadata
server may then issue a new layout naming a different
algorithm the client supports, or deny the layout request.</t>
        <t>The ffv2m_client_id is a 32-bit value, assigned by the metadata
server at layout-grant time, that the client <bcp14>MUST</bcp14> use as the
cg_client_id field of chunk_guard4 (see <xref target="sec-chunk_guard4"/>) in
every CHUNK_WRITE it issues against the mirror's data servers.
Its purpose is to satisfy the 32-bit-per-field budget of
chunk_guard4 while preserving the guarantee that concurrent
writers on the same file are distinguishable:</t>
        <ul spacing="normal">
          <li>
            <t>The NFSv4 clientid4 (<xref target="RFC8881"/>) is a 64-bit identifier;
<xref target="RFC8881"/> does not constrain how a server populates its
bits, and the bit-layout choices made by any particular
metadata server implementation are not visible to the
client and <bcp14>MUST NOT</bcp14> be assumed by the client.  Folding
clientid4 to 32 bits locally at the client therefore risks
colliding with another client's folded value, which would
violate the uniqueness contract on chunk_guard4.</t>
          </li>
          <li>
            <t>Only the metadata server has the information needed to avoid
such collisions: it sees every layout it grants on a file and
can assign a dense 32-bit ffv2m_client_id that is guaranteed
distinct from the ffv2m_client_ids assigned to other clients
holding concurrent write layouts on the same file.  The
metadata server <bcp14>MUST</bcp14> assign ffv2m_client_id subject to this
uniqueness rule.</t>
          </li>
          <li>
            <t>Because cg_client_id participates in the deterministic
tiebreaker for racing writers (see <xref target="sec-chunk_guard4"/>),
having the metadata server assign it also lets the metadata
server influence which client wins contention by choosing
the numeric ordering of the values it hands out.  Specific
ordering policies are implementation-defined and out of
scope for this document, but the protocol mechanism is
present.</t>
          </li>
        </ul>
        <t>An ffv2m_client_id is scoped to the file and layout for which it
was granted.  A client that holds layouts on two different files
may receive two different ffv2m_client_ids from the same metadata
server, and a client that relinquishes and later re-acquires a
layout on a given file <bcp14>MAY</bcp14> be assigned a different ffv2m_client_id.
ffv2m_client_id does NOT survive a metadata server restart: the
metadata server reassigns values as clients reclaim layouts
during the grace period.</t>
        <t>The ffv2m_encoding_type_data is which encoding type is used
by the mirror.</t>
        <t>The ffv2m_striping selects the striping method used by the
mirror.  The three permissible values are FFV2_STRIPING_NONE
(the mirror is not striped), FFV2_STRIPING_SPARSE (stripe units
are mapped to the same physical offset on every data server,
leaving holes), and FFV2_STRIPING_DENSE (stripe units are
packed contiguously on each data server without holes).  See
<xref target="sec-striping"/> for the mapping math for each option.</t>
        <t>The ffv2m_striping_unit_size is the stripe unit size used
by the mirror.  The minimum stripe unit size is 64 bytes.  If
the value of ffv2m_striping is FFV2_STRIPING_NONE, then the value
of ffv2m_striping_unit_size <bcp14>MUST</bcp14> be 1.</t>
        <t>The ffv2m_stripes is the array of stripes for the mirror; the
length of the array is the stripe count.  If there is no
striping or the ffv2m_encoding_type_data is FFV2_ENCODING_PASSTHROUGH,
then the length of ffv2m_stripes <bcp14>MUST</bcp14> be 1.  Under
FFV2_ENCODING_REPLICATED the file <bcp14>MAY</bcp14> be striped within each
replica; the constraint that ffv2s_data_servers length is 1
still applies, but ffv2m_stripes can carry multiple stripes.</t>
      </section>
      <section anchor="ffv2layout4">
        <name>ffv2_layout4</name>
        <figure anchor="fig-ffv2_layout4">
          <name>The ffv2_layout4</name>
          <sourcecode type="xdr"><![CDATA[
   /// struct ffv2_layout4 {
   ///     ffv2_mirror4            ffv2l_mirrors<>;
   ///     ffv2_flags4             ffv2l_flags;
   ///     uint32_t                ffv2l_stats_collect_hint;
   /// };
]]></sourcecode>
        </figure>
        <t>The ffv2_layout4 (in <xref target="fig-ffv2_layout4"/>) describes the Flexible
File Layout Version 2.</t>
        <t>The ffv2l_mirrors field is the array of mirrored storage devices that
provide the storage for the current stripe; see <xref target="fig-parallel-filesystem"/>.</t>
        <t>The ffv2l_stats_collect_hint field provides a hint to the client on
how often the server wants it to report LAYOUTSTATS for a file.
The time is in seconds.</t>
        <figure anchor="fig-parallel-filesystem">
          <name>The Relationship between Metadata Server and Data Servers</name>
          <artwork><![CDATA[
                +-----------+
                |           |
                |           |
                |   File    |
                |           |
                |           |
                +-----+-----+
                      |
     +-------------+-----+----------------+
     |                   |                |
+----+-----+       +-----+----+       +---+----------+
| Mirror 1 |       | Mirror 2 |       | Mirror 3     |
| MIRRORED |       | MIRRORED |       | REED_SOLOMON |
+----+-----+       +-----+----+       +---+----------+
     |                   |                |
     |                   |                |
+-----------+      +-----------+      +-----------+
|+-----------+     | Stripe 1  |      |+-----------+
+| Stripe N  |     +-----------+      +| Stripe N  |
 +-----------+           |             +-----------+
     |                   |                |
     |                   |                |
+-----------+      +-----------+      +-----------+
| Storage   |      | Storage   |      |+-----------+
| Device    |      | Device    |      ||+-----------+
+-----------+      +-----------+      +||  Storage  |
                                       +|  Devices  |
                                        +-----------+
]]></artwork>
        </figure>
        <t>As shown in <xref target="fig-parallel-filesystem"/> if the ffv2m_encoding_type_data
is FFV2_ENCODING_PASSTHROUGH or FFV2_ENCODING_REPLICATED, then each
of the stripes <bcp14>MUST</bcp14> only have 1 storage device.  I.e., the length
of ffv2s_data_servers <bcp14>MUST</bcp14> be 1.  The erasure-coding encoding types
distribute shards across multiple storage devices and so carry
multiple entries in ffv2s_data_servers.</t>
        <t>The abstraction here is that for FFV2_ENCODING_PASSTHROUGH and
FFV2_ENCODING_REPLICATED, each stripe describes exactly one data
server.  And for the erasure-coded encoding types, each of the
stripes describes a set of data servers to which the shards are
distributed.  Further, the payload length can be different per
stripe.</t>
      </section>
      <section anchor="sec-ffv2-layouthint">
        <name>ffv2_layouthint4</name>
        <figure anchor="fig-ffv2_layouthint4">
          <name>The ffv2_layouthint4</name>
          <sourcecode type="xdr"><![CDATA[
   /// struct ffv2_layouthint4 {
   ///     ffv2_encoding_type4       ffv2lh_supported_types<>;
   ///     ffv2_data_protection4   ffv2lh_preferred_protection;
   ///     uint32_t                ffv2lh_stripe_unit;
   ///     uint64_t                ffv2lh_expected_file_size;
   /// };
]]></sourcecode>
        </figure>
        <t>The ffv2_layouthint4 (in <xref target="fig-ffv2_layouthint4"/>) describes the
layout_hint (see <xref section="5.12.4" sectionFormat="of" target="RFC8881"/>) that the client can
provide to the metadata server.</t>
        <t>The client provides four hints.  All four are advisory; the
metadata server <bcp14>MAY</bcp14> honor any subset and <bcp14>MAY</bcp14> override any of
them per administrative policy.</t>
        <dl>
          <dt>ffv2lh_supported_types</dt>
          <dd>
            <t>An ordered list of encoding types the client supports,
with the most preferred type first.  The server <bcp14>SHOULD</bcp14> select a type
from this list but <bcp14>MAY</bcp14> choose any type it supports.  If the server
does not support any of the listed types, it returns
NFS4ERR_ENCODING_NOT_SUPPORTED, and the client can retry
with a different list to discover the overlapping set.</t>
          </dd>
          <dt>ffv2lh_preferred_protection</dt>
          <dd>
            <t>The client's preferred data protection geometry as a
(ffv2dp_data, ffv2dp_parity) pair.  The server <bcp14>SHOULD</bcp14> honor this hint but
<bcp14>MAY</bcp14> override it based on server-side policy.  A server that manages
data protection via administrative policy (e.g., per-directory or
per-export objectives) will typically ignore this hint and return the
geometry dictated by policy.</t>
          </dd>
          <dt>ffv2lh_stripe_unit</dt>
          <dd>
            <t>The client's preferred stripe unit size in bytes.  A value of
zero means "no hint" -- the metadata server selects a stripe unit
from policy or from file history.  When the value is non-zero,
the metadata server <bcp14>SHOULD</bcp14> use it as the per-mirror stripe unit
when policy permits.  The metadata server <bcp14>MAY</bcp14> round to a
server-supported alignment.  The metadata server <bcp14>MAY</bcp14> return
NFS4ERR_INVAL when a non-zero value is below an
implementation-defined floor or above an implementation-defined
ceiling.  The hint <bcp14>SHOULD</bcp14> be a power of two.</t>
          </dd>
          <dt>ffv2lh_expected_file_size</dt>
          <dd>
            <t>The client's hint at the file's eventual size in bytes.  A
value of zero means "no hint."  When the value is non-zero, the
metadata server <bcp14>MAY</bcp14> use it to decide whether to issue a striped
layout (typically for files large enough that striping pays for
itself) versus a non-striped layout (typically for files
expected to remain small).  The hint applies to the layout
being requested and has no retroactive effect on layouts
already issued.  The hint is never required to be accurate; a
file is free to grow beyond its hint without protocol penalty,
and the metadata server is free to ignore the hint.</t>
          </dd>
        </dl>
        <t>The stripe_unit and expected_file_size hints are most useful at
the LAYOUTGET that follows file creation, when the file is at
size zero and the metadata server has no usage history to drive
its own striping decision.  On a LAYOUTGET against an
already-grown file, the metadata server <bcp14>SHOULD</bcp14> ignore both
hints and use the file's actual size and access history.</t>
        <t>For example, a client that prefers Mojette systematic with 8+2
protection, 1 MiB stripe units, and is creating a file expected
to grow to 16 GiB would send:</t>
        <artwork><![CDATA[
ffv2lh_supported_types = { FFV2_ENCODING_PASSTHROUGH,
                         FFV2_ENCODING_REPLICATED,
                         FFV2_ENCODING_MOJETTE_SYSTEMATIC,
                         FFV2_ENCODING_RS_VANDERMONDE }
ffv2lh_preferred_protection = { ffv2dp_data = 8, ffv2dp_parity = 2 }
ffv2lh_stripe_unit          = 1048576
ffv2lh_expected_file_size   = 17179869184
]]></artwork>
        <t>A server with a policy of RS 4+2 for this directory would ignore
both encoding hints and return a layout with
FFV2_ENCODING_RS_VANDERMONDE and (ffv2dp_data=4, ffv2dp_parity=2).  A
server without erasure coding might return FFV2_ENCODING_REPLICATED
with (ffv2dp_data=3, ffv2dp_parity=0) for 3-way mirroring with
per-chunk integrity, or FFV2_ENCODING_PASSTHROUGH with
(ffv2dp_data=1, ffv2dp_parity=2) for 3-way flexible file v1 layout-compatible
mirroring without per-chunk integrity.</t>
        <t>A server may also use ffv2lh_expected_file_size as a striping
gate: a deployment that wants to avoid the runway and bookkeeping
overhead of striping small files (which dominate file-count even
when they do not dominate byte count) can use a single-mirror
non-striped layout for any LAYOUTGET whose hint is below a
configured threshold, and a striped layout above it.  Without
the hint the metadata server must either always stripe, never
stripe, or rely on observing the file's growth -- which is
exactly the friction the hint exists to remove.</t>
        <section anchor="sec-encoding-negotiation">
          <name>Encoding Negotiation</name>
          <t>Because the encoding type registry is expected to grow over time
(new erasure encoding types are added, older ones fall out of favor,
vendors register private codes; see <xref target="iana-considerations"/>),
neither clients nor metadata servers are required to implement
every registered encoding.  The protocol negotiates encoding
capabilities via ffv2_layouthint4:</t>
          <dl>
            <dt>Client-side advertisement:</dt>
            <dd>
              <t>A client that wishes to influence encoding selection <bcp14>SHOULD</bcp14>
send the set of encodings it actually implements in
ffv2lh_supported_types.  A client <bcp14>MUST NOT</bcp14> claim support for
an encoding it cannot encode or decode: a false advertisement
produces silent data unavailability when the resulting layout
is issued.</t>
            </dd>
            <dt>Metadata-server selection at file creation:</dt>
            <dd>
              <t>When the LAYOUTGET is against a newly-created file (the file
has no committed data yet), the metadata server has real
discretion.  It <bcp14>SHOULD</bcp14> select an encoding from the client's
ffv2lh_supported_types list when the server's policy permits.
The server <bcp14>MAY</bcp14> override the hint when its policy dictates a
specific encoding (for example, per-export objectives); in that
case the server issues a layout with the policy-dictated
encoding and the client <bcp14>MUST</bcp14> either honor it or fail its I/O
with NFS4ERR_ENCODING_NOT_SUPPORTED.</t>
            </dd>
            <dt>Metadata-server selection for an existing file:</dt>
            <dd>
              <t>When the LAYOUTGET is against a file that already has
committed data on the data servers, the file's encoding is
fixed by the bytes already written; the metadata server does
not choose an encoding at layout-issue time.  Re-encoding an
existing file is a separate operation (see the
heterogeneous mirror set primitive in
<xref target="sec-heterogeneous-mirrors"/> and the migration paths in the
proxy server draft), not a consequence of a LAYOUTGET hint.  In this case
ffv2lh_supported_types is not a selection input; it is an
admissibility check.  The metadata server issues a layout
with the file's actual encoding and evaluates whether the
client can consume it:
</t>
              <ul spacing="normal">
                <li>
                  <t>If the file's encoding is in the client's
ffv2lh_supported_types list, the metadata server issues
the layout normally.</t>
                </li>
                <li>
                  <t>If it is not, the metadata server takes one of the
fallback actions enumerated in "Fallback when no overlap
exists" below (return NFS4ERR_ENCODING_NOT_SUPPORTED,
route I/O through the metadata server, or route through
a translating proxy server).</t>
                </li>
              </ul>
            </dd>
            <dt>Fallback when no overlap exists:</dt>
            <dd>
              <t>If the server's policy cannot be satisfied by any encoding the
client supports, the metadata server has three options:
</t>
              <ol spacing="normal" type="1"><li>
                  <t>Return NFS4ERR_ENCODING_NOT_SUPPORTED on the LAYOUTGET.
The client <bcp14>MAY</bcp14> retry with a different (possibly empty)
ffv2lh_supported_types list to learn the server's encoding
repertoire through the errors returned.</t>
                </li>
                <li>
                  <t>Fall back to I/O via the metadata server itself, so the
client's reads and writes are satisfied by the metadata server
translating to the underlying data server encoding on the client's
behalf (see <xref target="sec-Fencing-Clients"/> for the metadata-server I/O
fallback).  This is correct but serializes all I/O for
the encoding-ignorant client through a single actor.</t>
                </li>
                <li>
                  <t>Route the client through a translating proxy that
understands both the file's native encoding and an encoding
the client does support.  The metadata server issues a layout with
the proxy's data-server entry carrying
FFV2_DS_FLAGS_PROXY and a coding_type the client does
support (typically FFV2_ENCODING_REPLICATED for a minimal
NFSv4.2 client, or FFV2_ENCODING_PASSTHROUGH / a flat
NFSv3 view for an NFSv3 client).  The proxy encodes
and decodes on the fly
against the real data servers.  This preserves parallel I/O
for the encoding-ignorant client that the metadata-server I/O
fallback loses.  The proxy registration, directive, and
credential-forwarding rules are defined in the proxy server
draft; this draft defines only the layout flag
(FFV2_DS_FLAGS_PROXY in
<xref target="sec-ffv2_ds_flags4"/>) that makes the proxy visible to
the client.</t>
                </li>
              </ol>
              <t>Options (1), (2), and (3) are not mutually exclusive: a
given deployment <bcp14>MAY</bcp14> implement any combination.  A
deployment that supports (3) covers all the clients that
(1) and (2) would cover and additionally preserves parallel
I/O for encoding-ignorant clients.</t>
            </dd>
            <dt>Runtime encoding change:</dt>
            <dd>
              <t>If a metadata server changes its encoding policy after layouts
have been issued (for example, a deployment upgrade that
retires an older encoding), the metadata server <bcp14>MUST</bcp14> recall the
affected layouts via CB_LAYOUTRECALL and may re-issue new
layouts with the new encoding.  Clients that do not support the
new encoding LAYOUTRETURN with NFS4ERR_ENCODING_NOT_SUPPORTED,
and the server either grants a layout using a mutually-supported encoding or the client falls back to I/O via the
metadata server.</t>
            </dd>
          </dl>
          <t>This mechanism deliberately avoids a separate capability-bit
handshake at EXCHANGE_ID.  ffv2_layouthint4 already provides
per-request negotiation; adding a session-level
capability set would duplicate it and would complicate encoding
upgrades without additional value, because a client that
genuinely upgrades its encoding set at runtime can simply update
the ffv2lh_supported_types on its next LAYOUTGET.</t>
          <t>Note: In <xref target="fig-ffv2_layout4"/> ffv2_encoding_type_data4 is an enumerated
union with the payload of each arm being defined by the protection
type. ffv2m_client_id tells the client which id to use when interacting
with the data servers.</t>
          <t>The ffv2_layout4 structure (see <xref target="fig-ffv2_layout4"/>) specifies a layout
in that portion of the data file described in the current layout
segment.  It is either a single instance or a set of mirrored copies
of that portion of the data file.  When mirroring is in effect, it
protects against loss of data in layout segments.</t>
          <t>While not explicitly shown in <xref target="fig-ffv2_layout4"/>, each layout4
element returned in the logr_layout array of LAYOUTGET4res (see
<xref section="18.43.2" sectionFormat="of" target="RFC8881"/>) describes a layout segment.  Hence,
each ffv2_layout4 also describes a layout segment.  It is possible
that the file is concatenated from more than one layout segment.
Each layout segment <bcp14>MAY</bcp14> represent different striping parameters.</t>
          <t>The ffv2m_striping_unit_size field (inside each ffv2_mirror4) is
the stripe unit size in use for that mirror.  The stripe width
W is given by the number of elements in ffv2s_data_servers
within each ffv2_stripes4 (the count of data servers over which
each stripe is spread).  If ffv2m_striping is FFV2_STRIPING_NONE
the mirror is unstriped and ffv2m_striping_unit_size <bcp14>MUST</bcp14> be 1
(matching the FFV2_STRIPING_NONE rule in <xref target="sec-ffv2-mirror4"/>
and <xref target="sec-striping"/>); when ffv2m_striping is
FFV2_STRIPING_SPARSE or FFV2_STRIPING_DENSE the field carries
the stripe unit size in bytes with a minimum of 64.  The
mapping scheme (sparse or dense) is selected per mirror by
ffv2m_striping and is detailed in <xref target="sec-striping"/>.</t>
          <t>Stripe unit size and stripe count <bcp14>MAY</bcp14> differ between mirrors in
the same layout segment.  In particular, mirrors of different
encoding types (see <xref target="sec-heterogeneous-mirrors"/>) have stripe
counts determined by their respective (ffv2dp_data, ffv2dp_parity)
protection structures, and there is no requirement that those
structures match across mirrors.  Each mirror is self-consistent
internally; cross-mirror coherence is at the byte level (every
mirror represents the same file bytes), not at the stripe-geometry
level.</t>
          <t>The ffv2l_mirrors field represents an array of state information for
each mirrored copy of the current layout segment.  Each element is
described by a ffv2_mirror4 type.</t>
          <t>ffv2ds_deviceid provides the deviceid of the storage device holding
the data file.</t>
          <t>ffv2ds_file_info is an array of ffv2_file_info4 structures, each
pairing a filehandle (ffv2fi_fh_vers) with a stateid (ffv2fi_stateid).
There <bcp14>MUST</bcp14> be exactly as many elements in ffv2ds_file_info as there
are in ffv2da_versions.  Each element of the array corresponds to a
particular combination of ffv2dv_version, ffv2dv_minorversion, and
ffv2dv_coupling provided for the device.  The array allows for
server implementations that have different filehandles and stateids
for different combinations of version, minor version, and coupling
strength.  See <xref target="sec-version-errors"/> for how to handle versioning
issues between the client and storage devices.</t>
          <t>For tight coupling, ffv2fi_stateid provides the stateid to be used
by the client to access the file.  The metadata server registers
ffv2fi_stateid with each tight coupling capable storage device via
TRUST_STATEID (see <xref target="sec-tight-coupling-control"/>) before returning
the layout; the storage device validates subsequent CHUNK operations
against its trust table.</t>
          <t>For loose coupling and an NFSv4 storage device (necessarily a
PASSTHROUGH mirror per <xref target="sec-ff_device_addr4"/>, since non-PASSTHROUGH
encodings require tight coupling), the client <bcp14>MUST</bcp14>
use the anonymous stateid to perform I/O on the storage device,
because the metadata server stateid has no meaning to a storage
device that is not participating in the control protocol.  In
this case the metadata server <bcp14>MUST</bcp14> set ffv2fi_stateid to the
anonymous stateid.</t>
          <t>For an NFSv3 storage device (ffv2dv_version = 3), the tight coupling
model does not apply: <xref target="sec-ff_device_addr4"/> requires
ffv2dv_coupling to equal FFV2_COUPLING_SYNTHETIC_UIDS whenever
ffv2dv_version equals 3, because NFSv3 has no wire encoding for
stateids.  The corresponding
ffv2fi_stateid element in the ffv2ds_file_info array <bcp14>MUST</bcp14> therefore
be the anonymous stateid and is unused; an NFSv3 data server uses
the synthetic-uid fencing model (see <xref target="sec-Fencing-Clients"/>)
rather than a stateid-based trust table.</t>
          <t>This specification of the ffv2fi_stateid restricts both models for
NFSv4.x storage protocols:</t>
          <dl>
            <dt>loosely couple</dt>
            <dd>
              <t>the stateid has to be an anonymous stateid</t>
            </dd>
            <dt>tightly couple</dt>
            <dd>
              <t>the stateid has to be a global stateid</t>
            </dd>
          </dl>
          <t>By pairing each ffv2fi_fh_vers with its own ffv2fi_stateid inside
ffv2_file_info4, the flexible file v2 layout addresses a limitation
in the flexible file v1 layout where a single stateid was shared
across all filehandles.</t>
          <t>Whether the ffv2fi_stateid values across an ffv2_file_info4 array
are distinct depends on each entry's coupling mode per the rules
above.  Loose-coupling and NFSv3 entries <bcp14>MUST</bcp14> carry the anonymous
stateid; those entries are therefore byte-identical by mandate.
Tight-coupling entries carry stateids the metadata server assigned
and registered via TRUST_STATEID; the metadata server <bcp14>MAY</bcp14> assign
these distinctly per filehandle version or <bcp14>MAY</bcp14> reuse the same
stateid across entries.</t>
          <t>The client <bcp14>MUST</bcp14> treat each (ffv2fi_fh_vers, ffv2fi_stateid) pair as
an opaque, independent authorization unit.  The client <bcp14>MUST NOT</bcp14>
compare ffv2fi_stateid values across entries in the array and <bcp14>MUST
NOT</bcp14> infer any relationship between two entries whose stateid values
are byte-identical.  When the client selects an entry to use for
I/O, it presents that entry's stateid with that entry's filehandle;
other entries in the array are unused for that I/O.</t>
          <t>For loosely coupled storage devices, ffv2ds_user and ffv2ds_group
provide the synthetic user and group to be used in the RPC credentials
that the client presents to the storage device to access the data
files.  For tightly coupled storage devices, the user and group on
the storage device will be the same as on the metadata server; that
is, if ffv2dv_coupling has any tight coupling flag set (see
<xref target="sec-ff_device_addr4"/>), then the client <bcp14>MUST</bcp14> ignore both
ffv2ds_user and ffv2ds_group.</t>
          <t>The allowed values for both ffv2ds_user and ffv2ds_group are specified
as owner and owner_group, respectively, in <xref section="5.9" sectionFormat="of" target="RFC8881"/>.
For NFSv3 compatibility, user and group strings that consist of
decimal numeric values with no leading zeros can be given a special
interpretation by clients and servers that choose to provide such
support.  The receiver may treat such a user or group string as
representing the same user as would be represented by an NFSv3 uid
or gid having the corresponding numeric value.  Note that if using
Kerberos for security, the expectation is that these values will
be a name@domain string.</t>
          <t>ffv2ds_efficiency describes the metadata server's evaluation as to
the effectiveness of each mirror.  Note that this is per layout and
not per device as the metric may change due to perceived load,
availability to the metadata server, etc.  Higher values denote
higher perceived utility.  The way the client can select the best
mirror to access is discussed in <xref target="sec-select-mirror"/>.</t>
        </section>
        <section anchor="error-codes-from-layoutget">
          <name>Error Codes from LAYOUTGET</name>
          <t><xref target="RFC8881"/> provides little guidance as to how the client is to
proceed with a LAYOUTGET that returns an error of either
NFS4ERR_LAYOUTTRYLATER, NFS4ERR_LAYOUTUNAVAILABLE, and NFS4ERR_DELAY.
Within the context of this document:</t>
          <dl>
            <dt>NFS4ERR_LAYOUTUNAVAILABLE:</dt>
            <dd>
              <t>there is no layout available and the I/O is to go to the metadata
server.  Note that it is possible to have had a layout before a
recall and not after.</t>
            </dd>
            <dt>NFS4ERR_LAYOUTTRYLATER:</dt>
            <dd>
              <t>there is some issue preventing the layout from being granted.
If the client already has an appropriate layout, it should continue
with I/O to the storage devices.</t>
            </dd>
            <dt>NFS4ERR_DELAY:</dt>
            <dd>
              <t>there is some issue preventing the layout from being granted.
If the client already has an appropriate layout, it should not
continue with I/O to the storage devices.</t>
            </dd>
          </dl>
        </section>
        <section anchor="client-interactions-with-ffv2flagsnoiothrumds">
          <name>Client Interactions with FFV2_FLAGS_NO_IO_THRU_MDS</name>
          <t>FFV2_FLAGS_NO_IO_THRU_MDS is normative: when the metadata
server sets FFV2_FLAGS_NO_IO_THRU_MDS on a layout, the client
<bcp14>MUST NOT</bcp14> proxy I/O for that layout through the metadata server,
even after detecting a network disconnect to a storage device
(<xref target="sec-ffv2_flags4"/>).  A client that cannot reach a storage
device on which it holds a NO_IO_THRU_MDS layout <bcp14>MUST</bcp14> return
the layout via LAYOUTRETURN and reacquire (via LAYOUTGET), at
which point the metadata server chooses whether to grant a new
layout with the flag cleared, grant a layout naming a different
storage device, or fall back to metadata-server-terminated I/O
via the encoding-negotiation path
(<xref target="sec-encoding-negotiation"/>) with the flag cleared.</t>
          <t>The NO_IO_THRU_MDS flag is not advisory; it is an
instruction the client <bcp14>MUST</bcp14> honor.  When I/O through the
metadata server is required (for example, via the
encoding-negotiation fallback path in <xref target="sec-encoding-negotiation"/>),
the metadata server <bcp14>MUST</bcp14> clear NO_IO_THRU_MDS on the
fallback layout it issues.  A client <bcp14>MUST NOT</bcp14> interpret
a set NO_IO_THRU_MDS flag as advisory or bypass it.</t>
        </section>
      </section>
      <section anchor="layoutcommit-1">
        <name>LAYOUTCOMMIT</name>
        <t>The flexible file v2 layout does not use lou_body inside the
loca_layoutupdate argument to LAYOUTCOMMIT.  If lou_type is
LAYOUT4_FLEX_FILES_V2, the lou_body field <bcp14>MUST</bcp14> have a zero length (see
<xref section="18.42.1" sectionFormat="of" target="RFC8881"/>).</t>
      </section>
      <section anchor="interactions-between-devices-and-layouts">
        <name>Interactions between Devices and Layouts</name>
        <t>The file layout type is defined such that the relationship between
multipathing and filehandles can result in either 0, 1, or N
filehandles (see <xref section="13.3" sectionFormat="of" target="RFC8881"/>).  Some rationales for
this are clustered servers that share the same filehandle or allow
for multiple read-only copies of the file on the same storage device.
In the flexible file v2 layout, while there is an array of
filehandles, they are independent of the multipathing being used.
If the metadata server wants to provide multiple read-only copies
of the same file on the same storage device, then it should provide
multiple mirrored instances, each with a different ffv2_device_addr4.
The client can then determine that, since each of the ffv2fi_fh_vers
values within ffv2ds_file_info are different, there are multiple
copies of the file for the current layout segment available.</t>
      </section>
      <section anchor="sec-version-errors">
        <name>Handling Version Errors</name>
        <t>When the metadata server provides the ffv2da_versions array in the
ffv2_device_addr4 (see <xref target="sec-ff_device_addr4"/>), the client is
able to determine whether or not it can access a storage device
with any of the supplied combinations of ffv2dv_version,
ffv2dv_minorversion, and ffv2dv_coupling.  However, due to the limitations of
reporting errors in GETDEVICEINFO (see Section 18.40 in <xref target="RFC8881"/>),
the client is not able to specify which specific device it cannot
communicate with over one of the provided ffv2dv_version and
ffv2dv_minorversion combinations.  Using ffv2_ioerr4 (<xref target="sec-ffv2_ioerr4"/>)
inside either the LAYOUTRETURN (see <xref section="18.44" sectionFormat="of" target="RFC8881"/>)
or the LAYOUTERROR (see <xref section="15.6" sectionFormat="of" target="RFC7862"/> and <xref target="sec-LAYOUTERROR"/>
of this document), the client can isolate the problematic storage
device.</t>
        <t>The error code to return for LAYOUTRETURN and/or LAYOUTERROR is
NFS4ERR_MINOR_VERS_MISMATCH.  It does not matter whether the mismatch
is a major version (e.g., client can use NFSv3 but not NFSv4) or
minor version (e.g., client can use NFSv4.1 but not NFSv4.2), the
error indicates that for all the supplied combinations for ffv2dv_version
and ffv2dv_minorversion, the client cannot communicate with the storage
device.  The client can retry the GETDEVICEINFO to see if the
metadata server can provide a different combination, or it can fall
back to doing the I/O through the metadata server.</t>
      </section>
    </section>
    <section anchor="sec-striping">
      <name>Striping</name>
      <t>The flexible file v2 layout inherits the dense and sparse striping
dispositions defined by the file layout type in <xref section="13.4" sectionFormat="of" target="RFC8881"/>.  The disposition for a given mirror is selected by the
ffv2m_striping field (see <xref target="sec-ffv2-mirror4"/>) and applies to every
data server in that mirror's ffv2s_data_servers list.  Three values
are permitted:</t>
      <dl>
        <dt>FFV2_STRIPING_NONE:</dt>
        <dd>
          <t>The mirror is not striped.  ffv2m_striping_unit_size <bcp14>MUST</bcp14> be 1
and ffv2m_stripes <bcp14>MUST</bcp14> contain exactly one stripe.  The entire
mirror lives on that stripe's single data server list, with
no offset transformation.</t>
        </dd>
        <dt>FFV2_STRIPING_SPARSE:</dt>
        <dd>
          <t>Logical offsets within the file map to the same numeric
offset on each data server.  A data server that does not own
the stripe unit at a given logical offset presents a hole at
that offset.  This is the simpler model and matches the
mental picture of "the file is laid out end-to-end on each
data server, but each data server stores only its stripe
units".</t>
        </dd>
        <dt>FFV2_STRIPING_DENSE:</dt>
        <dd>
          <t>Stripe units owned by a given data server are packed
contiguously on that data server, with no holes.  The
logical offset is transformed into a compact physical offset
on the target data server.  This matches pre-existing
deployments that follow the dense layout convention of
<xref section="13.4.4" sectionFormat="of" target="RFC8881"/>.</t>
        </dd>
      </dl>
      <t>The mapping math for sparse and dense is given in
<xref target="fig-striping-math"/>.  Common definitions apply to both.</t>
      <figure anchor="fig-striping-math">
        <name>Sparse and dense stripe mapping math</name>
        <artwork><![CDATA[
L: logical offset within the file (bytes)
U: stripe-unit size in bytes  = ffv2m_striping_unit_size
W: stripe width               = length of ffv2s_data_servers
S: stripe size in bytes       = W * U
N: stripe number              = L / S
i: index (0-based) of the data server that owns L
                              = (L / U) mod W
R: byte offset within the stripe unit
                              = L mod U

FFV2_STRIPING_SPARSE:
  physical offset on data server i:
      P_sparse(L) = L
  other data servers see a hole at offset L.

FFV2_STRIPING_DENSE:
  physical offset on data server i:
      P_dense(L) = N * U + R
             = (L / S) * U + (L mod U)
  each data server stores only the stripe units it owns,
  packed contiguously.
]]></artwork>
      </figure>
    </section>
    <section anchor="recovering-from-client-io-errors">
      <name>Recovering from Client I/O Errors</name>
      <t>The pNFS client may encounter errors when directly accessing the
storage devices.  However, it is the responsibility of the metadata
server to recover from the I/O errors.  When the LAYOUT4_FLEX_FILES_V2
layout type is used, the client <bcp14>MUST</bcp14> report the I/O errors to the
server at LAYOUTRETURN time using the ffv2_ioerr4 structure (see
<xref target="sec-ffv2_ioerr4"/>).</t>
      <t>The metadata server analyzes the error and determines the required
recovery operations such as recovering media failures or reconstructing
missing data files.</t>
      <t>The metadata server <bcp14>MUST</bcp14> recall any outstanding layouts to allow
it exclusive write access to the stripes being recovered and to
prevent other clients from hitting the same error condition.  In
these cases, the server <bcp14>MUST</bcp14> complete recovery before handing out
any new layouts to the affected byte ranges.</t>
      <t>The client's retry disposition depends on which encoding the
affected mirror uses.  The two subsections below split the
encoding types into two families: mirrored / PASSTHROUGH (where
the storage device holds the file's bytes directly, so retrying
the I/O through the metadata server is possible), and the
chunked encodings (where the storage device holds encoded
shards, so retrying the I/O through the metadata server is
meaningful only if a proxy server is available to translate).</t>
      <section anchor="sec-io-error-retry-mirrored">
        <name>Retry policy for mirrored and PASSTHROUGH encodings</name>
        <t>For a mirror using FFV2_ENCODING_REPLICATED or
FFV2_ENCODING_PASSTHROUGH, the storage device holds the file's
bytes directly (no chunk envelope, no encoding transform), and
an ordinary NFS READ or WRITE on the metadata server accesses
the same bytes.</t>
        <t>Although the client implementation has the option to propagate
a corresponding error to the application that initiated the I/O
operation and drop any unwritten data, the client should attempt
to retry the original I/O operation by either requesting a new
layout or sending the I/O via regular NFSv4.1+ READ or WRITE
operations to the metadata server.  The client <bcp14>SHOULD</bcp14> attempt to
retrieve a new layout and retry the I/O operation using the storage
device first and only retry the I/O operation via the metadata
server if the error persists.</t>
      </section>
      <section anchor="sec-io-error-retry-chunked">
        <name>Retry policy for chunked (erasure-coded) encodings</name>
        <t>For a mirror using any chunked encoding (any FFV2<em>ENCODING</em>*
value other than FFV2_ENCODING_PASSTHROUGH), the storage device
holds encoded shards inside chunk envelopes rather than the
file's bytes, and retrying the I/O through the metadata server
as a regular NFS READ or WRITE against the file is not an
equivalent fallback: the metadata server does not hold the
encoded shards, and the file's bytes are recoverable only by
decoding through the mirror's erasure transform.  The client's
retry disposition is correspondingly different.</t>
        <t>For a CHUNK_READ error, the client <bcp14>SHOULD</bcp14> attempt local
reconstruction from surviving shards before returning the layout,
provided the encoding is a k + m code and the client holds
(directly or by fetching from unaffected data servers in the
same stripe) at least k surviving shards.  A successful local
reconstruction satisfies the read; the client <bcp14>MUST</bcp14> still record
the ioerr and report it at LAYOUTRETURN so the metadata server
can drive repair via CB_CHUNK_REPAIR and the repair-actor flow
(<xref target="sec-repair-selection"/>).</t>
        <t>For a CHUNK_WRITE error, or when a CHUNK_READ error cannot be
satisfied by local reconstruction (fewer than k surviving
shards, or a non-recoverable chunk_guard4 CAS failure), the
client <bcp14>SHOULD</bcp14> return the layout with the ioerr recorded after
its own storage-device-directed retries (multipath, transient
error) have been exhausted.  The client <bcp14>MUST NOT</bcp14> retry the
same I/O through the metadata server as a regular NFSv4.1+
READ or WRITE against the file: the metadata server does not
hold the encoded shards, so an I/O through the metadata server
would either be rejected or would bypass the encoding transform
and corrupt the file.</t>
        <t>Retrying the I/O through the metadata server is meaningful for
a chunked encoding only when a proxy server is available to
translate on the metadata server's behalf: the proxy server
admits the client's I/O, performs the encoding transform, and
issues the corresponding CHUNK operations to the data servers.
When no proxy server is available for the affected file, the
client's remaining option is to re-request a layout after the
metadata server has driven repair to completion.</t>
      </section>
    </section>
    <section anchor="client-side-protection-modes">
      <name>Client-Side Protection Modes</name>
      <section anchor="sec-CSM">
        <name>Client-Side Mirroring</name>
        <t>The flexible file v2 layout has a simple model in place for the
mirroring of the file data constrained by a layout segment.  Each
mirror in ffv2l_mirrors is an independent representation of the
file's contents for that segment: the XDR (see <xref target="fig-ffv2_mirror4"/>)
lets each mirror carry its own encoding
(ffv2m_encoding_type_data), its own striping pattern
(ffv2m_striping and ffv2m_stripes), and its own set of data
servers.  A single layout <bcp14>MAY</bcp14> combine dissimilar mirrors -- for
example, one FFV2_ENCODING_REPLICATED mirror and one
FFV2_ENCODING_RS_VANDERMONDE mirror of the same file contents,
as sketched in <xref target="fig-parallel-filesystem"/> -- and there is no
cross-mirror constraint that striping patterns or encoding
choices match.</t>
        <t>There is likewise no assumption that each copy of the mirror is
stored identically on the storage devices.  For example, one device
might employ compression or deduplication on the data.  What each
mirror <bcp14>MUST</bcp14> provide is the same reconstructed file contents on
read (after any decoding through the mirror's encoding
transform); the on-disk representation and the wire representation
per mirror are consequences of that mirror's independently
selected encoding.</t>
        <t>The metadata server is responsible for determining the number of
mirrored copies and the location of each mirror.  While the client
may provide a hint to how many copies it wants (see <xref target="sec-ffv2-layouthint"/>),
the metadata server can ignore that hint; in any event, the client
has no means to dictate either the storage device (which also means
the coupling and/or protocol levels to access the layout segments)
or the location of said storage device.</t>
        <t>The updating of mirrored layout segments is done via client-side
mirroring.  With this approach, the client is responsible for making
sure modifications are made on all copies of the layout segments
it is informed of via the layout.  If a layout segment is being
resilvered to a storage device, that mirrored copy will not be in
the layout.  Thus, the metadata server (or a proxy server acting
on its behalf, if one is available for the file) <bcp14>MUST</bcp14> update that
copy until the client is presented it in a layout.  If the
FFV2_FLAGS_WRITE_ONE_MIRROR is set in ffv2l_flags, the client
need only update one of the mirrors (see <xref target="sec-write-mirrors"/>).
If the client is writing to the layout segments via the metadata
server, then the metadata server (or a proxy server acting on its
behalf) <bcp14>MUST</bcp14> update all copies of the mirror; see the encoding
constraint on FFV2_FLAGS_WRITE_ONE_MIRROR in <xref target="sec-ffv2_flags4"/>
for the case where doing so requires the propagation actor to
translate across encodings.  As seen in <xref target="sec-mds-resilvering"/>,
during the resilvering, the layout is recalled, and the client
has to make modifications through the metadata-server side.</t>
        <section anchor="sec-select-mirror">
          <name>Selecting a Mirror</name>
          <t>When the metadata server grants a layout to a client, it <bcp14>MAY</bcp14> let
the client know how fast it expects each mirror to be once the
request arrives at the storage devices via the ffv2ds_efficiency
member.  While the algorithms to calculate that value are left to
the metadata server implementations, factors that could contribute
to that calculation include speed of the storage device, physical
memory available to the device, operating system version, current
load, etc.</t>
          <t>However, what should not be involved in that calculation is a
perceived network distance between the client and the storage device.
The client is better situated for making that determination based
on past interaction with the storage device over the different
available network interfaces between the two; that is, the metadata
server might not know about a transient outage between the client
and storage device because it has no presence on the given subnet.</t>
          <t>As such, it is the client that decides which mirror to access for
reading the file.  The requirements for writing to mirrored layout
segments are presented below.</t>
        </section>
        <section anchor="sec-write-mirrors">
          <name>Writing to Mirrors</name>
          <section anchor="single-storage-device-updates-mirrors">
            <name>Single Storage Device Updates Mirrors</name>
            <t>If the FFV2_FLAGS_WRITE_ONE_MIRROR flag in ffv2l_flags is set, the
client <bcp14>MAY</bcp14> update just one of the copies of the layout segment.
For this case, the storage device <bcp14>MUST</bcp14> ensure that all copies of
the mirror are updated when any one of the mirrors is updated.  If
the storage device gets an error when updating one of the mirrors,
then it <bcp14>MUST</bcp14> inform the client that the original WRITE had an error.
The client then <bcp14>MUST</bcp14> inform the metadata server (see <xref target="sec-write-errors"/>).
The client's responsibility with respect to COMMIT is explained in
<xref target="sec-write-commits"/>.  The client may choose any one of the mirrors
and may use ffv2ds_efficiency as described in <xref target="sec-select-mirror"/>
when making this choice.</t>
          </section>
          <section anchor="client-updates-all-mirrors">
            <name>Client Updates All Mirrors</name>
            <t>If the FFV2_FLAGS_WRITE_ONE_MIRROR flag in ffv2l_flags is not set, the
client is responsible for updating all mirrored copies of the layout
segments that it is given in the layout.  A single failed update
is sufficient to fail the entire operation.  If all but one copy
is updated successfully and the last one provides an error, then
the client <bcp14>MUST</bcp14> inform the metadata server about the error.
The client can use either LAYOUTRETURN or LAYOUTERROR to inform the
metadata server that the update failed to that storage device.  If
the client is updating the mirrors serially, then it <bcp14>SHOULD</bcp14> stop
at the first error encountered and report that to the metadata
server.  If the client is updating the mirrors in parallel, then
it <bcp14>SHOULD</bcp14> wait until all storage devices respond so that it can
report all errors encountered during the update.</t>
          </section>
          <section anchor="sec-write-errors">
            <name>Handling Write Errors</name>
            <t>When the client reports a write error to the metadata server, the
metadata server is responsible for determining if it wants to remove
the errant mirror from the layout, if the mirror has recovered from
some transient error, etc.  When the client tries to get a new
layout, the metadata server informs it of the decision by the
contents of the layout.  The client <bcp14>MUST NOT</bcp14> assume that the contents
of the previous layout will match those of the new one.  If it has
updates that were not committed to all mirrors, then it <bcp14>MUST</bcp14> resend
those updates to all mirrors.</t>
            <t>There is no provision in the protocol for the metadata server to
directly determine that the client has or has not recovered from
an error.  For example, if a storage device was network partitioned
from the client and the client reported the error to the metadata
server, then the network partition would be repaired, and all of
the copies would be successfully updated.  There is no mechanism
for the client to report that fact, and the metadata server is
forced to repair the file across the mirror.</t>
            <t>If the client supports NFSv4.2, it can use LAYOUTERROR and LAYOUTRETURN
to provide hints to the metadata server about the recovery efforts.
A LAYOUTERROR on a file is for a non-fatal error.  A subsequent
LAYOUTRETURN without a ffv2_ioerr4 indicates that the client successfully
replayed the I/O to all mirrors.  Any LAYOUTRETURN with a ffv2_ioerr4
is an error that the metadata server needs to repair.  The client
<bcp14>MUST</bcp14> be prepared for the LAYOUTERROR to trigger a CB_LAYOUTRECALL
if the metadata server determines it needs to start repairing the
file.</t>
          </section>
          <section anchor="sec-write-commits">
            <name>Handling Write COMMITs</name>
            <t>When stable writes are done to the metadata server or to a single
replica (if allowed by the use of FFV2_FLAGS_WRITE_ONE_MIRROR), it
is the responsibility of the receiving node to propagate the written
data stably, before replying to the client.</t>
            <t>In the corresponding cases in which unstable writes are done, the
receiving node does not have any such obligation, although it may
choose to asynchronously propagate the updates.  However, once a
COMMIT is replied to, all replicas <bcp14>MUST</bcp14> reflect the writes that
have been done, and this data <bcp14>MUST</bcp14> have been committed to stable
storage on all replicas.</t>
            <t>In order to avoid situations in which stale data is read from
replicas to which writes have not been propagated:</t>
            <ul spacing="normal">
              <li>
                <t>A client that has outstanding unstable writes made to single
node (metadata server or storage device) <bcp14>MUST</bcp14> do all reads from
that same node.</t>
              </li>
              <li>
                <t>When writes are flushed to the server (for example, to implement
close-to-open semantics), a COMMIT must be done by the client
to ensure that up-to-date written data will be available
irrespective of the particular replica read.</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="sec-mds-resilvering">
          <name>Metadata Server Resilvering of the File</name>
          <t>The metadata server may elect to create a new mirror of the layout
segments at any time.  This might be to resilver a copy on a storage
device that was down for servicing, to provide a copy of the layout
segments on storage with different storage performance characteristics,
etc.  As the client will not be aware of the new mirror and the
metadata server will not be aware of updates that the client is
making to the layout segments, the metadata server <bcp14>MUST</bcp14> recall the
writable layout segment(s) that it is resilvering.  If the client
issues a LAYOUTGET for a writable layout segment that is in the
process of being resilvered, then the metadata server can deny that
request with an NFS4ERR_LAYOUTUNAVAILABLE.</t>
          <t>The client's fallback while the layout is withheld follows the
per-encoding rules in
<xref target="sec-io-error-retry-mirrored"/> and <xref target="sec-io-error-retry-chunked"/>:
for a mirror whose I/O reduces to FFV2_ENCODING_REPLICATED or
FFV2_ENCODING_PASSTHROUGH the client <bcp14>MAY</bcp14> perform the I/O through
the metadata server as an ordinary NFSv4.1+ READ or WRITE; for a
mirror using any chunked encoding the metadata server itself
cannot service that I/O (it does not hold the encoded shards),
so the client's only fallback path is through a proxy server
if one is available for the file.  If no proxy server is available, the
client <bcp14>MUST</bcp14> wait for the metadata server to complete resilvering
and re-issue LAYOUTGET rather than attempt to route the I/O
through the metadata server.</t>
        </section>
      </section>
      <section anchor="client-side-erasure-coding">
        <name>Client-Side Erasure Coding</name>
        <t>Erasure coding takes a data block and transforms it to a payload
to send to the data servers (see <xref target="fig-encoding-data-block"/>).  It
generates a metadata header and transformed block per data server.
The header is metadata information for the transformed block.  From
now on, the metadata is simply referred to as the header and the
transformed block as the chunk.  The payload of a data block is the
set of generated headers and chunks for that data block.</t>
        <t>The chunk header carries four conceptual fields, each stored
on the data server with the chunk and carried on the wire by
every op that reads or writes the chunk.  This document does
not define a single XDR struct for the chunk header; instead
each op names the four fields directly, and the fields
appear on the wire under an op-specific prefix.</t>
        <dl>
          <dt>Guard:</dt>
          <dd>
            <t>an XDR chunk_guard4 (cg_gen_id, cg_client_id) pair
maintained by the data server to serialize concurrent
writers (see <xref target="sec-chunk_guard4"/>).  Each accepted
CHUNK_WRITE advances the target chunk's guard, and readers
observe the accepted guard on the read path.</t>
          </dd>
          <dt>Owner:</dt>
          <dd>
            <t>an XDR chunk_owner4 owner triple
identifying the writer's cohort (see
<xref target="sec-chunk_owner4"/>).  The owner is the identity that
lifecycle operations (CHUNK_FINALIZE, CHUNK_COMMIT,
CHUNK_ROLLBACK) address.</t>
          </dd>
          <dt>Payload identifier:</dt>
          <dd>
            <t>a writer-chosen uint32_t naming the chunk's position
within the payload's shard array.  Unlike the guard and
owner, the payload identifier is not a sub-struct with
named fields; it is a bare scalar carried directly under
an op-specific prefix on each op's wire arguments:
cwa_payload_id on CHUNK_WRITE,
cr_payload_id in the CHUNK_READ result
(<xref target="sec-CHUNK_READ"/>), and cwra_payload_id on
CHUNK_WRITE_REPAIR.  The
value the three carry names the same conceptual header
field; only the wire prefix differs across ops.</t>
          </dd>
          <dt>Checksum:</dt>
          <dd>
            <t>a 32-bit CRC computed over the header and the chunk.
Because the checksum field is itself part of the header,
the computation treats the bytes of that field as zero so
that the result is independent of the field's wire value;
the writer then stores the computed CRC into the checksum
field for transmission.  To validate on the read path, the
receiver saves the received checksum, treats those bytes
as zero, recomputes the CRC over the header and chunk, and
compares against the saved value.  By combining the two
parts of the payload in the CRC, integrity is ensured for
both parts.</t>
          </dd>
        </dl>
        <t>While the data block might have a length of 4kB, that does not
necessarily mean that the length of the chunk is 4kB.  That length
is determined by the erasure encoding type algorithm.  For example,
Reed Solomon might have 4kB chunks with the data integrity being
compromised by parity chunks.  Another example would be the Mojette
Transformation, which might have 1kB chunk lengths.</t>
        <t>The payload contains redundancy which will allow the erasure
encoding type algorithm to repair chunks in the payload as it is
transformed back to a data block (see <xref target="fig-decoding-db"/>).</t>
        <t>The protocol provides two levels of payload integrity, consumed at
different points in the read path:</t>
        <dl>
          <dt>Atomicity:</dt>
          <dd>
            <t>A payload is atomic when all of the chunks that belong
to it carry the same chunk_guard4 value (see
<xref target="sec-chunk_guard4"/>).  Atomicity alone does NOT imply the
bytes are free of corruption; it means only that every chunk in
the payload came from one write transaction.  A reader detects
a non-atomic payload (a torn read across writes) when it
assembles a payload and finds differing chunk_guard4 values
across chunks.</t>
          </dd>
          <dt>Integrity:</dt>
          <dd>
            <t>A payload has integrity when it is atomic AND every
contained chunk passes its checksum check.  Integrity is the
precondition for returning the payload's data block to the
application.</t>
          </dd>
        </dl>
        <t>The separation matters because the two checks detect different
failure modes.  Atomicity detects protocol-level failures (racing
writers, partial writes, rollback windows); the checksum detects
byte-level corruption (network errors, media errors, software bugs
in the erasure transform).  Neither subsumes the other.</t>
        <t>The two-level integrity model also reflects a deeper property of
distributed writes: last-writer-wins does not apply to a payload
spread across independent data servers.  The ordering of writes
arriving at one data server may differ from the ordering arriving
at another; the "last" write on one data server may well be the
"first" on another.  The chunk_guard4 CAS primitive (see
<xref target="sec-chunk_guard4"/>) resolves this by serializing concurrent
writers per chunk rather than by imposing a global order.</t>
        <t>The erasure coding algorithm itself might not be sufficient to
detect all byte-level errors in the chunks.  The checksum checks
allow the data server to detect chunks with integrity issues; the
erasure decoding algorithm can then reconstruct the affected
chunks from the remaining integral chunks in the payload.</t>
        <section anchor="encoding-a-data-block">
          <name>Encoding a Data Block</name>
          <figure anchor="fig-encoding-data-block">
            <name>Encoding a Data Block</name>
            <artwork><![CDATA[
                 +-------------+
                 | data block  |
                 +-------+-----+
                         |
                         |
   +---------------------+-------------------------------+
   |            Erasure Encoding (Transform Forward)     |
   +---+----------------------+---------------------+----+
       |                      |                     |
       |                      |                     |
   +-------------------+  +-------------------+  +-------------------+
   | HEADER            |..| HEADER            |..| HEADER            |
   +-------------------+  +-------------------+  +-------------------+
   | owner:            |..| owner:            |..| owner:            |
   |   co_cohort_id:42 |..|   co_cohort_id:42 |..|   co_cohort_id:42 |
   |   co_client_id: 6 |..|   co_client_id: 6 |..|   co_client_id: 6 |
   |   co_id       : 1 |..|   co_id       : 1 |..|   co_id       : 1 |
   | guard:            |..| guard:            |..| guard:            |
   |   cg_gen_id   : 3 |..|   cg_gen_id   : 3 |..|   cg_gen_id   : 3 |
   |   cg_client_id: 6 |..|   cg_client_id: 6 |..|   cg_client_id: 6 |
   | payload_id    : 0 |..| payload_id    : M |..| payload_id    : 5 |
   | checksum      :   |..| checksum      :   |..| checksum      :   |
   +-------------------+  +-------------------+  +-------------------+
   | CHUNK             |..| CHUNK             |..| CHUNK             |
   +-------------------+  +-------------------+  +-------------------+
   | data: ....        |..| data: ....        |..| data: ....        |
   +-------------------+  +-------------------+  +-------------------+
      Data Server 1          Data Server N          Data Server 6
]]></artwork>
          </figure>
          <t>Each data block of the file resident in the client's cache of the
file will be encoded into N different payloads to be sent to the
data servers as shown in <xref target="fig-encoding-data-block"/>.  As CHUNK_WRITE
(see <xref target="sec-CHUNK_WRITE"/>) can encode multiple write_chunk4 into a
single transaction, a more accurate description of a CHUNK_WRITE
is in <xref target="fig-example-chunk-write-args"/>.</t>
          <figure anchor="fig-example-chunk-write-args">
            <name>Example of CHUNK_WRITE_args</name>
            <sourcecode type="art"><![CDATA[
  +------------------------------------+
  | CHUNK_WRITEargs                    |
  +------------------------------------+
  | cwa_stateid: 0                     |
  | cwa_offset: 1                      |
  | cwa_stable: FILE_SYNC4             |
  | cwa_cohort_id: 0x000000000000002a  |
  | cwa_client_id: 6                   |
  | cwa_co_ids:                        |
  |         [0]:  1                    |
  |         [1]:  2                    |
  |         [2]:  3                    |
  | cwa_payload_id: 0                  |
  | cwa_chunk_size  :  1048            |
  | cwa_checksums:                     |
  |         [0]:  0x32ef89             |
  |         [1]:  0x56fa89             |
  |         [2]:  0x7693af             |
  | cwa_chunks  :  ......              |
  +------------------------------------+
]]></sourcecode>
          </figure>
          <t>This describes a 3 block write of data from an offset of 1 block
in the file.  All three chunks share cwa_cohort_id and
cwa_client_id, so the cohort identity is presented once; each
chunk's writer-chosen opaque co_id appears in the co-indexed
cwa_co_ids array (here the client chose 1, 2, 3, but any
distinct-per-cohort uint32_t values would be equally valid per
<xref target="sec-chunk_owner4"/>).  The data server can construct the cohort
record for the i'th chunk from cwa_chunks using cwa_payload_id,
cwa_cohort_id + cwa_client_id + <tt>cwa_co_ids[i]</tt>, and the i'th
checksum from cwa_checksums.  The cwa_chunks are sent together
as a byte stream to increase performance.</t>
          <t>Assuming that there were no issues, <xref target="fig-example-chunk-write-res"/>
illustrates the results.  The payload sequence id is implicit in
the CHUNK_WRITEargs.</t>
          <figure anchor="fig-example-chunk-write-res">
            <name>Example of CHUNK_WRITE_res</name>
            <sourcecode type="art"><![CDATA[
  +-------------------------------+
  | CHUNK_WRITEresok              |
  +-------------------------------+
  | cwr_count: 3                  |
  | cwr_committed: FILE_SYNC4     |
  | cwr_writeverf: 0xf1234abc     |
  | cwr_owners[0]:                |
  |        co_cohort_id: 0x2a     |
  |        co_client_id: 6        |
  |        co_id: 1               |
  | cwr_owners[1]:                |
  |        co_cohort_id: 0x2a     |
  |        co_client_id: 6        |
  |        co_id: 2               |
  | cwr_owners[2]:                |
  |        co_cohort_id: 0x2a     |
  |        co_client_id: 6        |
  |        co_id: 3               |
  +-------------------------------+
]]></sourcecode>
          </figure>
          <section anchor="worked-example-calculating-the-crc32">
            <name>Worked Example: Calculating the CRC32</name>
            <t>The examples in this section and in
<xref target="sec-checking-crc32"/> illustrate checksum computation
and verification using CHECKSUM_ALG_CRC32 as the worked
algorithm.  The other registered checksum algorithms (see
<xref target="sec-checksum4"/>) follow the same pattern -- the algorithm
names a function over the header and chunk bytes, the writer
fills cs_value with the computed output, and the reader
recomputes and compares.  Only the algorithm and the
cs_value length differ.</t>
            <figure anchor="fig-calc-before">
              <name>CRC32 Before Calculation</name>
              <artwork><![CDATA[
  +--------------------+
  | HEADER             |
  +--------------------+
  | guard:             |
  |   gen_id   : 7     |
  |   client_id: 6     |
  | payload_id : 0     |
  | crc32   : 0        |
  +--------------------+
  | CHUNK              |
  +--------------------+
  | data:  ....        |
  +--------------------+
        Data Server 1
]]></artwork>
            </figure>
            <t>Assuming the header and payload as in <xref target="fig-calc-before"/>, the crc32
needs to be calculated in order to fill in the cwa_checksums entry field.  In
this case, the crc32 is calculated over the 4 fields as shown in
the header and the cw_chunk.  In this example, it is calculated to
be 0x21de8.  The resulting CHUNK_WRITE is shown in <xref target="fig-calc-crc-after"/>.</t>
            <figure anchor="fig-calc-crc-after">
              <name>CRC32 After Calculation</name>
              <sourcecode type="art"><![CDATA[
  +------------------------------------+
  | CHUNK_WRITEargs                    |
  +------------------------------------+
  | cwa_stateid: 0                     |
  | cwa_offset: 1                      |
  | cwa_stable: FILE_SYNC4             |
  | cwa_cohort_id: 0x000000000000002b  |
  | cwa_client_id: 6                   |
  | cwa_co_ids:                        |
  |         [0]:  1                    |
  | cwa_payload_id: 0                  |
  | cwa_chunk_size  :  1048            |
  | cwa_checksums:                     |
  |         [0]:  0x21de8              |
  | cwa_chunks  :  ......              |
  +------------------------------------+
]]></sourcecode>
            </figure>
          </section>
        </section>
        <section anchor="decoding-a-data-block">
          <name>Decoding a Data Block</name>
          <figure anchor="fig-decoding-db">
            <name>Decoding a Data Block</name>
            <artwork><![CDATA[
    Data Server 1          Data Server N          Data Server 6
  +----------------+     +----------------+     +----------------+
  | HEADER         | ... | HEADER         | ... | HEADER         |
  +----------------+     +----------------+     +----------------+
  | guard:         | ... | guard:         | ... | guard:         |
  |   gen_id   : 3 | ... |   gen_id   : 3 | ... |   gen_id   : 3 |
  |   client_id: 6 | ... |   client_id: 6 | ... |   client_id: 6 |
  | payload_id : 0 | ... | payload_id : M | ... | payload_id : 5 |
  | crc32   :      | ... | crc32   :      | ... | crc32   :      |
  +----------------+     +----------------+     +----------------+
  | CHUNK          | ... | CHUNK          | ... | CHUNK          |
  +----------------+     +----------------+     +----------------+
  | data: ....     | ... | data: ....     | ... | data: ....     |
  +---+------------+     +--+-------------+     +-+--------------+
      |                     |                     |
      |                     |                     |
  +---+---------------------+---------------------+-----+
  |            Erasure Decoding (Transform Reverse)     |
  +---------------------+-------------------------------+
                        |
                        |
                +-------+-----+
                | data block  |
                +-------------+
]]></artwork>
          </figure>
          <t>When reading chunks via a CHUNK_READ operation, the client will
decode them into data blocks as shown in <xref target="fig-decoding-db"/>.</t>
          <t>At this time, the client could detect issues in the integrity of
the data.  The handling and repair are out of the scope of this
document and <bcp14>MUST</bcp14> be addressed in the document describing each
erasure encoding type.</t>
          <section anchor="sec-checking-crc32">
            <name>Worked Example: Checking the CRC32</name>
            <figure anchor="fig-example-chunk-read-crc">
              <name>CRC32 on the Wire</name>
              <sourcecode type="art"><![CDATA[
  +------------------------------------+
  | CHUNK_READresok                    |
  +------------------------------------+
  | crr_eof: false                     |
  | crr_chunks[0]:                     |
  |        cr_checksum: 0x21de8        |
  |        cr_owner:                   |
  |            co_cohort_id: 0x2b      |
  |            co_client_id: 6         |
  |            co_id       : 1         |
  |        cr_chunk  :  ......         |
  +------------------------------------+
]]></sourcecode>
            </figure>
            <t>Assuming the CHUNK_READ results as in <xref target="fig-example-chunk-read-crc"/>,
the crc32 needs to be checked in order to detect accidental
corruption.  Conceptually, a header and payload can be built as
shown in <xref target="fig-example-crc-checked"/>.  The crc32 is calculated
over the 4 fields as shown in the header and the cr_chunk.  In
this example, it is calculated to be 0x21de8; because the
calculated value matches the received cr_checksum, no
accidental corruption was detected on this payload.  (Content
authentication -- protection against adversarial modification --
requires a keyed MAC or signature; see
<xref target="sec-security-checksum-scope"/>.)</t>
            <figure anchor="fig-example-crc-checked">
              <name>CRC32 Being Checked</name>
              <artwork><![CDATA[
  +--------------------+
  | HEADER             |
  +--------------------+
  | guard:             |
  |   gen_id   : 7     |
  |   client_id: 6     |
  | payload_id  : 0    |
  | crc32    : 0       |
  +--------------------+
  | CHUNK              |
  +--------------------+
  | data:  ....        |
  +--------------------+
       Data Server 1
]]></artwork>
            </figure>
          </section>
        </section>
        <section anchor="write-modes">
          <name>Write Modes</name>
          <t>There are three writing modes for erasure coding, aligned with
the three workload classes in <xref target="sec-use-cases"/>.  The mode is
selected by the metadata server using FFV2_FLAGS_ONLY_ONE_WRITER
in the ffv2l_flags in the ffv2_layout4 (see <xref target="fig-ffv2_layout4"/>)
to inform the client whether it is the only writer to the file
or not, and by the client's own understanding of its workload
class when the flag is unset.</t>
          <dl>
            <dt>Single writer:</dt>
            <dd>
              <t>When FFV2_FLAGS_ONLY_ONE_WRITER is set, the client is the
only writer to the file.  CHUNK_WRITE with cwa_guard not set
can be used to write chunks.  There is no write contention,
but write holes can occur as the client overwrites old data.
The client does not need guarded writes, but it does need the
ability to rollback writes.  This mode corresponds to Use
Case 1 (single writer, multiple readers) in <xref target="sec-use-cases"/>.</t>
            </dd>
            <dt>Concurrent writers with occasional contention:</dt>
            <dd>
              <t>When FFV2_FLAGS_ONLY_ONE_WRITER is not set, the client is
one of several possible concurrent writers.  CHUNK_WRITE
with cwa_guard set <bcp14>MUST</bcp14> be used to write chunks.  Write holes
can be caused by multiple clients writing to the same chunk,
so the client needs guarded writes to prevent overwrites and
also needs the ability to rollback writes.  Racing writers
that lose the chunk_guard4 CAS receive NFS4ERR_CHUNK_GUARDED
and retry with a refreshed guard.  This mode corresponds to
Use Case 2 (multiple writers without sustained contention) in
<xref target="sec-use-cases"/>.</t>
            </dd>
            <dt>Concurrent writers on disjoint regions:</dt>
            <dd>
              <t>A specialization of the concurrent-writers mode above,
targeting Use Case 3 (multiple writers, disjoint regions --
the HPC checkpoint pattern) in <xref target="sec-use-cases"/>.  The wire
primitives are the same as the concurrent-writers mode
(cwa_guard set, chunk_guard4 CAS), but the deployment relies
on block alignment to keep per-chunk contention rare despite a
high overall writer count.  Contention that does occur is
resolved via the deterministic tiebreaker rule defined in
<xref target="sec-chunk_guard4"/>, so racing writers get a stable winner
across the mirror set without additional round trips.
Deployments that use an XOR-based erasure encoding and
expect frequent small edits from this workload class <bcp14>MAY</bcp14>
additionally use the delta-write protocol defined in
<xref target="I-D.haynes-nfsv4-flexfiles-v2-delta-writes"/>, which lets
the client forward per-projection XOR deltas directly to
each data server, avoiding client-side read-modify-write of
the full stripe on the small-edit path.</t>
            </dd>
          </dl>
          <t>In both modes, clients <bcp14>MUST NOT</bcp14> overwrite payloads which already
contain non-atomicity.  This directly follows from <xref target="sec-reading-chunks"/>
and <bcp14>MUST</bcp14> be handled as discussed there.  Once atomicity in the
payload has been detected, the client can use those chunks as a
basis for read/modify/update.</t>
          <t>CHUNK_WRITE is a two-pass operation in cooperation with
CHUNK_FINALIZE and CHUNK_ROLLBACK.  It writes new bytes into the chunk
and transitions the chunk to the PENDING state; the data
server is responsible for retaining the prior COMMITTED
content until the chunk reaches its next stable state.  While
a chunk is in PENDING or FINALIZED, a subsequent CHUNK_READ
does NOT observe the new content (visibility rules of
<xref target="sec-system-model"/> apply: PENDING and FINALIZED chunks are
not globally visible; CHUNK_READ returns only COMMITTED
content).</t>
          <t>Concurrent CHUNK_WRITE against a PENDING or FINALIZED chunk is
regulated by chunk_guard4 (<xref target="sec-chunk_guard4"/>), not by an
implicit lock.  A racing writer whose guard check fails
receives NFS4ERR_CHUNK_GUARDED; an explicit CHUNK_LOCK holder is signaled by NFS4ERR_CHUNK_LOCKED.
No implicit chunk-write lock is acquired by CHUNK_WRITE.
A client that requires exclusive access to a chunk <bcp14>MUST</bcp14>
invoke CHUNK_LOCK explicitly (<xref target="sec-CHUNK_LOCK"/>).</t>
          <t>If the CHUNK_WRITE results in a atomic data block, then the
client will send a CHUNK_FINALIZE in a subsequent compound to inform
the data server that the chunk is finalized and can be overwritten
by another CHUNK_WRITE.</t>
          <t>If the CHUNK_WRITE results in an non-atomic data block, or if the
data server returns NFS4ERR_CHUNK_LOCKED, the client reports the
condition to the metadata server via LAYOUTERROR with an error code
of NFS4ERR_PAYLOAD_NOT_ATOMIC.</t>
        </section>
        <section anchor="sec-repair-selection">
          <name>Selecting the Repair Actor</name>
          <t>The repair topology involves three actors communicating along
distinct paths, as shown in <xref target="fig-repair-topology"/>.</t>
          <figure anchor="fig-repair-topology">
            <name>Repair topology</name>
            <artwork><![CDATA[
     +-------------+      (1)         +-----------------+
     |  Reporting  | ---------------> |                 |
     |  client     |   LAYOUTERROR    | Metadata Server |
     |  (detects   |                  |                 |
     |  error)     |                  |                 |
     +-------------+                  +--------+--------+
                                               |
                                               | (2b)
                                               | CB_CHUNK_REPAIR
                                               | (RACE or SCRUB)
                                               v
     +-------------+      (4)         +-----------------+
     |  Repair     | ---------------> |  Data Servers   |
     |  actor      |   CHUNK ops      |  (mirror set    |
     |  (selected  |                  |  for affected   |
     |  per (2a),  |                  |  ranges)        |
     |  adopts     |                  |                 |
     |  lock (3))  |                  |                 |
     +-------------+                  +-----------------+

     (1)   Reporting client LAYOUTERRORs to the metadata server.
     (2a)  Metadata server selects a repair actor (may be a
           client -- possibly the reporting client -- a data
           server under tight coupling, or a proxy server).
     (2b)  Metadata server escrows the chunk lock and issues
           CB_CHUNK_REPAIR to the selected repair actor.
     (3)   Repair actor adopts the lock and drives the repair.
     (4)   Repair actor issues CHUNK_LOCK_ADOPT, CHUNK_WRITE_REPAIR,
           CHUNK_FINALIZE, CHUNK_COMMIT, and CHUNK_REPAIRED against
           the mirror set.
]]></artwork>
          </figure>
          <t>The metadata server is the authority that selects the repair
actor for a non-atomic payload.  The candidate set is any
client, any data server (in a tightly coupled deployment), or
the proxy server (in a proxy server deployment); the selection
is analogous to the way the metadata server assigns per-mirror
priority via ffv2ds_efficiency (see <xref target="sec-select-mirror"/>): the
protocol does not prescribe the selection algorithm, and each
deployment <bcp14>MAY</bcp14> tune its policy.</t>
          <t>Implementations <bcp14>MAY</bcp14> consider factors such as:</t>
          <ul spacing="normal">
            <li>
              <t>Whether a client holds an active write layout on the affected
payload (the client most likely to hold surviving shards in
cache).</t>
            </li>
            <li>
              <t>Whether a client has previously reported atomic shards to
the metadata server via LAYOUTSTATS or a prior LAYOUTERROR.</t>
            </li>
            <li>
              <t>Whether the layout exposes a data server carrying
FFV2_DS_FLAGS_REPAIR as a target for reconstructed shards.</t>
            </li>
            <li>
              <t>Network proximity, observed latency, or recent client load --
the same class of information that informs ffv2ds_efficiency.</t>
            </li>
          </ul>
          <t>The selection algorithm is not normative.  What is normative is
that every client <bcp14>MUST</bcp14> be prepared to:</t>
          <ol spacing="normal" type="1"><li>
              <t>Receive a repair request for a payload that the client does
not have an outstanding write layout on, and did not write;
and</t>
            </li>
            <li>
              <t>Continue its own workload after reporting
NFS4ERR_PAYLOAD_NOT_ATOMIC without itself being selected
to repair the payload it reported.</t>
            </li>
          </ol>
          <t>The metadata server signals the selected client via the
CB_CHUNK_REPAIR callback (<xref target="sec-CB_CHUNK_REPAIR"/>), which
identifies the file, the affected ranges (each with its own
triggering nfsstat4), and a wall-clock deadline.  A client that
receives CB_CHUNK_REPAIR for a file for which it does not
already hold a layout <bcp14>MUST</bcp14> acquire a layout via LAYOUTGET before
attempting the repair.</t>
          <t>Operational expectations for CB_CHUNK_REPAIR:
CB_CHUNK_REPAIR is an exceptional path, triggered only by
concurrent writer races or data-server failures.  It is not a
steady-state operation and its frequency is a function of
racing-writer and data-server-failure rates in the deployment
rather than of normal client workload.  Implementations <bcp14>SHOULD</bcp14>
treat the CB_CHUNK_REPAIR handler as rare-path code and avoid
over-optimizing it.  Implementations <bcp14>SHOULD</bcp14>, however, provision
enough client-side compute to handle a repair transaction
without stalling their foreground I/O, because foreground
throughput during repair is the externally observable cost of
this callback.</t>
        </section>
        <section anchor="repair-protocol-normative-vs-informative">
          <name>Repair Protocol: Normative vs. Informative</name>
          <t>The selection algorithm is non-normative and deployment-tunable.
The externally-observable state transitions of the repair flow
are normative.  The line between the two is drawn at what
another party on the wire -- the metadata server, another
client, a reader -- can observe.  What no other party can see
(client-internal ordering, retry policy, whether to CHUNK_READ
first to confirm the failure) is left to implementations.</t>
          <t>The following requirements are normative.  An implementation
that violates any of these can leak inconsistency or write-holes
into the cluster:</t>
          <dl>
            <dt>Final state flat:</dt>
            <dd>
              <t>Every shard in every range identified
in a CB_CHUNK_REPAIR <bcp14>MUST</bcp14> reach either the COMMITTED state
(repaired) or the EMPTY state (rolled back).  No shard is
left in PENDING or FINALIZED indefinitely.</t>
            </dd>
            <dt>Lock before write:</dt>
            <dd>
              <t>The repair actor <bcp14>MUST</bcp14> adopt the
lock on every affected range via CHUNK_LOCK with
CHUNK_LOCK_FLAGS_ADOPT (<xref target="sec-CHUNK_LOCK"/>) before issuing
any CHUNK_WRITE_REPAIR, CHUNK_ROLLBACK, or CHUNK_WRITE on a
chunk in that range.  The lock on the affected chunks is
held continuously from the failure that triggered
CB_CHUNK_REPAIR through the adoption; at no point is the
range unlocked.</t>
            </dd>
            <dt>Clear the errored state:</dt>
            <dd>
              <t>On the reconstruction path,
the repair actor <bcp14>MUST</bcp14> issue CHUNK_REPAIRED after CHUNK_COMMIT.  Without it,
readers continue to see holes regardless of on-disk state.</t>
            </dd>
            <dt>Release locks explicitly:</dt>
            <dd>
              <t>CHUNK_ROLLBACK does not
release chunk locks.  On the rollback path the client <bcp14>MUST</bcp14>
issue CHUNK_UNLOCK on each affected
chunk.  A client that walks away without either completing
CHUNK_REPAIRED or issuing CHUNK_UNLOCK holds the locks
until lease expiry, blocking progress for other writers.</t>
            </dd>
            <dt>Deadline honored:</dt>
            <dd>
              <t>The client <bcp14>MUST</bcp14> drive every range to
its final flat state before ccra_deadline, or <bcp14>MUST</bcp14> respond
to the CB_CHUNK_REPAIR with NFS4ERR_DELAY (requesting an
extension), NFS4ERR_ENCODING_NOT_SUPPORTED (declining), or
NFS4ERR_PAYLOAD_LOST (declaring the data unrecoverable).
A deadline that elapses without any of these leaves the
metadata server free to re-select; the client <bcp14>MUST NOT</bcp14>
continue repair-related CHUNK operations after the
deadline without first re-verifying its layout and the
chunk lock state.</t>
            </dd>
            <dt>Terminal return codes:</dt>
            <dd>
              <t>NFS4ERR_ENCODING_NOT_SUPPORTED
<bcp14>MUST</bcp14> mean "decline; select another client."
NFS4ERR_PAYLOAD_LOST <bcp14>MUST</bcp14> mean "the data is not
recoverable; do not retry."  The metadata server relies on
these to decide whether to re-issue.</t>
            </dd>
          </dl>
          <t>The following aspects are informative / implementation-defined:</t>
          <ul spacing="normal">
            <li>
              <t>Choice between the reconstruction path (CHUNK_WRITE_REPAIR)
and the rollback path (CHUNK_ROLLBACK) on a given range.  The
protocol <bcp14>MUST</bcp14> support both; the client <bcp14>MAY</bcp14> use either based
on its local state and whether reconstruction is feasible
from surviving shards.</t>
            </li>
            <li>
              <t>Ordering among multiple affected ranges in a single
CB_CHUNK_REPAIR (parallel or serial).</t>
            </li>
            <li>
              <t>Whether to issue CHUNK_READ to confirm the failure mode
before reconstructing.</t>
            </li>
            <li>
              <t>Retry policy on transient CHUNK_WRITE_REPAIR errors below the
deadline cutoff.</t>
            </li>
            <li>
              <t>How the repair status is surfaced to local filesystem API
callers.</t>
            </li>
          </ul>
        </section>
        <section anchor="carrying-out-the-repair">
          <name>Carrying Out the Repair</name>
          <t>With the normative framing above, the reconstruction path is:</t>
          <ol spacing="normal" type="1"><li>
              <t>CHUNK_LOCK with CHUNK_LOCK_FLAGS_ADOPT on each affected
range (<xref target="sec-CHUNK_LOCK"/>).</t>
            </li>
            <li>
              <t>CHUNK_WRITE_REPAIR with the
reconstructed data for each non-atomic shard.  The
client's chunk_owner4 on this and all subsequent operations
is the one it presented in the CHUNK_LOCK ADOPT above;
prior owners' generation ids are now historical.</t>
            </li>
            <li>
              <t>CHUNK_FINALIZE and CHUNK_COMMIT to persist the repaired shards.</t>
            </li>
            <li>
              <t>CHUNK_REPAIRED to clear the
errored state.</t>
            </li>
          </ol>
          <t>The rollback path, when reconstruction is not possible:</t>
          <ol spacing="normal" type="1"><li>
              <t>CHUNK_LOCK with CHUNK_LOCK_FLAGS_ADOPT on each affected
range.</t>
            </li>
            <li>
              <t>CHUNK_ROLLBACK on each affected
shard to restore the previously committed content.</t>
            </li>
            <li>
              <t>CHUNK_UNLOCK on each shard.</t>
            </li>
          </ol>
          <t>In both paths, the repair actor <bcp14>SHOULD</bcp14> target reconstructed
shards according to the following fallback order: first, any
data server in the layout carrying FFV2_DS_FLAGS_REPAIR; then
the data server that reported the failure (the one carrying the
failing shard at the range identified by ccr_offset and ccr_count
in the CB_CHUNK_REPAIR argument).  If neither is available, the
client <bcp14>MUST</bcp14> return NFS4ERR_PAYLOAD_LOST on the CB_CHUNK_REPAIR
response; the metadata server is then responsible for adding a
new REPAIR-flagged data server to the layout (drawn from its
out-of-band pool) and re-driving the repair.</t>
          <section anchor="single-writer-mode">
            <name>Single Writer Mode</name>
            <t>In single writer mode, the metadata server sets FFV2_FLAGS_ONLY_ONE_WRITER
in ffv2l_flags, indicating that no other client holds a write layout for
the file.  The client sends CHUNK_WRITE with cwa_guard.cwg_check set to
FALSE, omitting the guard value.  Because only one writer is active,
there is no risk of two clients overwriting the same chunk concurrently.</t>
            <t>The single writer write sequence is:</t>
            <ol spacing="normal" type="1"><li>
                <t>The client issues CHUNK_WRITE (cwa_guard.cwg_check = FALSE) for each
shard.  The data server places the written block in the PENDING state
and retains a copy of the previous block for rollback.</t>
              </li>
              <li>
                <t>The client issues CHUNK_FINALIZE to advance the blocks from PENDING
to FINALIZED, validating the per-block checksum.</t>
              </li>
              <li>
                <t>The client issues CHUNK_COMMIT to advance the blocks from FINALIZED
to COMMITTED, persisting the block metadata to stable storage.</t>
              </li>
            </ol>
            <t>If the client detects an error after CHUNK_WRITE but before CHUNK_FINALIZE
(e.g., a CRC mismatch on a subsequent CHUNK_READ), it issues CHUNK_ROLLBACK
to restore the previous block content.  CHUNK_ROLLBACK does not lock the
chunk; the next CHUNK_WRITE is permitted immediately.</t>
          </section>
          <section anchor="repairing-single-writer-payloads">
            <name>Repairing Single Writer Payloads</name>
            <t>In single writer mode, non-atomic blocks arise from a client or data
server failure during a CHUNK_WRITE / CHUNK_FINALIZE sequence.  Because
no other writer is active, the original writer is the typical choice
for repair, but the metadata server <bcp14>MAY</bcp14> designate any client according
to the rules in <xref target="sec-repair-selection"/>.  A designated client that
did not originate the writes <bcp14>MUST</bcp14> follow the rollback path of that
section if it cannot reconstruct the payload from surviving shards.</t>
            <t>The repair sequence when the selected client is the original writer is:</t>
            <ol spacing="normal" type="1"><li>
                <t>The repair actor issues CHUNK_READ to identify which blocks are in a
failed state (PENDING with a CRC mismatch, or in the errored state
set by a prior CHUNK_ERROR).</t>
              </li>
              <li>
                <t>For each errored chunk, the repair actor reconstructs the correct
data using the erasure coding algorithm from the surviving atomic
chunks (treating each chunk's payload as a shard of the stripe).</t>
              </li>
              <li>
                <t>The repair actor issues CHUNK_WRITE_REPAIR
to write the reconstructed data.  CHUNK_WRITE_REPAIR bypasses the guard
check and applies different data server policies (e.g., allowing writes
to blocks in the errored state).</t>
              </li>
              <li>
                <t>The repair actor issues CHUNK_FINALIZE and CHUNK_COMMIT to persist the
repaired blocks.</t>
              </li>
              <li>
                <t>The repair actor issues CHUNK_REPAIRED to
clear the errored state and make the blocks available for normal reads.</t>
              </li>
            </ol>
          </section>
          <section anchor="sec-swm-to-mwm">
            <name>Transitioning from Single Writer Mode to Multiple Writer Mode</name>
            <t>When a second writer requests a write layout for a file currently
covered by a single writer layout (FFV2_FLAGS_ONLY_ONE_WRITER set),
the metadata server recalls the existing layout before granting
the new request.  The sequence is:</t>
            <ol spacing="normal" type="1"><li>
                <t>The metadata server issues CB_LAYOUTRECALL to the single writer
client.</t>
              </li>
              <li>
                <t>The single writer client drains its outstanding I/O issued
under the single writer assumption (CHUNK_WRITE with
cwa_guard.cwg_check = FALSE).  Operations already underway
complete under the layout that authorized them: CHUNK_FINALIZE
and CHUNK_COMMIT proceed normally for blocks already written.</t>
              </li>
              <li>
                <t>Once drained, the single writer client issues LAYOUTRETURN.</t>
              </li>
              <li>
                <t>The metadata server grants the new writer a layout without
FFV2_FLAGS_ONLY_ONE_WRITER set.  When the original writer next
issues LAYOUTGET, it also receives a layout without the flag.
Both clients then operate in multiple writer mode
(<xref target="sec-multi-writer"/>), supplying cwa_guard.cwg_check = TRUE
and a chunk_guard4 on every CHUNK_WRITE.</t>
              </li>
            </ol>
            <t>The transition uses standard NFSv4.1 layout recall semantics
(<xref section="12.5.5" sectionFormat="of" target="RFC8881"/>).  Drained single writer I/O does
not need to be re-issued under multiple writer rules; it
completed under the layout that authorized it.  If the
single writer client fails to return the layout within the
recall window, the metadata server escalates to layout
revocation (<xref section="12.5.5.2.1" sectionFormat="of" target="RFC8881"/>); any single writer
writes that did not complete before revocation are repaired via
the multiple-writer repair path on subsequent access.</t>
          </section>
          <section anchor="sec-multi-writer">
            <name>Multiple Writer Mode</name>
            <t>In multiple writer mode, the metadata server does not set
FFV2_FLAGS_ONLY_ONE_WRITER, indicating that concurrent writers may hold
write layouts for the file.  The client sends CHUNK_WRITE with
cwa_guard.cwg_check set to TRUE, supplying the expected prior
chunk_guard4 in cwa_guard.cwg_guard so the data server can perform
per-chunk CAS.  The client obtains the expected prior chunk_guard4
by observing the chunk's current guard first: either cr_guard from
CHUNK_READ when the payload is also required,
or the corresponding chrr_guards entry from CHUNK_HEADER_READ when only the guard is needed.  The
write transaction is separately identified by the cohort pair
<tt>(cwa_cohort_id, cwa_client_id)</tt> supplied on the same CHUNK_WRITE.</t>
            <t>The multiple writer write sequence is:</t>
            <ol spacing="normal" type="1"><li>
                <t>The client selects a unique cohort pair <tt>(cwa_cohort_id,
cwa_client_id)</tt> for this transaction.  cwa_client_id is the client's
layout-granted ffv2m_client_id (see <xref target="sec-ffv2-mirror4"/>); the
cwa_cohort_id is a per-writer opaque identifier the client picks
distinct per transaction.</t>
              </li>
              <li>
                <t>The client issues CHUNK_WRITE (cwa_guard.cwg_check = TRUE) for each
chunk.  The data server checks that no other client's chunk is in the
PENDING state at this offset.  If another client's chunk is already
pending, the data server returns NFS4ERR_CHUNK_LOCKED with the
clr_owner field identifying the lock holder.</t>
              </li>
              <li>
                <t>On NFS4ERR_CHUNK_LOCKED, the client <bcp14>MUST</bcp14> back off.  It issues
CHUNK_ROLLBACK for any chunks it has already written in this
transaction, then retries after a delay.</t>
              </li>
              <li>
                <t>If all CHUNK_WRITEs succeed, the client issues CHUNK_FINALIZE and
CHUNK_COMMIT as in single writer mode.</t>
              </li>
            </ol>
            <t>The cohort pair ensures that the chunks carrying the shards of an
atomic erasure-coded stripe all carry the same
<tt>(co_cohort_id, co_client_id)</tt>.  A reader that encounters chunks with
different cohort pairs knows the stripe is not yet atomic and <bcp14>MUST</bcp14>
either retry or report NFS4ERR_PAYLOAD_NOT_ATOMIC.</t>
          </section>
          <section anchor="sec-repair-multi-writer">
            <name>Repairing Multiple Writer Payloads</name>
            <t>In multiple writer mode, non-atomic chunks can arise from two sources:
a client failure leaving some chunks in PENDING state, or two clients
writing different data to the same chunk before one has committed.</t>
            <t>The metadata server coordinates repair by designating a repair
client according to the rules in <xref target="sec-repair-selection"/>.  The
FFV2_DS_FLAGS_REPAIR flag, when present on a data server in the
layout, identifies the target data server into which reconstructed
shards should be written; it does not by itself identify the
repair actor.  The repair sequence is:</t>
            <ol spacing="normal" type="1"><li>
                <t>The repair actor issues CHUNK_LOCK on the
affected block range of each data server.  If any lock attempt returns
NFS4ERR_CHUNK_LOCKED, the repair actor records the existing lock
holder's chunk_owner4 and proceeds; the lock holder's data is a
candidate for the winning payload.</t>
              </li>
              <li>
                <t>The repair actor issues CHUNK_READ on all data servers to retrieve
the current payload.  It examines the chunk_owner4 of each shard to
identify which transaction (if any) produced a atomic set across
all k data shards.</t>
              </li>
              <li>
                <t>If a atomic set is found (all k data shards carry the same
chunk_guard4), that payload is the winner.  The repair actor issues
CHUNK_WRITE_REPAIR to copy the winner's data to any data servers whose
shard is non-atomic, followed by CHUNK_FINALIZE and CHUNK_COMMIT.</t>
              </li>
              <li>
                <t>If no atomic set exists (all available payloads are partial), the
repair actor selects one transaction's payload as authoritative
(typically the one with the most complete set of shards, or the most
recent cg_gen_id) and proceeds as above.</t>
              </li>
              <li>
                <t>After all data servers carry atomic, finalized, committed data, the
repair actor issues CHUNK_REPAIRED to clear the errored state and
CHUNK_UNLOCK to release the locks acquired in step 1.</t>
              </li>
              <li>
                <t>The repair actor reports success to the metadata server via
LAYOUTRETURN.</t>
              </li>
            </ol>
          </section>
          <section anchor="sec-mwm-to-swm">
            <name>Transitioning from Multiple Writer Mode to Single Writer Mode</name>
            <t>The reverse transition is optional.  When the metadata server
determines that only one writer holds a write layout for a file
(for example, because other writers' layouts have been returned or
their leases have expired), it <bcp14>MAY</bcp14> recall the remaining writer's
layout and grant a fresh layout with FFV2_FLAGS_ONLY_ONE_WRITER
set, restoring the single writer optimization.  The metadata
server <bcp14>MAY</bcp14> also leave the writer in multiple writer mode
indefinitely; single writer mode is an optimization, not a
correctness requirement.</t>
            <t>The metadata server's choice of when to grant
FFV2_FLAGS_ONLY_ONE_WRITER is policy and is implementation-defined.
A metadata server that aggressively grants single writer mode and
then must recall it each time a second writer appears can produce
recall churn under workloads with irregular concurrent access:
each single writer to multiple writer transition costs a
CB_LAYOUTRECALL round trip and drain time for in-flight I/O.
Strategies to limit churn include withholding
FFV2_FLAGS_ONLY_ONE_WRITER until sustained single writer behavior
is observed, deferring the single writer grant after a recent
recall, or never granting single writer mode for files with a
history of concurrent access.</t>
          </section>
        </section>
        <section anchor="sec-reading-chunks">
          <name>Reading Chunks</name>
          <t>The client reads chunks from the data file via CHUNK_READ.  The
number of chunks in the payload that need to be atomic depend
on both the Erasure Encoding Type and the level of protection selected.
If the client has enough atomic chunks in the payload, then it
can proceed to use them to build a data block.  If it does not have
enough atomic chunks in the payload, then it can either decide
to return a LAYOUTERROR of NFS4ERR_PAYLOAD_NOT_ATOMIC to the
metadata server or it can retry the CHUNK_READ until there are
enough atomic chunks in the payload.</t>
          <t>As another client might be writing to the chunks as they are being
read, it is entirely possible to read the chunks while they are not
atomic.  As such, it might even be the non-atomic chunks
which contain the new data and a better action than building the
data block is to retry the CHUNK_READ to see if new chunks are
overwritten.</t>
        </section>
        <section anchor="whole-file-repair">
          <name>Whole File Repair</name>
          <t>Whole-file repair is the case in which too many data servers have
failed, or too many chunks have been lost, for the per-range repair
flow defined in <xref target="sec-repair-selection"/> to reconstruct the file in
place.  In this case the metadata server <bcp14>MUST</bcp14> either:</t>
          <ol spacing="normal" type="1"><li>
              <t>Construct a new layout backed by replacement data servers and
drive the reconstruction via the proxy server mechanism (a
designated data server acts as the source of truth for client
I/O during the transition, pushing reconstructed content to the
replacement data servers in the background).  The proxy server mechanism also covers the non-repair cases where a file's layout
must change while remaining available to clients -- policy-driven layout transitions, data server maintenance evacuation,
administrative ingest, TLS coverage transition, and
filehandle-backend migration.</t>
            </li>
            <li>
              <t>If the metadata server has no proxy server capable data server
available, or the surviving shards are insufficient to
reconstruct any portion of the file, terminate the affected
byte ranges with NFS4ERR_PAYLOAD_LOST (see
<xref target="sec-NFS4ERR_PAYLOAD_LOST"/>).</t>
            </li>
          </ol>
          <t>Implementations that do not support the proxy server mechanism can
still perform recovery for cases where per-range repair suffices,
using CB_CHUNK_REPAIR and the repair
client selection rules in <xref target="sec-repair-selection"/>.  Such
implementations will surface NFS4ERR_PAYLOAD_LOST on any failure
that exceeds per-range repair's reach, including the multi-data-server failure scenarios the proxy server mechanism is intended to
handle.</t>
        </section>
      </section>
      <section anchor="mixing-of-encoding-types">
        <name>Mixing of Encoding Types</name>
        <t>Multiple encoding types can be present in a Flexible File Version 2
Layout Type layout.  The ffv2_layout4 has an array of ffv2_mirror4,
each of which has a ffv2_encoding_type4.  Mixing encoding types in a single file's mirror set addresses
several use cases:</t>
        <dl>
          <dt>Assimilation and export:</dt>
          <dd>
            <t>assimilation of a non-erasure-coded file into an
erasure-coded representation, or export of an erasure-coded
file to a non-erasure-coded representation.</t>
          </dd>
          <dt>Online migration between encodings:</dt>
          <dd>
            <t>for example, from a Reed-Solomon Vandermonde encoding to a
Mojette systematic encoding when a read-access-pattern change
makes the new encoding a better fit.  Both representations
remain addressable through the layout throughout the
transition.</t>
          </dd>
          <dt>Cross-encoding recovery:</dt>
          <dd>
            <t>when one encoding loses data to a correlated failure mode
(an encoding implementation bug, a memory-corruption pattern
that affects parity shards identically), a second mirror in
a different encoding provides an independent recovery
path.</t>
          </dd>
          <dt>Client-capability routing:</dt>
          <dd>
            <t>a proxy server sees the full mirror set and chooses between
encodings on behalf of clients that do not implement every
encoding the file is represented in.</t>
          </dd>
        </dl>
        <t>Consider a layout that exposes a file in two encodings
simultaneously: a PASSTHROUGH mirror over the original byte
stream and a Reed-Solomon Vandermonde
(FFV2_ENCODING_RS_VANDERMONDE) mirror with 4 active data shards
plus 2 parity data servers.  A layout for such a
file might appear as in <xref target="fig-example_mixing"/>.  Both
representations are active and addressable through the layout
simultaneously.  This is the transition-window pattern: a file
may transiently span encodings while it is being assimilated
from a non-flexible-file-v2 source or migrated between
encodings.  Steady
state is homogeneous; the multi-encoding window is what the
protocol must accommodate.</t>
        <t>The active mirrors serve different access patterns concurrently:</t>
        <ul spacing="normal">
          <li>
            <t>A client that speaks only the file-layout READ path issues
READ (<xref section="18.22" sectionFormat="of" target="RFC8881"/>) calls to index 0 (the
PASSTHROUGH mirror).</t>
          </li>
          <li>
            <t>A client that speaks the chunked path issues CHUNK_READ calls to index 1 (the RS_VANDERMONDE
mirror).</t>
          </li>
          <li>
            <t>A proxy server fronting legacy clients chooses between the two
encodings on the client's behalf.</t>
          </li>
        </ul>
        <t>All three patterns coexist during the transition.</t>
        <figure anchor="fig-example_mixing">
          <name>Example of Mixed Encoding Types in a Layout</name>
          <sourcecode type="art"><![CDATA[
 +-----------------------------------------------------+
 | ffv2_layout4:                                       |
 +-----------------------------------------------------+
 |     ffv2l_mirrors[0]:                               |
 |         ffv2s_data_servers:                         |
 |             ffv2_data_server4[0]                    |
 |                 ffv2ds_flags: 0                     |
 |         ffv2m_coding: FFV2_ENCODING_PASSTHROUGH     |
 +-----------------------------------------------------+
 |     ffv2l_mirrors[1]:                               |
 |         ffv2s_data_servers:                         |
 |             ffv2_data_server4[0]                    |
 |                 ffv2ds_flags: FFV2_DS_FLAGS_ACTIVE  |
 |             ffv2_data_server4[1]                    |
 |                 ffv2ds_flags: FFV2_DS_FLAGS_ACTIVE  |
 |             ffv2_data_server4[2]                    |
 |                 ffv2ds_flags: FFV2_DS_FLAGS_ACTIVE  |
 |             ffv2_data_server4[3]                    |
 |                 ffv2ds_flags: FFV2_DS_FLAGS_ACTIVE  |
 |             ffv2_data_server4[4]                    |
 |                 ffv2ds_flags: FFV2_DS_FLAGS_PARITY  |
 |             ffv2_data_server4[5]                    |
 |                 ffv2ds_flags: FFV2_DS_FLAGS_PARITY  |
 |     ffv2m_coding: FFV2_ENCODING_RS_VANDERMONDE      |
 +-----------------------------------------------------+
]]></sourcecode>
        </figure>
        <t>When performing I/O via a FFV2<em>ENCODING_PASSTHROUGH encoding type,
the non-transformed data will be used; whereas with any of the
chunked encoding types (any FFV2_ENCODING</em>* value other than
FFV2_ENCODING_PASSTHROUGH; see <xref target="tbl-coding-types"/>), a metadata
header and transformed block will be sent.  Further, when reading data from the
instance files, the client <bcp14>MUST</bcp14> be prepared to have one of the
encoding types supply data and the other type not to supply data.
I.e., the CHUNK_READ call to the data servers in mirror 1 might
return rlr_eof set to true (see <xref target="fig-read_chunk4"/>), which
indicates that there is no data, where the READ call to the
data server in mirror 0 might return eof to be false, which
indicates that there is data.  The client <bcp14>MUST</bcp14> determine that
there is in fact data.  An example use case is the active
assimilation of a file to ensure integrity.  As the client is
helping to translate the file to the new coding scheme, it is
actively modifying the file.  As such, it might be sequentially
reading the file in order to translate.  The READ calls to
mirror 0 would be returning data and the CHUNK_READ calls to
mirror 1 would not be returning data.  As the client overwrites
the file, the WRITE call and CHUNK_WRITE call would have data
sent to all of the data servers.  Finally, if the client reads
back a section which had been modified earlier, both the READ
and CHUNK_READ calls would return data.</t>
        <t>The two-mirror layout shown in <xref target="fig-example_mixing"/> is the
file's full mirror set as known to the metadata server.  A
client that arrives during the assimilation or migration window
above does not necessarily receive that layout; per the
proxy server draft, the client gets a single layout naming the
proxy server as a single endpoint, and the proxy server selects
which of the file's
mirrors to read from or write to on the client's behalf.  The
two-mirror view in this section describes the metadata server's
bookkeeping during the transition; the client directs its I/O
to a single endpoint.</t>
        <section anchor="sec-steady-state-heterogeneous">
          <name>Steady-state heterogeneous mirrors</name>
          <t>The transition-window patterns above (assimilation, migration,
repair) are the most visible motivations for heterogeneous
mirror sets, but they are not the only ones.  A file's mirror
set <bcp14>MAY</bcp14> be heterogeneous in steady state -- where no transition
is in progress and no transition is planned -- when the
deployment's storage pools have different encoding capabilities
and the file is too large to fit in any single pool.</t>
          <t>Consider an operator with three 100-TB storage pools.  Pool A
is a set of NFSv3-only data servers, which is a hard capability
constraint: the chunked encodings require NFSv4.2's CHUNK
operations, so an NFSv3-only pool can hold data only under an
FFV2_ENCODING_PASSTHROUGH mirror.  Pools B and C are NFSv4.2
data servers, which are encoding-agnostic at the wire level
(CHUNK_READ and CHUNK_WRITE just move opaque chunk payloads;
the encoding transform is client-side).  The operator, however,
has chosen to write Pool B under FFV2_ENCODING_RS_VANDERMONDE
and Pool C under FFV2_ENCODING_MOJETTE_SYSTEMATIC -- a policy
decision motivated by durability diversity (hedging against a
correlated failure in any single encoder implementation) and by
per-workload fit (each encoding's reconstruction cost and
failure-tolerance profile suits a different tenant on that pool).</t>
          <t>A 250-TB file cannot fit in any single pool.  Striping the file
across all three pools is forced by capacity arithmetic: 250 &gt;
100.  Because bytes in each pool were written under the pool's
chosen encoding, the layout for this file <bcp14>MUST</bcp14> name the actual
per-mirror <tt>ffv2_encoding_type4</tt> so that clients decode each
segment correctly: PASSTHROUGH for the Pool A segment,
RS_VANDERMONDE for the Pool B segment, MOJETTE_SYSTEMATIC for
the Pool C segment.  The heterogeneity is not a transition
window; it is the permanent consequence of striping across
pools whose bytes were written under different operator-chosen
encodings.</t>
          <t>In this steady-state case, no proxy server mediated transition
machinery is involved.  The client receives a layout
enumerating the mirrors at different <tt>ffv2m_coding</tt> values and
routes chunk operations to the appropriate data server per
segment (or, if the client cannot speak one of the encodings,
requests proxy mediation per the proxy server draft's section
"Encoding Translation for Encoding-Ignorant Clients"
(<xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>)).  The layout
machinery that supports this case is exactly the per-mirror
encoding naming primitive described above; no additional protocol
elements are required to express it.</t>
          <t>The transient case (one file moving between encodings) and the
steady-state case (one file permanently striped across
heterogeneous pools) share a single wire primitive: an
<tt>ffv2l_mirrors</tt> array that admits mixed <tt>ffv2_encoding_type4</tt>
values.  Removing that primitive would foreclose both cases
and would force one of three workarounds: (a) split the
250-TB file into three independently-named files (loses
single-namespace semantics), (b) require every pool to
implement every encoding (forces a single-vendor or
single-implementation procurement story), or (c) require an
always-on transcoding proxy in front of every read and write
(re-introduces the centralized data-plane that the
proxy server role is scoped to avoid in steady state).  None
of these alternatives address the steady-state case while
preserving the transition-window flexibility this document
specifies.</t>
        </section>
      </section>
      <section anchor="sec-encoding-passthrough">
        <name>FFV2_ENCODING_PASSTHROUGH</name>
        <t>FFV2_ENCODING_PASSTHROUGH is the on-ramp from the flexible file v1 layout (<xref target="RFC8435"/>)
into the flexible file v2 layout.  A PASSTHROUGH mirror points at the
file's bytes as they exist on the data server, without the
chunk envelope, checksum header, or chunk_guard4 fields that the
encoded types use.  Client I/O against a PASSTHROUGH mirror
uses NFSv3 WRITE / READ (<xref target="RFC1813"/>) or NFSv4 READ / WRITE
(<xref target="RFC8881"/>) directly -- not CHUNK_WRITE / CHUNK_READ.</t>
        <t>PASSTHROUGH provides:</t>
        <ul spacing="normal">
          <li>
            <t>Replication of data across N data servers, exactly as flexible file v1 layout
does.  Clients write to every replica; clients read from any
one.  N-way redundancy tolerates up to N-1 replica losses.</t>
          </li>
          <li>
            <t>Zero encoding compute at the client and zero chunk-metadata
overhead at the server.  The on-disk format is the file
itself.</t>
          </li>
          <li>
            <t>Compatibility with files that already exist outside flexible file v2 layout.
A PASSTHROUGH mirror can be created over an existing
file without rewriting it.</t>
          </li>
        </ul>
        <t>PASSTHROUGH does NOT provide:</t>
        <ul spacing="normal">
          <li>
            <t>Per-chunk integrity.  There is no checksum on the data path.
Silent corruption is undetectable without out-of-band
tooling (e.g., comparing checksums across replicas).</t>
          </li>
          <li>
            <t>Chunk-grained repair.  The repair unit is the whole file:
resilvering picks a trusted replica and replicates it end
to end to the affected replica(s).</t>
          </li>
          <li>
            <t>The concurrent writer disambiguation that chunk_guard4
provides for encoded types.</t>
          </li>
        </ul>
        <t>PASSTHROUGH is <bcp14>RECOMMENDED</bcp14> for the assimilation, migration, and
heterogeneous-mirror use cases described in
<xref target="sec-heterogeneous-mirrors"/>.  New deployments that do not
need a flexible file v1 layout on-ramp <bcp14>SHOULD</bcp14> use FFV2_ENCODING_REPLICATED for
the integrity guarantees described in
<xref target="sec-encoding-replicated"/>.</t>
      </section>
      <section anchor="sec-encoding-replicated">
        <name>FFV2_ENCODING_REPLICATED</name>
        <t>FFV2_ENCODING_REPLICATED is the chunked-with-integrity peer of
PASSTHROUGH.  The chunk produced for each replica is the
application data verbatim -- no transform, no parity shards --
but it travels on the wire and is stored on the data server
through CHUNK_WRITE / CHUNK_READ and so carries every integrity
property the encoded encoding types carry.</t>
        <t>What FFV2_ENCODING_REPLICATED keeps from the mirror model:</t>
        <ul spacing="normal">
          <li>
            <t>Zero encoding compute at the client.  Each replica's chunk is
the input bytes; there is no transform to apply on write and
nothing to decode on read.</t>
          </li>
          <li>
            <t>Storage cost of N x payload, where N is the replica count.
Mirroring trades storage for redundancy without the
reconstruction machinery that erasure coding requires.</t>
          </li>
          <li>
            <t>Reading any one intact replica is sufficient.  If a replica
fails to verify (see below), the client tries another.</t>
          </li>
        </ul>
        <t>What FFV2_ENCODING_REPLICATED adds beyond PASSTHROUGH, by virtue
of using CHUNK_WRITE and CHUNK_READ:</t>
        <ul spacing="normal">
          <li>
            <t>Per-chunk checksum on write and on read.  The CRC is computed
by the client over the chunk header and chunk payload with
the checksum field itself treated as zero
(<xref target="sec-checksum4"/>), sent on the wire with the chunk,
recomputed by the data server before storing, and
recomputed again from disk by the data server on every
CHUNK_READ.  Wire-level bit flips are caught before the
chunk is stored; on-disk bit rot is caught the next time
the chunk is read.</t>
          </li>
          <li>
            <t>Per-chunk repair granularity.  When one replica's CRC fails
to verify and another replica's verifies, the repair unit
is the chunk, not the file: CHUNK_READ the good replica,
CHUNK_WRITE to the bad replica, done.  No whole-file
resilvering is required.</t>
          </li>
          <li>
            <t>Per-chunk concurrent writer disambiguation.  Mirrored
writes carry the same chunk_guard4 (<xref target="sec-chunk_guard4"/>)
the erasure encoding types do.  Two clients racing to write
the same offset of the same file fan out to every replica
with a guard pair (generation, owning-client short-id) per
chunk; the CHUNK_FINALIZE step resolves which writer's
chunk wins and the other writer observes a deterministic
loss instead of an unresolved split-mirror.</t>
          </li>
        </ul>
        <t>What FFV2_ENCODING_REPLICATED is for: files where the deployment
wants integrity and replication without the storage savings or
the reconstruction story of erasure coding.  Small files that
do not exceed a single stripe, files whose access pattern is
read-mostly and where the N x storage cost is acceptable, and
files where the operator prefers the simplicity of "any one
replica is the file" over "k of (k + m) shards reconstruct the
file."  The coding choice is per-file; a deployment can mix
mirrored and erasure-coded files in the same namespace and
pick whichever fits each file's profile.</t>
        <t>What FFV2_ENCODING_REPLICATED is not: a substitute for erasure
coding when storage efficiency or multi-replica fault tolerance
matters.  An N-way mirror tolerates up to N-1 replica losses
but costs N x the payload; a (k, m) erasure coding tolerates m
losses at (k + m)/k x the payload.  Both have per-chunk
integrity under this document; the choice is the
cost-vs-tolerance one.</t>
      </section>
      <section anchor="sec-encoding-xor-parity">
        <name>FFV2_ENCODING_XOR_PARITY</name>
        <section anchor="overview">
          <name>Overview</name>
          <t>FFV2_ENCODING_XOR_PARITY is a single-parity, systematic,
RAID-5-shape encoding: k data shards accompanied by one parity
shard computed as the bytewise XOR of every data shard.
Parameters: k in the range 1 to 254, m fixed at 1.</t>
          <t>Unlike Reed-Solomon and Linux md/raid6, XOR_PARITY requires no
finite-field arithmetic.  The "encoding" is a plain XOR
reduction across k shards, so the implementation footprint is
trivial and the compute cost scales at memory bandwidth.  This
makes XOR_PARITY the simplest candidate encoding: any
conformant implementation can support it without a GF(2^8)
library.</t>
        </section>
        <section anchor="encoding">
          <name>Encoding</name>
          <t>Given k data shards, each of shard_len bytes, encoding produces
a single parity shard of shard_len bytes:</t>
          <artwork><![CDATA[
For each byte position j in [0, shard_len):
  parity[j] = data[0][j] XOR data[1][j] XOR ... XOR data[k-1][j]
]]></artwork>
          <t>All shards (data and parity) are the same size.  No table
lookups, no multiplications; a straight bitwise XOR reduction.</t>
        </section>
        <section anchor="recovery">
          <name>Recovery</name>
          <t>XOR_PARITY tolerates the loss of exactly one shard (any one
data shard or the parity shard).</t>
          <ul spacing="normal">
            <li>
              <t>Missing data shard <tt>data[i]</tt>: reconstruct by XOR-ing all
surviving shards (k-1 data shards plus the parity shard):
<tt>data[i][j] = parity[j] XOR data[0][j] XOR ... (skip i) ... XOR data[k-1][j]</tt>.</t>
            </li>
            <li>
              <t>Missing parity shard: recompute from the k intact data
shards using the encoding step above.</t>
            </li>
          </ul>
          <t>Reconstruction cost is a single XOR reduction over shard_len
bytes; memory bandwidth dominates.  No matrix inversion is
required.</t>
          <t>Loss of two or more shards is unrecoverable under XOR_PARITY.
Deployments requiring tolerance of two or more concurrent
losses <bcp14>SHOULD</bcp14> use FFV2_ENCODING_LINUX_MD_RAID (m=2) or
FFV2_ENCODING_RS_VANDERMONDE (configurable m).</t>
        </section>
        <section anchor="interoperability">
          <name>Interoperability</name>
          <t>XOR_PARITY produces a parity shard byte-identical to the P
(first) parity row of Reed-Solomon Vandermonde encoding at m=1
and to the P row of Linux md/raid6 at any m &gt;= 1.  This
follows from using the same primitive coefficients:</t>
          <ul spacing="normal">
            <li>
              <t>RS Vandermonde at m=1 uses parity row <tt>[1, 1, ..., 1]</tt> in
GF(2^8), which reduces to bitwise XOR (see
<xref target="sec-rs-encoding"/>).</t>
            </li>
            <li>
              <t>LINUX_MD_RAID's P row is defined as the bitwise XOR of every
data shard, identical to XOR_PARITY's parity by
construction.</t>
            </li>
          </ul>
          <t>A receiver capable of FFV2_ENCODING_RS_VANDERMONDE at m=1 or
FFV2_ENCODING_LINUX_MD_RAID at m &gt;= 1 therefore consumes an
XOR_PARITY-encoded chunk without re-encoding, provided the k
matches.  Conversely, an XOR_PARITY receiver consumes the P
row of any GF(2^8) family encoding at m &gt;= 1 unchanged.</t>
        </section>
        <section anchor="xorparity-interoperability-test-vectors">
          <name>XOR_PARITY Interoperability Test Vectors</name>
          <t>Concrete byte-level test vector with <tt>k = 3</tt>, <tt>m = 1</tt>,
<tt>shard_len = 1</tt>:</t>
          <table anchor="tbl-xor-parity-test-vector">
            <name>XOR_PARITY test vector: k=3, m=1</name>
            <thead>
              <tr>
                <th align="left">data[0]</th>
                <th align="left">data[1]</th>
                <th align="left">data[2]</th>
                <th align="left">parity</th>
                <th align="left">Notes</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">zero input</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">single non-zero data shard</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">
                  <tt>0x02</tt></td>
                <td align="left">
                  <tt>0x04</tt></td>
                <td align="left">
                  <tt>0x07</tt></td>
                <td align="left">0x01 XOR 0x02 XOR 0x04 = 0x07</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x37</tt></td>
                <td align="left">
                  <tt>0x91</tt></td>
                <td align="left">
                  <tt>0xac</tt></td>
                <td align="left">
                  <tt>0x0a</tt></td>
                <td align="left">matches P from <xref target="tbl-rs-test-vector-k3m2"/></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0xff</tt></td>
                <td align="left">
                  <tt>0xff</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">0xff XOR 0xff XOR 0x00 = 0x00</td>
              </tr>
            </tbody>
          </table>
          <t>The fourth row is byte-identical to the P entry of the same
input in <xref target="tbl-rs-test-vector-k3m2"/> -- the wire-compat
property in action.</t>
        </section>
        <section anchor="xorparity-shard-sizes">
          <name>XOR_PARITY Shard Sizes</name>
          <t>All XOR_PARITY shards (data and parity) are exactly shard_len
bytes.  chunk_size equals shard_len for every mirror in the
layout.  Total storage overhead is <tt>1/k</tt> of payload.</t>
          <table anchor="tbl-xor-parity-shards">
            <name>XOR_PARITY shard sizes for common configurations</name>
            <thead>
              <tr>
                <th align="left">Configuration</th>
                <th align="left">File Size</th>
                <th align="left">Shard Size</th>
                <th align="left">Total Storage</th>
                <th align="left">Overhead</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">3+1</td>
                <td align="left">3 KB</td>
                <td align="left">1 KB</td>
                <td align="left">4 KB</td>
                <td align="left">33%</td>
              </tr>
              <tr>
                <td align="left">3+1</td>
                <td align="left">1 MB</td>
                <td align="left">~342 KB</td>
                <td align="left">~1.33 MB</td>
                <td align="left">33%</td>
              </tr>
              <tr>
                <td align="left">7+1</td>
                <td align="left">7 KB</td>
                <td align="left">1 KB</td>
                <td align="left">8 KB</td>
                <td align="left">14%</td>
              </tr>
              <tr>
                <td align="left">7+1</td>
                <td align="left">1 MB</td>
                <td align="left">~147 KB</td>
                <td align="left">~1.14 MB</td>
                <td align="left">14%</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="sec-encoding-linux-md-raid">
        <name>FFV2_ENCODING_LINUX_MD_RAID</name>
        <section anchor="overview-1">
          <name>Overview</name>
          <t>FFV2_ENCODING_LINUX_MD_RAID is the Linux kernel md/raid6 P + Q
double-parity encoding, evaluated in GF(2^8) with primitive
polynomial <tt>x^8 + x^4 + x^3 + x^2 + 1</tt> (encoded as <tt>0x1d</tt> when
the implicit degree-8 term is dropped, <tt>0x11d</tt> when it is
kept).  Parameters: k in the range 2 to 253, m fixed at 2.</t>
          <t>The encoding produces two parity shards.  P is the bitwise XOR
of every data shard (identical to FFV2_ENCODING_XOR_PARITY's
parity, see <xref target="sec-encoding-xor-parity"/>).  Q is a weighted sum
<tt>sum(g^i * data_i)</tt> in GF(2^8) with <tt>g = 2</tt>.  The construction
is bit-for-bit compatible with Linux kernel <tt>lib/raid6</tt>
            <xref target="LINUX-RAID6"/> and with FFV2_ENCODING_RS_VANDERMONDE at m&lt;=2
(see <xref target="sec-rs-encoding"/>).</t>
          <t>The k=1 case (a single data shard with P and Q) is degenerate
and <bcp14>MUST NOT</bcp14> be used with FFV2_ENCODING_LINUX_MD_RAID.  Callers
who need triple-mirror semantics <bcp14>MUST</bcp14> use
FFV2_ENCODING_REPLICATED with N=3 instead.</t>
        </section>
        <section anchor="linuxmdraid-galois-field-arithmetic">
          <name>LINUX_MD_RAID Galois Field Arithmetic</name>
          <t>All LINUX_MD_RAID operations are performed over GF(2^8), the
Galois field with 256 elements.  Each element is represented
as a byte.</t>
          <dl>
            <dt>Irreducible Polynomial:</dt>
            <dd>
              <t>The field is constructed using <tt>x^8 + x^4 + x^3 + x^2 + 1</tt>,
encoded as <tt>0x1d</tt> when the implicit x^8 term is dropped (Linux
md convention), or <tt>0x11d</tt> when it is kept (RS Vandermonde
convention in <xref target="sec-rs-encoding"/>).  Both encodings refer to
the same field; only the notation differs.</t>
            </dd>
            <dt>Primitive Element:</dt>
            <dd>
              <t><tt>g = 2</tt>.  Powers of <tt>g</tt> cycle through GF(2^8) \ {0} with
period 255.</t>
            </dd>
            <dt>Addition:</dt>
            <dd>
              <t>Bitwise XOR.</t>
            </dd>
            <dt>Multiplication:</dt>
            <dd>
              <t>Via log/antilog tables in the reference implementation, or
SIMD vector multiply in modern kernels.  See the Linux kernel
<tt>lib/raid6/{int.uc, sse2.c, altivec.uc, ...}</tt> sources
<xref target="LINUX-RAID6"/> for the canonical implementation.</t>
            </dd>
          </dl>
        </section>
        <section anchor="linuxmdraid-encoding">
          <name>LINUX_MD_RAID Encoding</name>
          <t>Given k data shards, each of shard_len bytes, encoding
produces two parity shards P and Q, each shard_len bytes:</t>
          <artwork><![CDATA[
For each byte position j in [0, shard_len):
  P[j] = data[0][j] XOR data[1][j] XOR ... XOR data[k-1][j]
  Q[j] =         1 * data[0][j]
           XOR   g * data[1][j]
           XOR g^2 * data[2][j]
           XOR ...
           XOR g^(k-1) * data[k-1][j]
]]></artwork>
          <t>where multiplication is in GF(2^8) and <tt>g = 2</tt>.  All shards
(data, P, and Q) are the same size.</t>
          <t>The P row is identical to FFV2_ENCODING_XOR_PARITY's parity by
construction; the two encodings share the P computation.  The
Q row is the m=2 P + Q construction from <xref target="sec-rs-encoding"/>,
and produces byte-identical output to
FFV2_ENCODING_RS_VANDERMONDE at m=2.</t>
        </section>
        <section anchor="linuxmdraid-recovery">
          <name>LINUX_MD_RAID Recovery</name>
          <t>LINUX_MD_RAID tolerates up to two concurrent shard losses (any
two of the k + 2 shards).</t>
          <dl>
            <dt>Single-shard failure:</dt>
            <dd>
              <t>If only P or only Q is missing, recompute from the k intact
data shards using the encoding step above.</t>
            </dd>
            <dt/>
            <dd>
              <t>If exactly one data shard <tt>data[i]</tt> is missing but both P
and Q are intact, prefer the P-only recovery (cheaper): XOR
all surviving shards (k-1 data plus P) to recover <tt>data[i]</tt>.</t>
            </dd>
            <dt>Dual-shard failure:</dt>
            <dd>
              <t>If two data shards are missing, use both P and Q to solve a
2x2 linear system in GF(2^8) per byte position.  See the Linux
kernel <tt>lib/raid6/recov.c</tt> for the canonical solver.</t>
            </dd>
            <dt/>
            <dd>
              <t>If one data shard and one parity shard are missing, first
recover the data shard using the intact parity row (as in the
single-shard case), then recompute the missing parity from the
reconstructed data.</t>
            </dd>
          </dl>
          <t>Loss of three or more shards is unrecoverable under
LINUX_MD_RAID.  Deployments requiring m &gt;= 3 fault tolerance
<bcp14>MUST</bcp14> use FFV2_ENCODING_RS_VANDERMONDE.</t>
        </section>
        <section anchor="linuxmdraid-interoperability">
          <name>LINUX_MD_RAID Interoperability</name>
          <t>FFV2_ENCODING_LINUX_MD_RAID is wire-compatible with
FFV2_ENCODING_RS_VANDERMONDE at m &lt;= 2 by construction: both
encoders emit byte-identical P and Q for the same (k, data)
input at m &lt;= 2.</t>
          <ul spacing="normal">
            <li>
              <t>At m = 1, LINUX_MD_RAID's P row equals RS_VANDERMONDE's m=1
parity and equals XOR_PARITY's parity (see
<xref target="sec-encoding-xor-parity"/>).</t>
            </li>
            <li>
              <t>At m = 2, LINUX_MD_RAID's P + Q equals RS_VANDERMONDE's m=2
P + Q rows byte-for-byte.</t>
            </li>
          </ul>
          <t>RS_VANDERMONDE joined the m &lt;= 2 wire-compat set as a
wire format revision in this document: its m &lt;= 2 parity rows
are the hand-crafted P/Q construction rather than the
normalized-Vandermonde bottom rows RS uses at m &gt;= 3.  See
<xref target="sec-rs-encoding"/> for the RS construction and its
interoperability parameters.</t>
          <t>A client implementing either LINUX_MD_RAID or RS_VANDERMONDE
at m &lt;= 2 can consume the other without re-encoding, provided
the (k, m) geometry matches.</t>
        </section>
        <section anchor="linuxmdraid-interoperability-test-vectors">
          <name>LINUX_MD_RAID Interoperability Test Vectors</name>
          <t>Concrete byte-level test vector with <tt>k = 3</tt>, <tt>m = 2</tt>,
<tt>shard_len = 1</tt>:</t>
          <table anchor="tbl-linux-md-test-vector">
            <name>LINUX_MD_RAID test vector: k=3, m=2</name>
            <thead>
              <tr>
                <th align="left">data[0]</th>
                <th align="left">data[1]</th>
                <th align="left">data[2]</th>
                <th align="left">P</th>
                <th align="left">Q</th>
                <th align="left">Notes</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">zero input</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">
                  <tt>0x02</tt></td>
                <td align="left">
                  <tt>0x03</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x09</tt></td>
                <td align="left">1 XOR (2<em>2) XOR (4</em>3) = 1 XOR 4 XOR 12 = 9</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x80</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x80</tt></td>
                <td align="left">
                  <tt>0x80</tt></td>
                <td align="left">Q = 1 * 0x80 = 0x80</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x80</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x80</tt></td>
                <td align="left">
                  <tt>0x1d</tt></td>
                <td align="left">Q = 2 * 0x80 = 0x100 -&gt; reduce by 0x11d -&gt; 0x1d</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x80</tt></td>
                <td align="left">
                  <tt>0x80</tt></td>
                <td align="left">
                  <tt>0x3a</tt></td>
                <td align="left">Q = 4 * 0x80 = 2 * 0x1d = 0x3a</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x37</tt></td>
                <td align="left">
                  <tt>0x91</tt></td>
                <td align="left">
                  <tt>0xac</tt></td>
                <td align="left">
                  <tt>0x0a</tt></td>
                <td align="left">
                  <tt>0x82</tt></td>
                <td align="left">general non-degenerate case</td>
              </tr>
            </tbody>
          </table>
          <t>Every row above is byte-identical to the k=3, m=2 test vector
for FFV2_ENCODING_RS_VANDERMONDE (<xref target="tbl-rs-test-vector-k3m2"/>)
at the same input.  This is the wire-compat property in
action: an implementation whose LINUX_MD_RAID output matches
these bytes is producing the same wire encoding as
RS_VANDERMONDE at m=2.</t>
        </section>
        <section anchor="linuxmdraid-shard-sizes">
          <name>LINUX_MD_RAID Shard Sizes</name>
          <t>All LINUX_MD_RAID shards (data, P, Q) are exactly shard_len
bytes.  chunk_size equals shard_len for every mirror in the
layout.  Total storage overhead is <tt>2/k</tt> of payload.</t>
          <table anchor="tbl-linux-md-shards">
            <name>LINUX_MD_RAID shard sizes for common configurations</name>
            <thead>
              <tr>
                <th align="left">Configuration</th>
                <th align="left">File Size</th>
                <th align="left">Shard Size</th>
                <th align="left">Total Storage</th>
                <th align="left">Overhead</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">4+2</td>
                <td align="left">4 KB</td>
                <td align="left">1 KB</td>
                <td align="left">6 KB</td>
                <td align="left">50%</td>
              </tr>
              <tr>
                <td align="left">4+2</td>
                <td align="left">1 MB</td>
                <td align="left">256 KB</td>
                <td align="left">1.5 MB</td>
                <td align="left">50%</td>
              </tr>
              <tr>
                <td align="left">8+2</td>
                <td align="left">4 KB</td>
                <td align="left">512 B</td>
                <td align="left">5 KB</td>
                <td align="left">25%</td>
              </tr>
              <tr>
                <td align="left">8+2</td>
                <td align="left">1 MB</td>
                <td align="left">128 KB</td>
                <td align="left">1.25 MB</td>
                <td align="left">25%</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="sec-rs-encoding">
        <name>Reed-Solomon Vandermonde Encoding (FFV2_ENCODING_RS_VANDERMONDE)</name>
        <section anchor="overview-2">
          <name>Overview</name>
          <t>Reed-Solomon (RS) codes are Maximum Distance Separable codes:
for a (k + m, k) code, any k of the k + m encoded shards suffice to
recover the original data.  The code tolerates the simultaneous loss
of up to m shards.  <xref target="Plank97"/> is a tutorial treatment of RS
coding in RAID-like systems and is the recommended background
reading for implementers unfamiliar with the construction used
here.</t>
        </section>
        <section anchor="galois-field-arithmetic">
          <name>Galois Field Arithmetic</name>
          <t>All RS operations are performed over GF(2^8), the Galois field with
256 elements.  Each element is represented as a byte.</t>
          <dl>
            <dt>Irreducible Polynomial:</dt>
            <dd>
              <t>The field is constructed using the irreducible polynomial
x^8 + x^4 + x^3 + x^2 + 1 (0x11d in hexadecimal).  The primitive
element (generator) is g = 2, which has multiplicative order 255.</t>
            </dd>
            <dt>Addition:</dt>
            <dd>
              <t>Addition in GF(2^8) is bitwise XOR.</t>
            </dd>
            <dt>Multiplication:</dt>
            <dd>
              <t>Multiplication uses log/antilog tables.  For non-zero elements
a and b: a * b = exp(log(a) + log(b)), where the exp table is
doubled to 512 entries to avoid modular reduction on the index sum.</t>
            </dd>
          </dl>
          <t>These are the classical constructions from Berlekamp (1968) and
Peterson &amp; Weldon (1972).  The log/antilog table approach for GF(2^8)
multiplication predates all known patents on SIMD-accelerated GF
arithmetic.  Implementors considering SIMD acceleration of GF(2^8)
operations should be aware of US Patent 8,683,296 (StreamScale),
which covers certain SIMD-based GF multiplication techniques.</t>
        </section>
        <section anchor="encoding-matrix">
          <name>Encoding Matrix</name>
          <t>The systematic encoding matrix E has (k + m) rows and k columns.
The top k rows are always the k x k identity, so data shards pass
through unchanged.  The bottom m parity rows are chosen as
follows.</t>
          <section anchor="at-m-1-single-parity-row">
            <name>At m = 1: single parity row</name>
            <t>The single parity row is <tt>[1, 1, ..., 1]</tt>:</t>
            <artwork><![CDATA[
E[k][j] = 1    for j = 0, 1, ..., k-1
]]></artwork>
            <t>Encoded parity is the bitwise XOR of every data shard.  This
matches the P row of Linux md's RAID6 construction and the sole
parity row of FFV2_ENCODING_XOR_PARITY byte-for-byte; a receiver
that speaks either of those consumes RS_VANDERMONDE at m=1
without re-encoding.</t>
          </section>
          <section anchor="at-m-2-p-q-parity-rows">
            <name>At m = 2: P + Q parity rows</name>
            <t>The two parity rows are:</t>
            <artwork><![CDATA[
E[k][j]     = 1              for j = 0, 1, ..., k-1   (P row)
E[k+1][j]   = g^j            for j = 0, 1, ..., k-1   (Q row)
]]></artwork>
            <t>where g = 2 is the primitive element of GF(2^8) with polynomial
0x11d.  These are exactly the coefficients Linux md RAID6 uses
for its P and Q shards.  A receiver that speaks
FFV2_ENCODING_LINUX_MD_RAID at m &lt;= 2 also consumes
RS_VANDERMONDE at m &lt;= 2 byte-for-byte (and vice versa).</t>
          </section>
          <section anchor="at-m-3-normalized-vandermonde-bottom-rows">
            <name>At m &gt;= 3: normalized Vandermonde bottom rows</name>
            <t>The parity rows are the bottom m rows of a normalized
Vandermonde encoding matrix, constructed as follows.</t>
            <ol spacing="normal" type="1"><li>
                <t>Assign each of the k + m shards a distinct non-zero evaluation
point in GF(2^8): shard i (for i = 0, 1, ..., k + m - 1) is assigned
the point alpha_i = i + 1.  This gives evaluation points
1, 2, ..., k + m, all non-zero and distinct.  The value k + m <bcp14>MUST
NOT</bcp14> exceed 255 so that all points fit in GF(2^8) \ {0}.</t>
              </li>
              <li>
                <t>Construct a (k + m) x k Vandermonde matrix V where the row for
shard i is the geometric progression of alpha_i:  </t>
                <artwork><![CDATA[
V[i][j] = alpha_i^j = (i + 1)^j    for j = 0, 1, ..., k-1
]]></artwork>
                <t>
Row i is (1, alpha_i, alpha_i^2, ..., alpha_i^(k-1)).  The
exponent zero is defined as <tt>x^0 = 1</tt> for all <tt>x</tt> in GF(2^8),
including x = 0 (this is the standard combinatorial
convention; here <tt>alpha_i</tt> is never zero by step 1's
construction, but the convention makes the <tt>V[0][0]</tt> cell
unambiguous).  Any k distinct rows form a k x k Vandermonde
matrix on k distinct non-zero evaluation points, which is
invertible over GF(2^8); this is the property that gives the
code its Maximum Distance Separable (any k of k + m shards
recover the data) guarantee.  The minimum useful geometry
is <tt>k &gt;= 1</tt> and <tt>m &gt;= 1</tt> (<tt>k = 0</tt> gives no data and <tt>m = 0</tt>
gives no redundancy); the maximum is bounded by <tt>k + m &lt;= 255</tt>
as stated in step 1.</t>
              </li>
              <li>
                <t>Extract the top k x k sub-matrix T from V.  T is the Vandermonde
on evaluation points alpha_0 = 1, alpha_1 = 2, ..., alpha_(k-1) = k.</t>
              </li>
              <li>
                <t>Compute T_inv = T^(-1) using Gaussian elimination in GF(2^8).</t>
              </li>
              <li>
                <t>Multiply: E = V * T_inv.  The result has an identity block on top
(rows 0 through k-1) and the parity generation matrix P on the
bottom (rows k through k + m - 1).</t>
              </li>
            </ol>
            <t>The identity block makes the code systematic: data shards pass through
unchanged, and only the parity sub-matrix P is needed during encoding.
These bottom rows do not match any external encoding at m &gt;= 3;
this encoding stands on its own at m &gt;= 3.</t>
          </section>
        </section>
        <section anchor="encoding-1">
          <name>Encoding</name>
          <t>Given k data shards, each of shard_len bytes, encoding produces m
parity shards, each also shard_len bytes:</t>
          <artwork><![CDATA[
For each byte position j in [0, shard_len):
  For each parity shard i in [0, m):
    parity[i][j] = sum over s in [0, k) of P[i][s] * data[s][j]
]]></artwork>
          <t>where the sum and product are in GF(2^8).  All shards (data and
parity) are the same size.</t>
        </section>
        <section anchor="decoding">
          <name>Decoding</name>
          <t>When one or more shards are lost (up to m), reconstruction proceeds
by matrix inversion:</t>
          <ol spacing="normal" type="1"><li>
              <t>Select k available shards (from the k + m total).</t>
            </li>
            <li>
              <t>Form a k x k sub-matrix S of the encoding matrix E by selecting the
rows corresponding to the available shards.</t>
            </li>
            <li>
              <t>Compute S_inv = S^(-1) using Gaussian elimination in GF(2^8).</t>
            </li>
            <li>
              <t>Multiply S_inv by the vector of available shard data at each byte
position to recover the original k data shards.</t>
            </li>
            <li>
              <t>If any parity shards are also missing, regenerate them by
re-encoding from the recovered data shards.</t>
            </li>
          </ol>
          <t>The reconstruction cost is dominated by the matrix inversion, which
is O(k^3) in GF(2^8) multiplications.</t>
        </section>
        <section anchor="rs-interoperability-requirements">
          <name>RS Interoperability Requirements</name>
          <t>For two implementations of FFV2_ENCODING_RS_VANDERMONDE to
interoperate, they <bcp14>MUST</bcp14> agree on all of the following parameters.
Any deviation produces a different encoding matrix and renders
data unrecoverable by a different implementation.</t>
          <dl>
            <dt>Irreducible polynomial:</dt>
            <dd>
              <t><tt>x^8 + x^4 + x^3 + x^2 + 1</tt> (<tt>0x11d</tt>).</t>
            </dd>
            <dt>Primitive element:</dt>
            <dd>
              <t><tt>g = 2</tt>.</t>
            </dd>
            <dt>Evaluation points:</dt>
            <dd>
              <t>shard <tt>i</tt> (<tt>i = 0, 1, ..., k+m-1</tt>) uses
<tt>alpha_i = i + 1</tt> in GF(2^8) (values 1 through <tt>k+m</tt>, all
non-zero and distinct).</t>
            </dd>
            <dt>Vandermonde entries:</dt>
            <dd>
              <t><tt>V[i][j] = alpha_i^j = (i+1)^j</tt> in GF(2^8) for
<tt>i = 0..k+m-1</tt>, <tt>j = 0..k-1</tt>.</t>
            </dd>
            <dt>Matrix normalization:</dt>
            <dd>
              <t><tt>E = V * T^(-1)</tt> where <tt>T</tt> is the top <tt>k x k</tt> sub-matrix
(rows for shards <tt>0..k-1</tt>).</t>
            </dd>
            <dt>Parameter bound:</dt>
            <dd>
              <t><tt>k + m</tt> <bcp14>MUST NOT</bcp14> exceed 255.</t>
            </dd>
          </dl>
          <t>These parameters fully determine the encoding matrix for any
(k, m) configuration in the permitted range.</t>
        </section>
        <section anchor="rs-interoperability-test-vectors">
          <name>RS Interoperability Test Vectors</name>
          <t>The following worked examples pin the encoding matrix and
end-to-end encodings for two representative geometries: k=2 m=1
(exercises the m=1 all-ones parity row) and k=3 m=2 (exercises
the m=2 P + Q parity rows).  An implementation whose encoded
output matches these tables is using the same GF(2^8)
representation and the same parity-row construction as required
by the interoperability parameters above.</t>
          <section anchor="k2-m1">
            <name>k=2, m=1</name>
            <t>Encoding matrix <tt>E</tt>:</t>
            <artwork><![CDATA[
E = [ [0x01, 0x00],    // identity block for data shard 0
      [0x00, 0x01],    // identity block for data shard 1
      [0x01, 0x01] ]   // parity row P = [1, 1]
]]></artwork>
            <t>The parity shard is the bitwise XOR of both data shards:
<tt>parity[j] = data[0][j] XOR data[1][j]</tt>.</t>
            <t>Concrete byte-level test vector with <tt>shard_len = 1</tt>:</t>
            <table anchor="tbl-rs-test-vector-k2m1">
              <name>RS Vandermonde test vector: k=2, m=1</name>
              <thead>
                <tr>
                  <th align="left">data[0]</th>
                  <th align="left">data[1]</th>
                  <th align="left">parity</th>
                  <th align="left">Notes</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">zero input</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>0x01</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x01</tt></td>
                  <td align="left">0x01 XOR 0x00 = 0x01</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x01</tt></td>
                  <td align="left">
                    <tt>0x01</tt></td>
                  <td align="left">0x00 XOR 0x01 = 0x01</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>0x01</tt></td>
                  <td align="left">
                    <tt>0x01</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">0x01 XOR 0x01 = 0x00</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>0x80</tt></td>
                  <td align="left">
                    <tt>0x80</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">0x80 XOR 0x80 = 0x00</td>
                </tr>
              </tbody>
            </table>
          </section>
          <section anchor="k3-m2">
            <name>k=3, m=2</name>
            <t>Encoding matrix <tt>E</tt>:</t>
            <artwork><![CDATA[
E = [ [0x01, 0x00, 0x00],   // identity block for data shard 0
      [0x00, 0x01, 0x00],   // identity block for data shard 1
      [0x00, 0x00, 0x01],   // identity block for data shard 2
      [0x01, 0x01, 0x01],   // P row = [1, 1, 1]
      [0x01, 0x02, 0x04] ]  // Q row = [g^0, g^1, g^2] with g = 2
]]></artwork>
            <t>The two parity shards are computed byte-wise as:</t>
            <artwork><![CDATA[
P[j] = data[0][j] XOR data[1][j] XOR data[2][j]
Q[j] = 1 * data[0][j] XOR 2 * data[1][j] XOR 4 * data[2][j]
]]></artwork>
            <t>where the multiplication is in GF(2^8) with polynomial <tt>0x11d</tt>.</t>
            <t>Concrete byte-level test vector with <tt>shard_len = 1</tt>:</t>
            <table anchor="tbl-rs-test-vector-k3m2">
              <name>RS Vandermonde test vector: k=3, m=2</name>
              <thead>
                <tr>
                  <th align="left">data[0]</th>
                  <th align="left">data[1]</th>
                  <th align="left">data[2]</th>
                  <th align="left">P</th>
                  <th align="left">Q</th>
                  <th align="left">Notes</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">zero input</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>0x01</tt></td>
                  <td align="left">
                    <tt>0x02</tt></td>
                  <td align="left">
                    <tt>0x03</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x09</tt></td>
                  <td align="left">1 XOR (2<em>2) XOR (4</em>3) = 1 XOR 4 XOR 12 = 9</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>0x80</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x80</tt></td>
                  <td align="left">
                    <tt>0x80</tt></td>
                  <td align="left">Q = 1 * 0x80 = 0x80</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x80</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x80</tt></td>
                  <td align="left">
                    <tt>0x1d</tt></td>
                  <td align="left">Q = 2 * 0x80 = 0x100 -&gt; reduce by 0x11d -&gt; 0x1d</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x00</tt></td>
                  <td align="left">
                    <tt>0x80</tt></td>
                  <td align="left">
                    <tt>0x80</tt></td>
                  <td align="left">
                    <tt>0x3a</tt></td>
                  <td align="left">Q = 4 * 0x80 = (2 * 0x1d) = 0x3a</td>
                </tr>
                <tr>
                  <td align="left">
                    <tt>0x37</tt></td>
                  <td align="left">
                    <tt>0x91</tt></td>
                  <td align="left">
                    <tt>0xac</tt></td>
                  <td align="left">
                    <tt>0x0a</tt></td>
                  <td align="left">
                    <tt>0x82</tt></td>
                  <td align="left">general non-degenerate case</td>
                </tr>
              </tbody>
            </table>
            <t>Implementations that produce different values for any row of
either table disagree with this specification and will not
interoperate.  m &gt;= 3 test vectors are not included here because
the normalized-Vandermonde parity rows are not easily
hand-computed; implementations that need m &gt;= 3 verification
<bcp14>SHOULD</bcp14> cross-check against a reference implementation.</t>
          </section>
        </section>
        <section anchor="rs-shard-sizes">
          <name>RS Shard Sizes</name>
          <t>All RS shards (data and parity) are exactly shard_len bytes.  This
simplifies the CHUNK operation protocol: chunk_size is exactly the
shard size for all mirrors.</t>
          <table anchor="tbl-rs-shards">
            <name>RS shard sizes for common configurations</name>
            <thead>
              <tr>
                <th align="left">Configuration</th>
                <th align="left">File Size</th>
                <th align="left">Shard Size</th>
                <th align="left">Total Storage</th>
                <th align="left">Overhead</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">4+2</td>
                <td align="left">4 KB</td>
                <td align="left">1 KB</td>
                <td align="left">6 KB</td>
                <td align="left">50%</td>
              </tr>
              <tr>
                <td align="left">4+2</td>
                <td align="left">1 MB</td>
                <td align="left">256 KB</td>
                <td align="left">1.5 MB</td>
                <td align="left">50%</td>
              </tr>
              <tr>
                <td align="left">8+2</td>
                <td align="left">4 KB</td>
                <td align="left">512 B</td>
                <td align="left">5 KB</td>
                <td align="left">25%</td>
              </tr>
              <tr>
                <td align="left">8+2</td>
                <td align="left">1 MB</td>
                <td align="left">128 KB</td>
                <td align="left">1.25 MB</td>
                <td align="left">25%</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="sec-mojette-encoding">
        <name>Mojette Transform Encoding (FFV2_ENCODING_MOJETTE_SYSTEMATIC, FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC)</name>
        <section anchor="overview-3">
          <name>Overview</name>
          <t>The Mojette Transform is an erasure coding technique based on discrete
geometry rather than algebraic field operations.  It computes 1D
projections of a 2D grid along selected directions.  Given enough
projections, the original grid can be reconstructed exactly.</t>
          <t>The transform operates on fixed-width words combined with bitwise
XOR -- the additive group of <tt>(GF(2))^(W*8)</tt> where W is the
element width in bytes.  Encoders and decoders <bcp14>MUST</bcp14> use XOR;
modular integer addition is not equivalent and is not
interoperable.  XOR has no carry chain, is its own inverse (so
the residual subtraction in reconstruction is identical to the
forward accumulation), and scales straightforwardly to wider
SIMD lanes (NEON, SSE, AVX, AVX-512) without requiring
multiplicative Galois field operations.</t>
          <t>For interoperability, this specification pins the element width
to <tt>W = 8</tt> bytes (64 bits) for both
FFV2_ENCODING_MOJETTE_SYSTEMATIC and
FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC in this revision.  All
implementations <bcp14>MUST</bcp14> use W = 8; a future revision (or a distinct
registered encoding type) may lift the fixed width, at which
point it becomes a wire-visible parameter.  Fixing W in this
revision prevents an interoperability hazard: the same shard
input XOR'd at W = 4 versus W = 8 produces different bin values
that appear "close but wrong" to a mismatched decoder.</t>
        </section>
        <section anchor="grid-structure">
          <name>Grid Structure</name>
          <t>Data is arranged as a P x Q grid of unsigned integer elements,
where P is the number of columns and Q is the number of rows.
For k data shards of S bytes each with W-byte elements:</t>
          <artwork><![CDATA[
P = S / W       (columns per row)
Q = k           (rows = data shards)
]]></artwork>
        </section>
        <section anchor="directions">
          <name>Directions</name>
          <t>A direction is a pair of coprime integers (p_i, q_i).  This
specification pins all directions to q_i = 1 for both Mojette
encoding types (systematic and non-systematic) in this
revision.  Non-unity q_i values may be introduced by a future
distinct registered encoding type.</t>
          <t>For n = k + m total shards (Mojette non-systematic) or m parity
shards (Mojette systematic), the direction set is determined by
the following mandatory rule on the shard count N (N = n for
non-systematic, N = m for systematic).</t>
          <dl>
            <dt>For N even (N = 2t):</dt>
            <dd>
              <t><tt>directions = { (p, 1) : p in {-t, -t+1, ..., -1, 1, 2, ..., t} }</tt>
-- symmetric around zero, giving <tt>|directions| = 2t = N</tt>.</t>
            </dd>
            <dt>For N odd (N = 2t + 1):</dt>
            <dd>
              <t><tt>directions = { (p, 1) : p in {-t, -t+1, ..., -1, 1, 2, ..., t, t+1} }</tt>
-- asymmetric by including one additional positive magnitude
so that <tt>|directions| = 2t + 1 = N</tt>.</t>
            </dd>
          </dl>
          <t>Direction slots are then sorted by <tt>p_i</tt> ascending (most-negative
p first, most-positive p last) to give the canonical direction
order.  The direction in slot i is used to compute the projection
for shard slot (k + i) in systematic form, or for shard slot i in
non-systematic form.  Examples:</t>
          <ul spacing="normal">
            <li>
              <t>N = 4 (even): p = {-2, -1, 1, 2}</t>
            </li>
            <li>
              <t>N = 6 (even): p = {-3, -2, -1, 1, 2, 3}</t>
            </li>
            <li>
              <t>N = 3 (odd):  p = {-1, 1, 2}</t>
            </li>
            <li>
              <t>N = 5 (odd):  p = {-2, -1, 1, 2, 3}</t>
            </li>
          </ul>
          <t>Two implementations that follow this algorithm on the same N
generate identical direction sets in identical slot order and
therefore identical shard layouts.  Implementations <bcp14>MUST NOT</bcp14>
diverge from this algorithm (e.g., by using a different
tie-breaking rule for odd N) without registering a distinct
encoding type.</t>
        </section>
        <section anchor="forward-transform-encoding">
          <name>Forward Transform (Encoding)</name>
          <t>For each direction (p_i, q_i), the forward transform computes a 1D
projection.  Each bin XORs the grid elements that lie on a discrete
line through the grid.  This specification adopts the bin
convention of <xref target="NORMAND"/>: a grid cell at (row, col) maps to bin</t>
          <artwork><![CDATA[
b = row * p + col * q - off
]]></artwork>
          <t>where off is chosen so that the smallest reachable bin index is 0
(off = min over all (row, col) in [0, Q) x [0, P) of row * p + col * q).
All implementations <bcp14>MUST</bcp14> use this convention -- the alternative
"transposed" convention <tt>b = col * p - row * q + off</tt> produces a
different bin ordering and is not interoperable.</t>
          <t>The full forward transform along direction (p, q) is then:</t>
          <artwork><![CDATA[
Projection(b, p, q) = XOR over all (row, col) where
                       row * p + col * q - off = b
                       of Grid[row][col]
]]></artwork>
          <t>The number of bins B in a projection is:</t>
          <artwork><![CDATA[
B(p, q, P, Q) = |p| * (Q - 1) + |q| * (P - 1) + 1
]]></artwork>
          <t>For q = 1, this simplifies to:</t>
          <artwork><![CDATA[
B = abs(p) * (Q - 1) + P
]]></artwork>
          <t>The byte size of the projection is B * W.</t>
        </section>
        <section anchor="katz-reconstruction-criterion">
          <name>Katz Reconstruction Criterion</name>
          <t>Reconstruction from a set of <tt>n</tt> projections is possible if and
only if the Katz criterion <xref target="KATZ"/> holds over those <tt>n</tt>
projections:</t>
          <artwork><![CDATA[
SUM(i=1..n) |q_i| >= Q    OR    SUM(i=1..n) |p_i| >= P
]]></artwork>
          <t>With q_i = 1 pinned for every direction (see the Directions
subsection above), the q-sum simplifies to n &gt;= Q.</t>
          <t>For the non-systematic form, <tt>n = k + m</tt> and every direction
counts toward the criterion.  The criterion holds for the
initial encoding (design-time check on the direction set) and
must continue to hold after any losses; the surviving
projections must satisfy Katz over the same grid dimensions
(P, Q).</t>
          <t>For the systematic form, the raw data rows act as
"projections at direction (p=0, q=1)": row <tt>r</tt> is <tt>Grid[r]</tt> and
contributes <tt>q = 1</tt> toward the q-sum of the Katz criterion.
For an arbitrary loss pattern with <tt>r</tt> data-row losses and <tt>s</tt>
parity-projection losses (with <tt>r + s &lt;= m</tt>), the surviving set
comprises <tt>k - r</tt> data rows (each <tt>q_i = 1</tt>) and <tt>m - s</tt> parity
projections.  Decoding proceeds by:</t>
          <ol spacing="normal" type="1"><li>
              <t>Subtracting the contributions of the <tt>k - r</tt> surviving data
rows from the <tt>m - s</tt> surviving parity projections (the
"residual").</t>
            </li>
            <li>
              <t>Applying the corner-peeling algorithm over the residual to
recover the <tt>r</tt> missing rows.</t>
            </li>
          </ol>
          <t>Step 2 succeeds if and only if the Katz criterion holds over
the <tt>m - s</tt> residual projections against the <tt>r x P</tt> unknown
sub-grid.  Substituting: the criterion reduces to
<tt>m - s &gt;= r</tt> (q-sum, since q_i = 1 for every parity direction
and the unknown-grid Q is r) OR the analogous p-sum condition
over the residual.  Because the mandatory direction algorithm
above generates <tt>m</tt> projections with distinct nonzero p values,
the p-sum condition also holds for any loss pattern with
<tt>r + s &lt;= m</tt>; the systematic form therefore achieves
Maximum-Distance-Separable-like recovery up to <tt>m</tt> combined
data-row and parity-projection losses.</t>
        </section>
        <section anchor="inverse-transform-decoding">
          <name>Inverse Transform (Decoding)</name>
          <t>The choice of inverse algorithm is purely an implementer concern:
all correct inverses produce byte-identical plaintext from the same
shards and bin layout, so the choice has no on-the-wire impact.
Two well-known algorithms apply.</t>
          <t>The corner-peeling algorithm:</t>
          <ol spacing="normal" type="1"><li>
              <t>Count how many unknown elements contribute to each bin.</t>
            </li>
            <li>
              <t>Find any bin with exactly one contributor (singleton).</t>
            </li>
            <li>
              <t>Recover the element, XOR it back through all projections.</t>
            </li>
            <li>
              <t>Repeat until all elements are recovered.</t>
            </li>
          </ol>
          <t>Corner peeling runs in O(n * P * Q) and is the simplest correct
inverse.  Implementations <bcp14>MAY</bcp14> instead use the geometry-driven
inverse of <xref target="NORMAND"/>, which precomputes a recurrence over the
sorted projection slopes and walks each line once: it eliminates
the inner singleton search and runs substantially faster on the
parameter ranges typical of flexible file v2 layout deployments (high redundancy,
wide stripes), with no change to the shards or to the
reconstructed plaintext.</t>
        </section>
        <section anchor="systematic-mojette">
          <name>Systematic Mojette</name>
          <t>In the systematic form (FFV2_ENCODING_MOJETTE_SYSTEMATIC), the first
k shards are the original data rows and the remaining m shards are
projections.  Healthy reads require no decoding.</t>
          <t>Reconstruction of missing data rows proceeds via the
corner-peeling algorithm of <xref target="NORMAND"/>:</t>
          <ol spacing="normal" type="1"><li>
              <t>Load available parity projections.</t>
            </li>
            <li>
              <t>Subtract contributions of present data rows (residual).</t>
            </li>
            <li>
              <t>Corner-peel the residual to recover missing rows.</t>
            </li>
          </ol>
          <t>Reconstruction cost is O(m * k) -- a fundamental advantage over RS
at wide geometries (k &gt;= 8).</t>
        </section>
        <section anchor="non-systematic-mojette">
          <name>Non-Systematic Mojette</name>
          <t>In the non-systematic form (FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC),
all k + m shards are projections.  Every read requires the full
inverse transform.  This provides constant performance regardless of
failure count, but at higher baseline read cost than systematic.</t>
        </section>
        <section anchor="mojette-shard-sizes-and-layout">
          <name>Mojette Shard Sizes and Layout</name>
          <dl>
            <dt>Slot-to-direction mapping:</dt>
            <dd>
              <t>The canonical shard layout for Mojette is:</t>
              <dl>
                <dt>Systematic (FFV2_ENCODING_MOJETTE_SYSTEMATIC):</dt>
                <dd>
                  <t>shard slots <tt>0..k-1</tt> carry the k data rows (row r in slot
r); shard slots <tt>k..k+m-1</tt> carry the m parity projections
in the canonical direction order defined in the Directions
subsection above (direction slot i occupies shard slot
<tt>k + i</tt>).</t>
                </dd>
                <dt>Non-systematic (FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC):</dt>
                <dd>
                  <t>shard slots <tt>0..k+m-1</tt> carry the n = k + m parity
projections in the canonical direction order (direction
slot i occupies shard slot i).</t>
                </dd>
              </dl>
            </dd>
            <dt>Bin ordering within a projection:</dt>
            <dd>
              <t>Within a projection shard the bins are serialized in
ascending bin-index order (bin 0 first, bin B-1 last), with
no gap or header.  Each bin value is <tt>W = 8</tt> bytes wide; the
W-byte element is serialized in big-endian byte order (the
same order the data-row shards present their W-byte grid
elements in).</t>
            </dd>
            <dt>Projection sizes:</dt>
            <dd>
              <t>Unlike Reed-Solomon, Mojette parity shard sizes vary by
direction:</t>
            </dd>
          </dl>
          <table anchor="tbl-mojette-proj-sizes">
            <name>Mojette projection sizes for 4+2, 4KB shards, W=8</name>
            <thead>
              <tr>
                <th align="left">Direction (p, q)</th>
                <th align="left">Bins (B) for P=512, Q=4</th>
                <th align="left">Size (bytes, W=8)</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">(-3, 1)</td>
                <td align="left">521</td>
                <td align="left">4168</td>
              </tr>
              <tr>
                <td align="left">(-2, 1)</td>
                <td align="left">518</td>
                <td align="left">4144</td>
              </tr>
              <tr>
                <td align="left">(-1, 1)</td>
                <td align="left">515</td>
                <td align="left">4120</td>
              </tr>
              <tr>
                <td align="left">(1, 1)</td>
                <td align="left">515</td>
                <td align="left">4120</td>
              </tr>
              <tr>
                <td align="left">(2, 1)</td>
                <td align="left">518</td>
                <td align="left">4144</td>
              </tr>
              <tr>
                <td align="left">(3, 1)</td>
                <td align="left">521</td>
                <td align="left">4168</td>
              </tr>
            </tbody>
          </table>
          <dl>
            <dt>Chunk sizing for variable-length projections:</dt>
            <dd>
              <t>When a projection shard is written via <tt>CHUNK_WRITE</tt> /
<tt>CHUNK_FINALIZE</tt> / <tt>CHUNK_COMMIT</tt>, the shard is divided into
chunks by the following mapping.  Let <tt>shard_bytes = B * W</tt>
be the projection shard's total byte size (where B is the
number of bins per the B formula above
(<xref target="tbl-mojette-proj-sizes"/> uses it) applied to the shard's
direction (p, q) and the grid dimensions (P, Q)):</t>
              <ul spacing="normal">
                <li>
                  <t><tt>num_chunks = ceil(shard_bytes / chunk_size)</tt></t>
                </li>
                <li>
                  <t>Chunk <tt>j</tt> (for j = 0..num_chunks-1) covers the shard byte
range <tt>[j * chunk_size, min((j+1) * chunk_size,
shard_bytes))</tt>.</t>
                </li>
                <li>
                  <t>The final chunk (chunk <tt>num_chunks - 1</tt>) <bcp14>MAY</bcp14> be shorter
than <tt>chunk_size</tt> if <tt>shard_bytes</tt> is not a multiple of
<tt>chunk_size</tt>; all other chunks are exactly <tt>chunk_size</tt>
bytes.</t>
                </li>
              </ul>
            </dd>
          </dl>
          <t>The <tt>chunk_size</tt> value is a per-mirror parameter and does not
vary across the parity projections of a single file, even
though the shard sizes vary.  For a file with parity
projections of sizes <tt>S_i = B_i * W</tt>, the number of chunks per
shard is <tt>ceil(S_i / chunk_size)</tt> per shard; a reader that
requests chunk offset <tt>&gt;= S_i</tt> on shard i receives
<tt>NFS4ERR_PAYLOAD_LOST</tt> (per <xref target="sec-NFS4ERR_PAYLOAD_LOST"/>) with a
short read reporting the shard's true byte length.</t>
        </section>
      </section>
      <section anchor="comparison-of-encoding-types">
        <name>Comparison of Encoding Types</name>
        <table anchor="tbl-encoding-comparison">
          <name>Comparison of erasure encoding types</name>
          <thead>
            <tr>
              <th align="left">Property</th>
              <th align="left">Reed-Solomon</th>
              <th align="left">Mojette Systematic</th>
              <th align="left">Mojette Non-Systematic</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Maximum Distance Separable guarantee</td>
              <td align="left">Yes</td>
              <td align="left">Yes (Katz)</td>
              <td align="left">Yes (Katz)</td>
            </tr>
            <tr>
              <td align="left">Shard sizes</td>
              <td align="left">Uniform</td>
              <td align="left">Variable</td>
              <td align="left">Variable</td>
            </tr>
            <tr>
              <td align="left">Reconstruction cost</td>
              <td align="left">O(k^3) shard ops<br/>(matrix inversion)</td>
              <td align="left">O(m<em>k</em>P*Q) grid ops (peeling)</td>
              <td align="left">O(m<em>k</em>P*Q) grid ops (peeling)</td>
            </tr>
            <tr>
              <td align="left">Healthy read cost</td>
              <td align="left">Zero</td>
              <td align="left">Zero</td>
              <td align="left">Full decode</td>
            </tr>
            <tr>
              <td align="left">GF operations</td>
              <td align="left">Yes (GF(2^8))</td>
              <td align="left">No</td>
              <td align="left">No</td>
            </tr>
          </tbody>
        </table>
        <t>Reed-Solomon uses uniform shard sizes and GF(2^8) operations.
Mojette systematic provides zero-cost healthy reads with variable
parity shard sizes; reconstruction cost scales as O(m * k) rather
than O(k^3).  Mojette non-systematic encodes all k + m shards as
projections, providing constant decode cost regardless of failure
count at a higher baseline read cost than systematic.  The choice
among these is a deployment decision driven by workload
characteristics and operational priorities.</t>
      </section>
      <section anchor="handling-write-holes">
        <name>Handling write holes</name>
        <t>A write hole occurs when a client begins writing a stripe but does not
successfully write all k + m shards before a failure.  Some data servers
will hold new data while others still hold old data, producing an
non-atomic payload.</t>
        <t>The CHUNK_WRITE / CHUNK_ROLLBACK mechanism addresses this.  When a client
issues CHUNK_WRITE, the data server retains a copy of the previous shard
and places the new data in the PENDING state.  If any shard write fails,
the client issues CHUNK_ROLLBACK to each data server that received a
CHUNK_WRITE, restoring the previous content.  The payload remains
atomic from the reader's perspective throughout, because PENDING
blocks carry the new chunk_guard4 value and CHUNK_READ returns the last
COMMITTED or FINALIZED block when a PENDING block exists.</t>
        <t>A single-shard CHUNK_WRITE failure <bcp14>MAY</bcp14> alternatively be
handled by reporting the failure to the metadata server via
LAYOUTERROR and letting the metadata server initiate the
repair flow at <xref target="sec-repair-selection"/>.  The metadata server
adds a REPAIR-flagged replacement data server to the layout
(from its out-of-band pool) and drives reconstruction of the
missing shard.</t>
        <t>In the multiple writer model, a write hole can also arise when two clients
are racing.  The chunk_guard4 value on each chunk identifies which
transaction wrote it.  A reader that finds chunks with different guard
values detects the non-atomicity and either retries (if a concurrent write
is still in progress) or reports NFS4ERR_PAYLOAD_NOT_ATOMIC to the
metadata server to trigger repair.</t>
        <t>When CHUNK_ROLLBACK and repair are both unavailable, and the
payload cannot be reconstructed because too many shards have
been lost (for example, a catastrophic multi-data server failure
with no reachable replacement data servers), the repair flow
ultimately terminates with NFS4ERR_PAYLOAD_LOST; see
<xref target="sec-NFS4ERR_PAYLOAD_LOST"/>.</t>
      </section>
    </section>
    <section anchor="sec-system-model">
      <name>System Model and Correctness</name>
      <t>The design decisions in this document -- centralized coordination
through the metadata server, CAS semantics via chunk_guard4,
pessimistic lock escrow during repair, and erasure-coded reads
from any sufficient subset -- depart visibly from a classical
distributed-consensus protocol such as Paxos or Raft.  This
section states the system model those decisions rest on, the
consistency and progress guarantees the protocol provides under
that model, and how the protocol relates to (and when it relies
on) classical consensus.  It is intended as the correctness
framing for implementers and reviewers; the normative wire
behavior is defined in the preceding sections.</t>
      <section anchor="sec-system-model-wire">
        <name>Wire Semantics vs Implementation</name>
        <t>The protocol defines wire semantics, not data-server
implementation.  The operations introduced in
<xref target="sec-new-ops"/> (CHUNK_WRITE, CHUNK_FINALIZE, CHUNK_COMMIT,
CHUNK_ROLLBACK, CHUNK_LOCK / CHUNK_UNLOCK, CHUNK_READ,
CHUNK_REPAIRED, CHUNK_ERROR, CHUNK_HEADER_READ,
CHUNK_WRITE_REPAIR) together with the per-chunk state machine
(<xref target="sec-system-model-chunk-state"/>) and the chunk_guard4 CAS
(<xref target="sec-chunk_guard4"/>) are everything a peer observes.
The data server's internal representation of persistent state is
not exposed on the wire, and two data-server implementations
that satisfy the same wire semantics <bcp14>MAY</bcp14> differ arbitrarily in
their internal structure.</t>
        <t>In particular, the protocol does NOT exchange:</t>
        <ul spacing="normal">
          <li>
            <t>which on-disk layout (log-structured, append-only,
in-place-overwrite, external object store, key-value store,
or any other) a data server uses to persist chunks;</t>
          </li>
          <li>
            <t>whether a data server holds PENDING and FINALIZED chunks in
a single blob or in distinct regions;</t>
          </li>
          <li>
            <t>how a data server represents the CHUNK_LOCK table, the guard
epoch, or the escrow owner;</t>
          </li>
          <li>
            <t>whether a data server's chunk retention beyond COMMIT is
implemented via shadow blocks, journals, reference counts,
or copy-on-write.</t>
          </li>
        </ul>
        <t>This decoupling is deliberate.  It lets the protocol accommodate
future smart-data server designs -- including designs that integrate more
closely with storage back-ends that already provide atomic
replace, multi-version concurrency, or internal erasure coding --
without protocol revisions, provided the wire semantics are
preserved.  Conversely, a data server implementer is free to
pick the representation that best fits the underlying storage
stack without fear that some less common implementation choice
is disallowed.</t>
        <t>The counterpart of this rule is that the wire is the entire
contract.  Any behavior a client relies on <bcp14>MUST</bcp14> be observable
via the operations listed above; any behavior that is not
observable (cache state, background scrubbing cadence,
internal retry ordering, on-disk layout) is implementation
detail and <bcp14>MUST NOT</bcp14> be depended upon.</t>
      </section>
      <section anchor="sec-system-model-chunk-not-block">
        <name>Chunks Are Not Blocks</name>
        <t>The chunk is a protocol-level primitive distinct from a block.
Throughout this document, "block" refers to a byte range in the
file's address space (the application's view); "chunk" refers to
the addressable unit carried by the CHUNK operations, which
has an envelope that blocks do not.</t>
        <t>A chunk carries five properties that a block does not:</t>
        <dl>
          <dt>Atomicity:</dt>
          <dd>
            <t>the chunk_guard4 compare-and-swap guard (<xref target="sec-chunk_guard4"/>)
sequences concurrent writers and rejects torn-write attempts.
Block I/O has no comparable primitive; concurrent block
writes either serialize at the storage layer or interleave
unpredictably.</t>
          </dd>
          <dt>Integrity:</dt>
          <dd>
            <t>the checksum in each chunk header is computed over the header
and payload and verified end-to-end on the read path
(<xref target="sec-CHUNK_READ"/>).  Block I/O carries no integrity tag;
data-corruption detection is delegated to the underlying
storage medium or is absent.</t>
          </dd>
          <dt>Provenance:</dt>
          <dd>
            <t>the chunk_owner4 (<xref target="sec-chunk_owner4"/>) records which
transaction produced the chunk.  Block I/O carries no
per-write provenance; a block's bytes have no
protocol-visible producer.</t>
          </dd>
          <dt>Lifecycle state:</dt>
          <dd>
            <t>a chunk progresses through PENDING -&gt; FINALIZED -&gt; COMMITTED
via CHUNK_FINALIZE / CHUNK_COMMIT
(<xref target="sec-system-model-chunk-state"/>).  Block I/O has no
lifecycle states; a block is either present or absent.</t>
          </dd>
          <dt>Lock continuity across revocation:</dt>
          <dd>
            <t>the chunk's lock (<xref target="sec-CHUNK_LOCK"/>) is transferred to the
metadata server in escrow when a holder's stateid is revoked,
and adopted by a repair actor via CHUNK_LOCK_FLAGS_ADOPT.
Block I/O has no per-block locking and no continuity
mechanism; client failure leaves any external lock
indeterminate.</t>
          </dd>
        </dl>
        <t>Each of these properties is load-bearing for some part of the
flexible file v2 layout's consistency story: the chunk_guard4
CAS underlies multi-writer correctness; the checksum underlies
end-to-end integrity; lock escrow underlies repair coordination
across stateid revocation; the state machine underlies the
PENDING / FINALIZED / COMMITTED distinction that enables
rollback and repair.  Removing any one of them would change
what the protocol can guarantee.</t>
        <t>A protocol that exchanges file data as byte ranges with no
envelope -- whether described as "block I/O" or as "generic
data movement" -- is not interoperable with this specification's
CHUNK operations.  The CHUNK operations are not a byte-range
I/O protocol with optional integrity bolted on; they are a
chunk protocol in which the envelope is the primitive.</t>
      </section>
      <section anchor="sec-system-model-roles">
        <name>Actors and Roles</name>
        <t>Three actors participate on behalf of any given file:</t>
        <dl>
          <dt>pNFS client:</dt>
          <dd>
            <t>Issues CHUNK operations to data servers over the data path;
issues LAYOUTGET, LAYOUTRETURN, LAYOUTERROR, and SEQUENCE to
the metadata server on the control path.  Authenticates to the
metadata server via AUTH_SYS, RPCSEC_GSS, or TLS.  <bcp14>MAY</bcp14> be
selected as a repair actor via CB_CHUNK_REPAIR.</t>
          </dd>
          <dt>Metadata server:</dt>
          <dd>
            <t>Is the sole coordinator for the file.  Grants, renews, and
revokes layouts; issues TRUST_STATEID / REVOKE_STATEID /
BULK_REVOKE_STATEID to each tight-coupled data server; selects
the repair actor under the rules in
<xref target="sec-repair-selection"/>; owns the reserved
CHUNK_GUARD_CLIENT_ID_MDS escrow identity for in-flight repair.</t>
          </dd>
          <dt>Data server:</dt>
          <dd>
            <t>Persists chunks and enforces the per-file trust table, the
per-chunk guard CAS (chunk_guard4), the per-chunk lock state
(including the metadata-server escrow owner), and the chunk state machine
(EMPTY / PENDING / FINALIZED / COMMITTED).  Has no
coordinator role.  Has no knowledge of the erasure encoding type
in use for any file: the erasure transform is performed
entirely at the client, and the data server stores the
resulting chunks without interpreting their contents.</t>
          </dd>
        </dl>
        <t>An entity <bcp14>MAY</bcp14> simultaneously hold more than one of these roles
with respect to a given data server, with each role bound to a
distinct session.  A metadata server that opens a control
session to a data server (presenting EXCHGID4_FLAG_USE_PNFS_MDS
at EXCHANGE_ID; see <xref target="sec-tight-coupling-control-session"/>)
issues TRUST_STATEID, REVOKE_STATEID, and BULK_REVOKE_STATEID on
that session; on a separate client-side session (presenting
EXCHGID4_FLAG_USE_NON_PNFS), the same metadata server <bcp14>MAY</bcp14> also
issue CHUNK operations as a data-path client.  A data server
<bcp14>MUST NOT</bcp14> assume that the metadata server is not also one of its
clients; it distinguishes metadata-server-only operations from client-side
operations by the EXCHANGE_ID flags of the session that carries
the operation, not by the requester's IP address or principal.</t>
        <t>A data server <bcp14>MAY</bcp14> likewise act as a client of another data
server -- for example, when selected as the repair actor by an
metadata-server-directed CB_CHUNK_REPAIR.  Independent of the actor role,
any entity may operate as encoding-aware (issuing CHUNK
operations directly against data servers) or encoding-unaware
(operating through the proxy server mediated READ / WRITE path
described in the proxy server draft).  Proxy-server registration
carries the encoding capability
explicitly; direct pNFS clients reveal their encoding posture
implicitly through the operations they issue.</t>
        <t>The protocol does NOT mandate how a data server implements the
chunk state machine or stores PENDING chunks.  An implementation
<bcp14>MAY</bcp14> use per-client staging files, a single append-only instance
file with an index, a separate metadata-header file paired with
a blocks file, a log-structured store, or any other
representation that preserves the normative semantics (the
EMPTY / PENDING / FINALIZED / COMMITTED transitions, the
chunk_guard4 CAS, lock continuity across revocation, and the
integrity checks).  The choice is a data-server implementation
concern and is transparent to clients and the metadata server.</t>
      </section>
      <section anchor="sec-system-model-failures">
        <name>Failure Model</name>
        <t>The protocol assumes:</t>
        <dl>
          <dt>Crash-stop:</dt>
          <dd>
            <t>Clients, metadata servers, and data servers fail by stopping.
A restarted component rejoins the protocol with a fresh epoch
and participates in the grace / reclaim path already defined
in <xref target="RFC8881"/>.  Correct components do not exhibit arbitrary
(Byzantine) behavior.</t>
          </dd>
          <dt>Fail-silent data servers:</dt>
          <dd>
            <t>Data servers report honestly about the state of the data they
hold.  The protocol detects on-disk bit rot via checksum
(see <xref target="sec-CHUNK_WRITE"/>) but does not defend against a data
server that deliberately lies about whether a chunk is
COMMITTED or what its contents are.  Byzantine data servers
are explicitly outside the trust model; see
<xref target="sec-system-model-nongoals"/>.</t>
          </dd>
          <dt>Authenticated writers and their own data:</dt>
          <dd>
            <t>An authenticated client may write arbitrary (even
semantically-invalid) bytes into chunks it owns.  The checksum
check detects transport corruption, not adversarial content.
This matches the existing NFSv4 authorization model: once
you have write access, you may write anything.</t>
          </dd>
          <dt>Network partitions:</dt>
          <dd>
            <t>The protocol is partition-tolerant at the cost of availability
during the partition window.  A client partitioned from a
data server recovers via LAYOUTERROR and may be issued a new
layout (with a REPAIR-flagged replacement data server
added by the metadata server; see
<xref target="sec-repair-selection"/>).  A metadata server partitioned from a data
server eventually renews trust entries on reconnection; in
the interim, the data server returns NFS4ERR_DELAY for
affected stateids (see <xref target="sec-tight-coupling-mds-crash"/>).
Message loss is bounded by RPC retransmit; eventual delivery
is assumed once the partition heals.
</t>
            <t>Split-brain scenarios (in which a partitioned minority of
the data servers in a mirror set attempts to make progress
independently of the majority) cannot drive non-atomic
writes to COMMITTED state.  The chunk_guard4 CAS on each
write requires the guard value from a successor chunk to
strictly advance the guard value of its predecessor; on
partition heal, any writes attempted on the minority side
are detected by the majority because their guard values do
not satisfy the CAS precondition, and those writes are
discarded.  When reconciliation is impossible -- for example,
the erasure coding has lost too many shards across both sides
of the partition to reconstruct any single atomic
generation -- the repair flow terminates with
NFS4ERR_PAYLOAD_LOST (see <xref target="sec-NFS4ERR_PAYLOAD_LOST"/>),
which is terminal for the affected ranges.</t>
          </dd>
          <dt>Lease bound:</dt>
          <dd>
            <t>All state held by a data server on behalf of a metadata server
is bounded by the TRUST_STATEID expiry (see
<xref target="sec-tight-coupling-lease"/>).  An orphaned entry will
eventually expire even if the metadata server never returns.</t>
          </dd>
        </dl>
      </section>
      <section anchor="sec-system-model-escrow">
        <name>Escrow Model</name>
        <t>Chunk locks (<xref target="sec-CHUNK_LOCK"/>) provide the
exclusion primitive that the chunk_guard4 CAS
(<xref target="sec-chunk_guard4"/>) cannot: a client that needs to hold a
chunk against every other writer for the duration of a
multi-step operation (repair, migration, delta-write
coordination) acquires a CHUNK_LOCK.  Once acquired, the lock
is held on the data server's state, not on the metadata
server.  That creates two survivability problems the wire
protocol has to answer:</t>
        <dl>
          <dt>Client failure while holding locks:</dt>
          <dd>
            <t>a client whose stateid is revoked (lease expiry,
CB_LAYOUTRECALL timeout, explicit REVOKE_STATEID) is by
definition no longer authorized to speak to the data server.
If its outstanding chunk locks were simply dropped, the
locked chunks would become writable by any other client
immediately -- mid-way through the operation the lost client
was performing.  That would expose the chunk to concurrent
writers before the operation completes, defeating the point
of taking the lock.</t>
          </dd>
          <dt>Metadata-server instance change:</dt>
          <dd>
            <t>in a highly-available deployment the metadata-server role
can move from one physical host to another (restart, planned
failover, unplanned failover).  If the departing incarnation
had installed placeholder locks on the data server (see
below), the arriving incarnation needs to reclaim them
safely -- reclaim by identity, not by client-connection
state, since the connection is gone -- and must
simultaneously fence the departing incarnation so that a
stale prior host resuming operation cannot double-manage the
same escrows.</t>
          </dd>
        </dl>
        <t>Both problems resolve to the same primitive: chunk locks CAN be
held by an owner other than the client that acquired them, and
OWNERSHIP CAN TRANSFER without releasing the lock.  The escrow
mechanism has three components:</t>
        <dl>
          <dt>Placeholder ownership:</dt>
          <dd>
            <t>when a client's stateid is revoked while it holds chunk
locks, the data server <bcp14>MUST NOT</bcp14> drop the locks.  Instead the
locks transfer to the metadata server as a placeholder
owner, identified on the wire by the reserved value
CHUNK_GUARD_CLIENT_ID_MDS in cg_client_id
(<xref target="sec-chunk_guard_mds"/>).  The chunk stays locked -- no
concurrent writer can win a CAS against the placeholder --
until a repair actor adopts the lock explicitly via
CHUNK_LOCK_FLAGS_ADOPT (<xref target="sec-CHUNK_LOCK"/>) driven by
CB_CHUNK_REPAIR.  This closes the
lock-continuity gap across client failure.</t>
          </dd>
          <dt>Escrow identity:</dt>
          <dd>
            <t>every placeholder-owned lock the metadata server installs on
the data server carries an escrow_id4 (<xref target="sec-escrow_id4"/>),
a 128-bit opaque identifier the metadata server chooses.
escrow_id4 is what a repair actor names when adopting a
specific escrow, what CHUNK_ESCROW_ENUMERATE returns to inventory
outstanding escrows, and what CHUNK_ESCROW_RELEASE names when the metadata
server retires an escrow explicitly.  Without a stable
identity, cross-restart adoption and reclamation could not
name what they were operating on.</t>
          </dd>
          <dt>Incarnation handoff:</dt>
          <dd>
            <t>when the metadata-server role moves to a new host (restart,
HA failover), the new incarnation reclaims escrows the old
incarnation installed via CHUNK_ESCROW_TAKEOVER.  The TAKEOVER carries an
incarnation-lease proof (<xref target="sec-proof-profile"/>) --
cryptographic evidence that the caller is now the
authoritative metadata-server incarnation -- which the data
server verifies.  On acceptance, subsequent escrow
operations from the prior incarnation are rejected with
NFS4ERR_STALE_MDS_EPOCH (<xref target="sec-NFS4ERR_STALE_MDS_EPOCH"/>),
fencing the departed instance.  Only one metadata-server
incarnation is authoritative on any given data server at a
time.</t>
          </dd>
        </dl>
        <t>This mechanism does not support concurrent
multi-metadata-server management of the same file -- see the
single-metadata-server-per-file position in
<xref target="sec-system-model-nongoals"/>.  The escrow control plane
handles the metadata-server role moving between physical hosts
over time (via TAKEOVER), not multiple metadata servers acting
on the same escrow simultaneously.</t>
        <t>Wire mechanics for the operations referenced here
(CHUNK_ESCROW_INSTALL,
CHUNK_ESCROW_RELEASE, CHUNK_ESCROW_ENUMERATE,
CHUNK_ESCROW_TAKEOVER, the incarnation-lease proof format, the
escrow_id4 XDR) live in the New NFSv4.2 Common Data
Structures and New NFSv4.2 Operations sections.</t>
      </section>
      <section anchor="sec-system-model-chunk-state">
        <name>Chunk State Machine</name>
        <t>Each chunk on a data server occupies exactly one of four states.
The transitions below are the complete set; any implementation
of the data server's chunk state table <bcp14>MUST</bcp14> admit these
transitions and no others.</t>
        <figure anchor="fig-chunk-state-machine">
          <name>Chunk lifecycle on the data server</name>
          <artwork><![CDATA[
                            CHUNK_WRITE
                         (fresh cg_gen_id)
        +---------+ -------------------> +-------------+
        |  EMPTY  |                      |   PENDING   |
        +---------+ <------------------- +-------------+
             ^         CHUNK_ROLLBACK            |
             |        (discard PENDING)          |
             |                                   | CHUNK_FINALIZE
             |                                   |  (writer stops
             |                                   |   further writes)
             |                                   v
             |                            +-------------+
             |       CHUNK_ROLLBACK       |  FINALIZED  |
             |      (discard FINALIZED)   +-------------+
             |                                   |
             |                                   | CHUNK_COMMIT
             |                                   |  (make durable
             |                                   |   and globally
             |                                   |   visible)
             |                                   v
             |                            +-------------+
             +--------------------------> |  COMMITTED  |
                   CHUNK_ROLLBACK         +-------------+
                (only via repair;                 |
                 replaces with a newer            | CHUNK_WRITE with
                 COMMITTED generation             | a higher cg_gen_id
                 or discards per the              | begins a new
                 rollback invariant)              | PENDING successor;
                                                  | the prior COMMITTED
                                                  | is retained until
                                                  | its successor is
                                                  | COMMITTED (see the
                                                  v  rollback invariant
                                            (next PENDING
                                             against same chunk)
]]></artwork>
        </figure>
        <t>CHUNK_WRITE against a chunk already in PENDING from the same
writer with the same cg_gen_id is a self-transition on PENDING:
the data server replaces the PENDING payload in place and the
state does not change.  This case is not drawn in
<xref target="fig-chunk-state-machine"/> for clarity.</t>
        <t>States:</t>
        <dl>
          <dt>EMPTY:</dt>
          <dd>
            <t>The chunk has no payload.  CHUNK_READ returns a zero-filled
result; CHUNK_WRITE against an EMPTY chunk is the first write.</t>
          </dd>
          <dt>PENDING:</dt>
          <dd>
            <t>The chunk has payload accepted by CHUNK_WRITE but not yet
finalized.  Not visible to CHUNK_READ (see
<xref target="sec-system-model-consistency"/>).  Further CHUNK_WRITEs from
the same writer <bcp14>MAY</bcp14> replace the payload in place (same
cg_gen_id).</t>
          </dd>
          <dt>FINALIZED:</dt>
          <dd>
            <t>The writer has signalled via CHUNK_FINALIZE that it will send
no more CHUNK_WRITEs for this generation.  Still not visible
to CHUNK_READ, but a candidate for CHUNK_COMMIT.</t>
          </dd>
          <dt>COMMITTED:</dt>
          <dd>
            <t>The chunk is durable and globally visible.  Subsequent
CHUNK_READs return this content until a newer COMMITTED
generation replaces it.  A higher-generation PENDING successor
<bcp14>MAY</bcp14> exist concurrently; the rollback invariant in
<xref target="sec-system-model-consistency"/> requires the data server to
retain the COMMITTED content while that successor exists.</t>
          </dd>
        </dl>
        <t>Transitions are driven by the operations named on the arrows.
CHUNK_ROLLBACK against a COMMITTED chunk is used only on the
repair path (see <xref target="sec-CHUNK_ROLLBACK"/>) and replaces the chunk
with a newer COMMITTED generation chosen by the repair actor,
rather than returning the chunk to EMPTY.</t>
        <t><xref target="fig-chunk-state-machine"/> covers the lifecycle of a chunk's
payload but not the lock that may be held on it.  The lock has
its own state machine, shown in <xref target="fig-chunk-lock-machine"/>.</t>
        <figure anchor="fig-chunk-lock-machine">
          <name>Chunk lock ownership on the data server</name>
          <artwork><![CDATA[
                        CHUNK_LOCK
                     (writer acquires)
      +----------+ ----------------> +-------------------+
      | UNLOCKED |                   | LOCKED by writer  |
      +----------+ <---------------- +-------------------+
           ^           CHUNK_UNLOCK            |
           |          (writer releases)        |
           |                                   | REVOKE_STATEID
           |                                   |  (metadata server
           |                                   |   invalidates writer
           |                                   |   stateid; lock
           |                                   |   transfers to
           |                                   |   metadata-server
           |                                   |   escrow)
           |                                   v
           |        CHUNK_UNLOCK     +-------------------+
           |       or CHUNK_REPAIRED |     LOCKED by     |
           |      (repair actor     |  metadata-server  |
           |       releases after    |      escrow       |
           |       repair completes) +-------------------+
           |                                   |
           |                                   | CHUNK_LOCK with
           |                                   | CHUNK_LOCK_FLAGS_ADOPT
           |                                   |  (repair actor
           |                                   |   adopts metadata-
           |                                   |   server escrow
           |                                   |   ownership per
           |                                   |   CB_CHUNK_REPAIR)
           |                                   v
           |                         +-------------------+
           +------------------------ | LOCKED by repair  |
                                     +-------------------+
]]></artwork>
        </figure>
        <t>The lock state machine is orthogonal to the chunk lifecycle in
<xref target="fig-chunk-state-machine"/>: a chunk in any of EMPTY, PENDING,
FINALIZED, or COMMITTED <bcp14>MAY</bcp14> simultaneously be in any of the
four lock states.  The errored bit (set by CHUNK_ERROR, cleared
by CHUNK_REPAIRED) is a third orthogonal axis and is not drawn;
CHUNK_ERROR may set the bit in any state, and CHUNK_REPAIRED
clears it as part of completing a repair sequence.  A CHUNK_LOCK
that arrives while the chunk is already LOCKED by a different
owner returns NFS4ERR_CHUNK_LOCKED with the existing owner's
chunk_owner4 in clr_owner (<xref target="sec-CHUNK_LOCK"/>).</t>
      </section>
      <section anchor="sec-system-model-read-time-status">
        <name>Read-Time Generation Status</name>
        <t>Independent of the chunk lifecycle state
(<xref target="fig-chunk-state-machine"/>) and the lock state
(<xref target="sec-CHUNK_LOCK"/>), a data server distinguishes three
read-time statuses for any generation the caller names or
observes at a chunk index.  These are the higher-level
categories the CHUNK_READ per-chunk
status codes and the CHUNK_HEADER_READ discovery response classify
into:</t>
        <dl>
          <dt>AVAILABLE:</dt>
          <dd>
            <t>the generation's payload is held by the data server and
its integrity check succeeds at read time.  A
CHUNK_READ returns the payload with NFS4_OK.  A
CHUNK_HEADER_READ that observes an AVAILABLE
predecessor is the input the caller uses to decide
whether CHUNK_ROLLBACK's restore case
(<xref target="sec-CHUNK_ROLLBACK"/> "Rollback of COMMITTED
Chunks") can succeed under the caller's own retention
scope (<xref target="sec-system-model-retention-scope"/>).</t>
          </dd>
          <dt>ERRORED:</dt>
          <dd>
            <t>the owner-to-index association is still recorded but
the payload is not readable -- the persisted checksum
or guard check fails at read time
(<xref target="sec-NFS4ERR_PAYLOAD_NOT_ATOMIC"/>), the underlying
storage is unreachable, or the chunk carries the
errored bit set by an earlier CHUNK_ERROR.  A CHUNK_READ returns
NFS4ERR_PAYLOAD_NOT_ATOMIC (or another per-chunk
status appropriate to the failure); the client
reports the fault via LAYOUTERROR and the metadata
server arranges repair.  An ERRORED generation is
observable -- its owner triple can be discovered -- but
not consumable.</t>
          </dd>
          <dt>ABSENT:</dt>
          <dd>
            <t>the data server holds no generation at the requested
chunk index (the chunk is EMPTY) or holds no
generation matching the requested owner triple.  A
CHUNK_READ returns the synthetic-hole response
(<xref target="sec-CHUNK_READ"/>) or per-chunk NFS4ERR_NOENT.  A
CHUNK_HEADER_READ that names a predecessor and finds
ABSENT returns the absence in its per-chunk response
fields; a CHUNK_ROLLBACK that names such a
predecessor returns NFS4ERR_NO_PREDECESSOR
(<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>) or NFS4ERR_INVAL per
the rules under "Deletion Atomicity and Invalidated
Triples" (<xref target="sec-CHUNK_ROLLBACK"/>).</t>
          </dd>
        </dl>
        <t>The three statuses are exhaustive at read time: any
generation the caller might reference is exactly one of
AVAILABLE, ERRORED, or ABSENT.  A generation can
transition from AVAILABLE to ERRORED (via CHUNK_ERROR
or a checksum failure) and from ERRORED back to
AVAILABLE (via a successful repair sequence).  The
transition from AVAILABLE or ERRORED to ABSENT is a
release under the retention scope rule
(<xref target="sec-system-model-retention-scope"/>) coupled with the
payload/association biconditional
(<xref target="sec-system-model-payload-association-biconditional"/>):
the payload and its owner-to-index association are
released together and the generation vanishes from the
observable set.  There is no transition from ABSENT
back to any observable status for the same owner
triple: the invalidated-triple rule ("Deletion
Atomicity and Invalidated Triples" under
<xref target="sec-CHUNK_ROLLBACK"/>) forbids resurrection.</t>
      </section>
      <section anchor="sec-system-model-consistency">
        <name>Consistency Guarantees</name>
        <t>The protocol provides per-chunk linearizability on COMMITTED
state:</t>
        <ol spacing="normal" type="1"><li>
            <t>Once CHUNK_COMMIT returns success to a writer for a given
chunk, every subsequent CHUNK_READ whose stateid postdates
the COMMIT observes either that writer's data or the data of
a later committed write.  A reader <bcp14>MUST NOT</bcp14> observe a
rolled-back write as if it had committed.</t>
          </li>
          <li>
            <t>Concurrent writers on the same chunk in multi-writer mode
serialize via chunk_guard4.  On guard conflict one writer
succeeds; the other receives NFS4ERR_CHUNK_GUARDED and <bcp14>MUST</bcp14>
either abandon the write or re-read and retry.  At most one
generation becomes COMMITTED per serialized decision.</t>
          </li>
          <li>
            <t>During repair, the chunk's lock is held continuously -- first
by the original writer, then transferred to the metadata-server escrow
owner on REVOKE_STATEID, and finally adopted by the repair
client via CHUNK_LOCK_FLAGS_ADOPT.  No writer that did not
hold the lock may observe or mutate the chunk.  The
invariant "a chunk with a live lock has exactly one logical
owner at any instant" is preserved across revocation.</t>
          </li>
        </ol>
        <t>Across multiple chunks the protocol makes no multi-chunk
atomicity or ordering guarantee.  A reader that reads chunk A
at one offset and chunk B at another <bcp14>MAY</bcp14> observe A's new value
and B's old value simultaneously.  Applications that require
multi-chunk atomicity <bcp14>MUST</bcp14> layer it above this protocol -- for
example, via file-level checksums, application-level generation
fields, or external transaction managers.</t>
        <dl>
          <dt>The chunk is the unit of atomicity:</dt>
          <dd>
            <t>Two properties follow.</t>
          </dd>
        </dl>
        <ol spacing="normal" type="1"><li>
            <t>Chunk-aligned writes do not interfere.  Two concurrent
writers whose writes cover disjoint chunks -- even writes
that cover adjacent chunks -- never race.  Each write
terminates independently at COMMITTED per the per-chunk
linearizability rule above.</t>
          </li>
          <li>
            <t>Sub-chunk overlapping writes from different writers
produce chunk-resolution-granularity contention.  When two
concurrent writers target overlapping byte ranges within a
single chunk, chunk_guard4 resolves them: one writer's
entire chunk-generation wins and becomes COMMITTED; the
other writer sees NFS4ERR_CHUNK_GUARDED and is expected to
re-read and retry if it wishes to apply its change on top
of the winning generation (see
<xref target="sec-NFS4ERR_CHUNK_GUARDED"/>).  The protocol does NOT
produce byte-level merges of overlapping sub-chunk writes:
the losing writer's bytes are not preserved as a partial
update within the winning generation.</t>
          </li>
        </ol>
        <t>Applications that require byte-level write merging or sub-chunk
ordering guarantees <bcp14>MUST</bcp14> serialize such writes externally, for
example via NFSv4 byte range locks (<xref target="RFC8881"/>, Section 12).
The chunk size that bounds the atomicity unit for a given file
is the product of ffv2m_striping_unit_size and the stripe width
W in <xref target="fig-striping-math"/>; applications can query
fattr4_coding_block_size (see <xref target="sec-fattr4_coding_block_size"/>)
to learn the effective chunk size and align their writes
accordingly.</t>
        <t>This choice -- chunk-boundary atomicity rather than stripe- or
block-boundary atomicity -- is load-bearing for the rest of the
consistency story: the chunk_guard4 CAS evaluates at the chunk
level, the PENDING / FINALIZED / COMMITTED state machine is per
chunk, CHUNK_LOCK is per chunk, and repair via CB_CHUNK_REPAIR
operates on chunks.  A different atomicity boundary would
require redefining those primitives.</t>
        <dl>
          <dt>Erasure-coded reads:</dt>
          <dd>
            <t>A reader of an erasure-coded file reconstructs the plaintext
from any sufficient subset of k shards of the (k + m)-shard
stripe; the guard values on those shards <bcp14>MUST</bcp14> agree.  Shards
with stale guards are ignored.  This is not a quorum read in
the Paxos sense -- there is no voting on a value; there is
only reconstruction of the single value identified by the
current guard.</t>
          </dd>
          <dt>Rollback invariant:</dt>
          <dd>
            <t>The data server <bcp14>MUST</bcp14> retain the prior FINALIZED or COMMITTED
content of a chunk while any successor PENDING or FINALIZED
chunk exists.
A corollary of this rule is the lowest-guard-recoverable
property: as long as at least k data servers in the mirror
set retain the chunk at some generation G or lower, the
payload that was COMMITTED at generation G (or earlier) can
be reconstructed.  This is the correctness basis for
CHUNK_ROLLBACK (see <xref target="sec-CHUNK_ROLLBACK"/>): rollback does not
synthesize data, it simply selects the lowest-generation
chunks whose guards agree across the mirror set and discards
the higher-generation PENDING or FINALIZED chunks that
triggered the rollback.  The protocol never relies on locating
or reconstructing data from outside the mirror set.</t>
          </dd>
          <dt>Visibility of non-committed state:</dt>
          <dd>
            <t>PENDING and FINALIZED chunks <bcp14>MUST NOT</bcp14> be globally visible.
CHUNK_READ returns only COMMITTED content; a CHUNK_READ whose
target chunk is currently PENDING or FINALIZED sees the
predecessor COMMITTED content (or an EMPTY chunk if none
exists), not the in-progress successor.  A writer observing
its own PENDING or FINALIZED chunk <bcp14>MAY</bcp14> receive the in-progress
content on the same stateid that produced it, but no other
stateid -- on the same or a different client -- sees it.
The retention window that makes the prior COMMITTED content
available to CHUNK_READ and to CHUNK_ROLLBACK is itself
bounded; see <xref target="sec-system-model-retention-scope"/> for the
normative scoping rule.</t>
          </dd>
        </dl>
      </section>
      <section anchor="sec-system-model-retention-scope">
        <name>Ownership and Scope of Retained Prior Content</name>
        <t>The rollback invariant in <xref target="sec-system-model-consistency"/>
requires a data server to retain the prior FINALIZED or
COMMITTED content of a chunk while any successor PENDING or
FINALIZED chunk exists.  That retained content -- sometimes informally called
the "safe buffer" -- is not global state.  It is scoped to the
stateid that wrote the PENDING successor, and its retention and
visibility are governed by that owning stateid's lease.</t>
        <dl>
          <dt>Owner:</dt>
          <dd>
            <t>The data server <bcp14>MUST</bcp14> record, alongside each PENDING chunk,
the owning stateid (the stateid presented on the CHUNK_WRITE
that produced the PENDING).  This is the owning writer's
stateid; it identifies the client and openowner/lockowner
that the data server will release the PENDING to on
CHUNK_FINALIZE or CHUNK_COMMIT, and that the metadata server will treat
as the authoritative owner for purposes of
<xref target="sec-system-model-progress"/>.</t>
          </dd>
          <dt>Visibility:</dt>
          <dd>
            <t>Before transition to COMMITTED, the PENDING content is
visible only on the owning stateid.  A CHUNK_READ presenting
any other stateid (from the same client or a different
client) <bcp14>MUST</bcp14> observe the predecessor COMMITTED or EMPTY
state, not the PENDING successor.  This is the normative
form of the "non-committed data <bcp14>MUST NOT</bcp14> be globally visible"
rule stated in the "Visibility of non-committed state"
bullet of <xref target="sec-system-model-consistency"/>.</t>
          </dd>
          <dt>Retention window:</dt>
          <dd>
            <t>The data server <bcp14>MUST</bcp14> retain the predecessor COMMITTED (or
FINALIZED) content that the PENDING is superseding for as
long as the owning stateid's lease is valid.  If the owning
stateid's lease expires without the PENDING reaching
COMMITTED, the retention obligation for that PENDING ends
(see <xref target="sec-system-model-progress"/> for the scavenger rule
that drives demotion).  If the PENDING does reach COMMITTED,
the new COMMITTED generation supersedes the prior one under
the standard rollback invariant and its own retention is
governed by any newer PENDING successor.</t>
          </dd>
        </dl>
        <t>The practical effect is that the "safe buffer" for a chunk is
not an unbounded chunk-global state but a per-writer window
bounded by that writer's lease.  The data server always has a
rule for discarding retained prior content -- it is the
owning stateid's lease expiry -- so a chunk cannot accumulate
indefinitely many retained generations even in the presence of
dropped or partitioned writers.</t>
      </section>
      <section anchor="sec-system-model-owner-persistence">
        <name>Owner-to-Index Persistence Coupling</name>
        <t>The wire lifecycle operations (CHUNK_COMMIT, CHUNK_FINALIZE, CHUNK_ROLLBACK) name generations by full
owner triple
(<xref target="sec-chunk_owner4"/>) and require the data server to
locate the chunk-index each triple was written at.  For
that lookup to succeed after a data server restart, the
data server <bcp14>MUST</bcp14> persist the owner-to-index association
with a durability floor that matches the payload's:
without the association the payload can never again be
addressed by a lifecycle operation.</t>
        <dl>
          <dt>Uniqueness invariant (normative):</dt>
          <dd>
            <t>An accepted owner triple is
UNIQUE across the live generations the data server holds
for a given file: at any instant there is at most one
live generation on any chunk of the file that matches
that full triple.  Two writers with distinct co_client_id
values cannot collide.  A single writer that reuses a
co_cohort_id + co_id pair within the same co_client_id
across two distinct chunk indices <bcp14>MUST NOT</bcp14> do so while
the earlier generation remains live; the data server <bcp14>MAY</bcp14>
reject a CHUNK_WRITE that attempts to create such a
collision with NFS4ERR_INVAL in the corresponding
cwr_block_status slot.  The predecessor-retention rule
(<xref target="sec-system-model-consistency"/>) is compatible: a
retained predecessor and its successor on the same
chunk index <bcp14>MUST</bcp14> carry distinct triples (typically
distinct co_cohort_id under a shared co_client_id) so that
CHUNK_ROLLBACK can name each unambiguously.</t>
          </dd>
          <dt>Durability floor (normative, per CHUNK_WRITE <xref target="sec-CHUNK_WRITE"/> "Stability and Activation"):</dt>
          <dd>
            <t>The durability requirement varies by the CHUNK_WRITE
stability level:</t>
            <dl>
              <dt>FILE_SYNC4:</dt>
              <dd>
                <t>both the chunk payload AND its owner-to-index
association <bcp14>MUST</bcp14> survive a data server restart.</t>
              </dd>
              <dt>DATA_SYNC4:</dt>
              <dd>
                <t>both the chunk payload AND its owner-to-index
association <bcp14>MUST</bcp14> survive a data server restart.
(The association is retrieval metadata for the
payload; it shares the payload's durability floor.
An implementation <bcp14>MAY</bcp14> treat DATA_SYNC4 identically
to FILE_SYNC4.)</t>
              </dd>
              <dt>UNSTABLE4:</dt>
              <dd>
                <t>the association <bcp14>MAY</bcp14> be lost on restart, but ONLY if
the payload is also lost.  A data server <bcp14>MUST NOT</bcp14>
retain payload without its associated owner triple;
a payload whose association was lost is
unaddressable by every lifecycle operation and <bcp14>MUST</bcp14>
be treated as destroyed.  cwr_writeverf changes on
any restart that loses UNSTABLE4 state, allowing the
client to detect the loss.</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t>A data server that cannot honor the durability floor
for a given stability level <bcp14>MUST</bcp14> reject the CHUNK_WRITE
with NFS4ERR_IO rather than accepting the payload without
its association.</t>
        <t>The retention scope rule (<xref target="sec-system-model-retention-scope"/>)
governs WHEN a predecessor generation's payload +
association may be released; the payload/association
biconditional in the next subsection governs the
INVARIANT that whenever the payload survives, the
association survives with it, and vice versa.</t>
      </section>
      <section anchor="sec-system-model-payload-association-biconditional">
        <name>Payload and Association Biconditional</name>
        <t>For every generation the data server holds -- PENDING,
FINALIZED, or COMMITTED, including any predecessor
retained under the rollback invariant
(<xref target="sec-system-model-retention-scope"/>) -- the chunk
payload and its owner-to-index association
(<xref target="sec-system-model-owner-persistence"/>) <bcp14>MUST</bcp14> share a
lifetime.  A conforming data server <bcp14>MUST NOT</bcp14> release
one while retaining the other:</t>
        <dl>
          <dt><bcp14>MUST NOT</bcp14> retain payload without association:</dt>
          <dd>
            <t>A chunk payload whose owner-to-index association has
been released is unaddressable by every lifecycle
operation (CHUNK_COMMIT,
CHUNK_FINALIZE,
CHUNK_ROLLBACK) because
those operations name generations by full owner
triple (<xref target="sec-chunk_owner4"/>).  A data server that
cannot locate the recorded chunk index for a
presented triple returns the appropriate per-entry
error under the release-scope split at
<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>: NFS4ERR_INVAL when
the data server holds a concrete invalidation
context that identifies the triple (structurally
invalid, or released by an explicit CHUNK_ROLLBACK
delete case within the session slot's replay-cache
window), NFS4ERR_NO_PREDECESSOR otherwise.
Retaining the payload while making it unaddressable
serves no purpose and is prohibited.  The payload <bcp14>MUST</bcp14> be released
atomically with the association.</t>
          </dd>
          <dt><bcp14>MUST NOT</bcp14> release association while retaining payload:</dt>
          <dd>
            <t>A recorded owner-to-index association refers to a specific
chunk payload; the data server <bcp14>MUST NOT</bcp14> retain the
association after releasing that payload.  A subsequent
CHUNK_READ or lifecycle operation whose recorded index still
points to a released payload would return data whose
provenance the client cannot verify against its own writer
history; forbidding this releases the client from having to
detect such stale associations.</t>
          </dd>
        </dl>
        <t>The biconditional is symmetric: released together,
retained together.  This coupling is what makes
CHUNK_ROLLBACK's delete case (<xref target="sec-CHUNK_ROLLBACK"/>)
atomic -- invalidating a generation drops BOTH the
association and the payload in one step -- and what
makes CHUNK_ROLLBACK's restore case rely on the
predecessor's association surviving with its payload
as a single unit.  Data servers implementing an
on-disk chunk store <bcp14>SHOULD</bcp14> treat the association and
payload as the crash-consistent atomic unit at the
storage layer.</t>
        <t>The retention scope rule
(<xref target="sec-system-model-retention-scope"/>) governs WHEN the
pair may be released (bounded by the owning stateid's
lease and any successor's presence); this
biconditional governs the INVARIANT that whenever the
release happens, the two go together.</t>
      </section>
      <section anchor="sec-system-model-progress">
        <name>Progress and Termination</name>
        <t>Under the failure model above, the protocol guarantees the
following progress properties:</t>
        <dl>
          <dt>Data-path progress:</dt>
          <dd>
            <t>If all mirrors are reachable and none are failed, a
CHUNK_WRITE followed by CHUNK_FINALIZE followed by
CHUNK_COMMIT completes in O(1) round trips independent of
cluster size.  In particular, there is no consensus round,
no leader election, and no quorum voting on the write
itself.  The three operations <bcp14>MAY</bcp14> be amortized across
compounds: a steady-state writer sending a series of
CHUNK_WRITEs can piggyback the CHUNK_FINALIZE of the previous
write on the compound that carries the next write (for
example, <tt>SEQUENCE + PUTFH + CHUNK_FINALIZE + CHUNK_WRITE</tt>),
reducing the data-path happy case to a single round trip per
CHUNK_WRITE rather than three.  The CHUNK_COMMIT for the
final write in a sequence <bcp14>MAY</bcp14> similarly ride on the CLOSE
compound.  These compound-packing optimizations are
permitted by the normal NFSv4.2 compound rules and require
no protocol extensions.</t>
          </dd>
          <dt>Repair termination:</dt>
          <dd>
            <t>Every CB_CHUNK_REPAIR completes in bounded time.  The client
selected as the repair actor either:
</t>
            <ol spacing="normal" type="1"><li>
                <t>returns NFS4_OK for every range in ccra_ranges (repair
succeeded), or</t>
              </li>
              <li>
                <t>returns NFS4ERR_PAYLOAD_LOST for one or more ranges (the
erasure coding lost too many shards to reconstruct; the
data is permanently unrecoverable), or</t>
              </li>
              <li>
                <t>fails to respond within the ccra_deadline, in which case
the metadata server <bcp14>MUST</bcp14> re-select under the rules in
<xref target="sec-repair-selection"/> or <bcp14>MUST</bcp14> declare the ranges lost.</t>
              </li>
            </ol>
            <t>NFS4ERR_PAYLOAD_LOST is terminal for the affected ranges.
The protocol makes no further attempt to recover them.</t>
          </dd>
          <dt>Eventual trust-table convergence:</dt>
          <dd>
            <t>After a metadata server restart, each data server's trust
table converges to the metadata server's view within one
metadata-server lease period.  Entries that the metadata
server does not re-issue expire naturally via tsa_expire;
entries that the metadata server does re-issue transition
from pending-revalidation back to active on the next
TRUST_STATEID (see <xref target="sec-tight-coupling-mds-crash"/>).</t>
          </dd>
          <dt>Orphaned PENDING scavenger:</dt>
          <dd>
            <t>A PENDING chunk whose owning stateid (see
<xref target="sec-system-model-retention-scope"/>) has expired without
transition to FINALIZED or COMMITTED is an orphan.  The
metadata server <bcp14>MUST</bcp14> drive demotion of orphaned PENDINGs so
that no chunk remains in a non-terminal state indefinitely:
</t>
            <ol spacing="normal" type="1"><li>
                <t>When an owning stateid's lease expires, the metadata
server identifies every PENDING chunk owned by that
stateid (either from its own bookkeeping or by query
against the data server) and issues the control-plane
operations needed to demote each PENDING.</t>
              </li>
              <li>
                <t>Demotion replaces the PENDING with the predecessor
COMMITTED (or EMPTY) content that the data server has
been retaining under
<xref target="sec-system-model-retention-scope"/>.  The data server
<bcp14>MUST NOT</bcp14> wait for a separate client action before
performing the demotion.</t>
              </li>
              <li>
                <t>Any CHUNK_LOCK held in escrow on behalf of the expired
stateid (see <xref target="sec-chunk_guard_mds"/>) is released after
a metadata-server-defined grace period.  The grace period exists to
let a recovering client reclaim its lock via the grace /
reclaim path defined in <xref target="RFC8881"/>; on expiry of the
grace period without reclaim, the lock becomes available
for new CHUNK_LOCK_FLAGS_ADOPT acquirers.</t>
              </li>
            </ol>
            <t>The scavenger timeout (the delay between lease expiry and
demotion) is implementation-defined but <bcp14>SHOULD</bcp14> be tied to
the metadata server lease period so that it composes
naturally with existing NFSv4 grace / reclaim semantics.  A
scavenger timeout shorter than the lease risks racing an
in-progress client reclaim; a timeout substantially longer
than the lease extends the retention budget without a
commensurate benefit.</t>
            <t>A late-arriving client op against a demoted PENDING sees
NFS4ERR_BAD_STATEID under trusted-stateid tight coupling
(<xref target="sec-REVOKE_STATEID"/>) or NFS4ERR_NO_PREDECESSOR under
loose coupling (<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>); a
CHUNK_LOCK reclaim after the grace period fails per the
RFC 8881 grace-reclaim semantics.</t>
          </dd>
        </dl>
        <t>The protocol does NOT guarantee progress if the metadata server
is unavailable for longer than its lease period -- this is the
standard NFSv4 lease assumption and is inherited unchanged.</t>
      </section>
      <section anchor="sec-system-model-consensus">
        <name>Relation to Classical Consensus</name>
        <t>Classical consensus protocols (Paxos, Raft, Viewstamped
Replication) solve the problem of reaching agreement among
mutually-distrusting replicas in the absence of a trusted
coordinator.  They typically cost two or three round trips per
decision, require a majority of replicas to be live and
reachable for progress, and impose the overhead of leader
election and log replication.</t>
        <t>This protocol is not a consensus protocol and does not attempt
to be.  Its approach instead is:</t>
        <dl>
          <dt>Designated coordinator:</dt>
          <dd>
            <t>The metadata server is the
coordinator for a file.  Clients accept the metadata server's authority
for layout grants, stateid registration, repair actor
selection, and revocation.  This assumption is the same one
made by <xref target="RFC8434"/> and all pNFS layout types to date.</t>
          </dd>
          <dt>Per-chunk CAS, not per-chunk voting:</dt>
          <dd>
            <t>Concurrent writes
on the same chunk serialize via chunk_guard4 as a CAS
primitive (see <xref target="sec-chunk_guard4"/>).  No replica vote is
required; the data server that owns the chunk evaluates the
guard locally and rejects stale writes with
NFS4ERR_CHUNK_GUARDED.</t>
          </dd>
          <dt>Pessimistic locks off the critical path:</dt>
          <dd>
            <t>CHUNK_LOCK is
used only during repair, never on the normal write path.
Lock escrow (see <xref target="sec-chunk_guard_mds"/>) preserves the
"exactly one owner" invariant across stateid revocation
without requiring a consensus round to elect the next owner.</t>
          </dd>
          <dt>Erasure-coded reads replace quorum reads:</dt>
          <dd>
            <t>A reader
reconstructs from any k of k + m shards with matching guards.
No voting is needed because there is no disagreement to
resolve: the guard identifies the single generation that was
committed.</t>
          </dd>
        </dl>
        <t>The result is a data path with O(1) round-trip cost independent
of the number of replicas, and a repair path whose cost is
bounded by the number of affected chunks rather than by the
cluster size.</t>
        <t>Metadata-server high availability is orthogonal.  Deployments
that require a highly-available metadata server <bcp14>MAY</bcp14> replicate
metadata-server state across multiple metadata server instances
using classical consensus (Raft, Paxos, or equivalent).  Such
replication is implementation-defined; from a pNFS client's
perspective a highly-available metadata server looks like a
single metadata server that occasionally resets its session and
triggers grace-period reclaim, and the client's behavior is
already specified by <xref target="RFC8881"/>.  This protocol neither
requires nor precludes such an implementation.</t>
      </section>
      <section anchor="sec-system-model-nongoals">
        <name>Non-Goals</name>
        <t>For clarity, the protocol explicitly does not provide:</t>
        <dl>
          <dt>Byzantine fault tolerance:</dt>
          <dd>
            <t>A data server that
deliberately misreports its state, or a client that
bypasses its own authentication, is outside the trust model.
Deployments requiring Byzantine tolerance <bcp14>MUST</bcp14> add it in a
layer above or below this protocol.</t>
          </dd>
          <dt>Metadata server high availability:</dt>
          <dd>
            <t>Single-metadata-server-per-file is the protocol model.  Metadata server
high availability, if deployed, is implemented below the wire
protocol and transparent to clients.</t>
          </dd>
          <dt>Cross-file atomicity:</dt>
          <dd>
            <t>Writes to multiple files are not
atomic at the protocol level.  File-system-level transactions
are not defined.</t>
          </dd>
          <dt>Multi-chunk atomicity within a single file:</dt>
          <dd>
            <t>COMMITs on
distinct chunks are independent.  A reader may observe a
partial write across chunks; applications must layer their
own consistency if they need otherwise.</t>
          </dd>
          <dt>Global linearizability across unrelated files:</dt>
          <dd>
            <t>Each
file's COMMITTED state is linearizable in isolation; no
total order is defined across files.</t>
          </dd>
          <dt>Authenticated malicious client protection:</dt>
          <dd>
            <t>An
authenticated client may write garbage into its own chunks
with a correctly computed checksum; see
<xref target="sec-security-checksum-scope"/>.  A bit-flip-class checksum
is a transport-integrity check, not an adversarial-integrity
check; cryptographic-class checksums detect adversarial
modification by anyone other than the authenticated writer.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="nfsv42-operations-allowed-to-data-files">
      <name>NFSv4.2 Operations Allowed to Data Files</name>
      <t>In the Flexible File Version 1 Layout Type (<xref target="RFC8435"/>), the data path
between client and data server was NFSv3 (<xref target="RFC1813"/>); the
operations a client sent to a data file were limited to READ,
WRITE, and COMMIT, and the operations the metadata server sent on
its control plane to the data server were limited to GETATTR,
SETATTR, CREATE, and REMOVE.  An NFSv4.2 data server, as used by
the Flexible File Version 2 Layout Type, exposes a much larger
operation set.  This section defines which operations a client <bcp14>MAY</bcp14>
send to a data file, which operations the metadata server <bcp14>MAY</bcp14>
send, and which operations a data server <bcp14>MUST</bcp14> reject.</t>
      <t>The restrictions below apply only to operations directed at a data
file on a data server.  Clients retain the full NFSv4.2 operation
set for files visible through the metadata server, including the
operations prohibited below (RENAME, LINK, CLONE, COPY, ACL-scoped
SETATTR, and so on).  The metadata server <bcp14>MAY</bcp14> internally use
operations on data files that clients <bcp14>MUST NOT</bcp14> send, as part of
its control-plane duties for the file (see
<xref target="sec-system-model-roles"/>).</t>
      <section anchor="sec-ops-mds">
        <name>Control Plane: Metadata Server to Data Server</name>
        <t>When the metadata server acts as a client to a data server, it is
managing the data file on behalf of the metadata file's namespace.
A data server <bcp14>MUST</bcp14> support the following operations on data files
when issued by the metadata server:</t>
        <ul spacing="normal">
          <li>
            <t>SEQUENCE, PUTFH, PUTROOTFH, GETFH (<xref target="RFC8881"/> Sections 18.46,
18.19, 18.21, 18.8): session and filehandle plumbing.</t>
          </li>
          <li>
            <t>LOOKUP (<xref section="18.15" sectionFormat="of" target="RFC8881"/>): directory traversal
the metadata server issues when locating data files it has
allocated for its use.</t>
          </li>
          <li>
            <t>GETATTR (<xref section="18.7" sectionFormat="of" target="RFC8881"/>): the metadata server issues
GETATTR against the data file after a write layout is returned,
to pull the post-write size, mtime, and other attributes back
and reconcile its cached view.  Any other attribute queries
the metadata server needs for the same purpose use the same
operation.</t>
          </li>
          <li>
            <t>SETATTR (<xref section="18.30" sectionFormat="of" target="RFC8881"/>): data file truncate for
metadata-server-level SETATTR(size) fan-out, synthetic uid/gid rotation
for fencing, and mode-bit initialization when the metadata
server binds a data file to a new metadata-level file.</t>
          </li>
          <li>
            <t>CREATE (<xref section="18.4" sectionFormat="of" target="RFC8881"/>): the metadata server's own
allocation of data files on the data server.</t>
          </li>
          <li>
            <t>REMOVE (<xref section="18.25" sectionFormat="of" target="RFC8881"/>): cleanup on metadata server file
unlink.</t>
          </li>
          <li>
            <t>OPEN, CLOSE (<xref target="RFC8881"/> Sections 18.16, 18.2): used by the
metadata server when it acts as a client to the data server
for I/O routed through the metadata server or through a
proxy server on the metadata server's behalf.</t>
          </li>
          <li>
            <t>EXCHANGE_ID, CREATE_SESSION, DESTROY_SESSION,
BIND_CONN_TO_SESSION, DESTROY_CLIENTID (<xref target="RFC8881"/> Sections
18.35, 18.36, 18.37, 18.34, 18.50): control-session
management.  The metadata server sets
EXCHGID4_FLAG_USE_PNFS_MDS in its EXCHANGE_ID.  A data
server that supports the tight coupling control protocol
(see <xref target="sec-tight-coupling-control-session"/>) identifies the
metadata server's session by EXCHGID4_FLAG_USE_PNFS_MDS and
accepts TRUST_STATEID, REVOKE_STATEID, and
BULK_REVOKE_STATEID on that session.</t>
          </li>
          <li>
            <t>TRUST_STATEID, REVOKE_STATEID, BULK_REVOKE_STATEID: the metadata-server-to-data-server tight coupling
trust-table control operations.</t>
          </li>
        </ul>
        <t>The metadata server <bcp14>MAY</bcp14> also use other NFSv4.2 operations on data
files as implementation-defined control-plane actions (for
example, COPY or CLONE to migrate a data file between data
servers during a proxy server operation).  The list above is the
minimum set a flexible file v2 layout data server <bcp14>MUST</bcp14> support for the
metadata server's use.</t>
      </section>
      <section anchor="sec-ops-client">
        <name>Data Path: Client to Data Server</name>
        <t>A pNFS client with an active flexible file v2 layout <bcp14>MUST</bcp14> restrict
the operations it issues against data files to the operations
defined below.  A data server that has identified the file as a
chunked data file (see <xref target="sec-data-file-identification"/>) <bcp14>MUST</bcp14>
reject any other operation on that file with NFS4ERR_NOTSUPP.</t>
        <section anchor="sec-data-file-identification">
          <name>Data-File Identification on the Data Server</name>
          <t>The "<bcp14>MUST</bcp14> reject" rules in this section apply on the data server
side only to files the data server has identified as chunked data
files.  A data server identifies a file by any of the following
means, in decreasing order of authority:</t>
          <dl>
            <dt>fattr4_chunked_data_file = TRUE:</dt>
            <dd>
              <t>The metadata server has set this attribute
(<xref target="sec-fattr4_chunked_data_file"/>) when it allocated the
file as a chunked data file.  This is the authoritative
per-file identification and is required for a data server that
supports the attribute.</t>
            </dd>
            <dt>Live TRUST_STATEID entry for the file:</dt>
            <dd>
              <t>Under trusted-stateid tight coupling
(<xref target="sec-tight-coupling-control"/>), a live trust entry for the
file registered via TRUST_STATEID
identifies the file as under flexible file v2 layout
management.  This is a
fallback for data servers that do not yet support
fattr4_chunked_data_file, and it is per-client rather
than per-file, but it is sufficient to trigger the "<bcp14>MUST</bcp14>
reject" rules for that client's operations against the file.</t>
            </dd>
            <dt>Deployment namespace convention:</dt>
            <dd>
              <t>Deployments <bcp14>SHOULD</bcp14> export chunked data files in a namespace
scope not shared with client-accessible file access, as one
means of preventing a misconfigured or malicious client from
reaching data files through a normal NFS mount.  A data server
<bcp14>MAY</bcp14> apply the "<bcp14>MUST</bcp14> reject" rules to every file in a
namespace configured for flexible file v2 layout data-file
service, without
per-file classification.  Note that a separate NFS export
does not close direct filesystem access on the data server
host itself; that is outside the scope of this specification.</t>
            </dd>
          </dl>
          <t>If none of the above identifies the file, the data server cannot
reliably classify it and the client-side "<bcp14>MUST NOT</bcp14>" rules in this
section remain the primary defense.  Client-side compliance is
mandatory in all deployment modes regardless of what the data
server can enforce.</t>
        </section>
        <section anchor="session-and-identity-plumbing">
          <name>Session and Identity Plumbing</name>
          <t>Required for all protection modes:</t>
          <ul spacing="normal">
            <li>
              <t>SEQUENCE, PUTFH, GETFH, PUTROOTFH (<xref target="RFC8881"/> Sections 18.46,
18.19, 18.8, 18.21).</t>
            </li>
            <li>
              <t>EXCHANGE_ID, CREATE_SESSION, DESTROY_SESSION,
BIND_CONN_TO_SESSION, DESTROY_CLIENTID (<xref target="RFC8881"/> Sections
18.35, 18.36, 18.37, 18.34, 18.50).</t>
            </li>
            <li>
              <t>RECLAIM_COMPLETE (<xref section="18.51" sectionFormat="of" target="RFC8881"/>).</t>
            </li>
            <li>
              <t>SECINFO, SECINFO_NO_NAME (<xref target="RFC8881"/> Sections 18.29, 18.45):
discovery of acceptable security flavors on the data
server.</t>
            </li>
          </ul>
          <t>These operations are baseline NFSv4.2 session plumbing and are
supported on data files as on any NFSv4.2 file.</t>
        </section>
        <section anchor="sec-ds-stateid-model">
          <name>Stateid Model on the Data Server</name>
          <t>The stateid presented on a CHUNK operation is a layout
stateid returned by a prior LAYOUTGET against the metadata
server (see <xref section="18.43" sectionFormat="of" target="RFC8881"/>), NOT an open
stateid, byte range lock stateid, or delegation stateid.  A
pNFS client does NOT issue OPEN against the data server.
This is a meaningful departure from the stateid model in
<xref section="18.32" sectionFormat="of" target="RFC8881"/> (which states that the WRITE
stateid "represents a value returned from a previous
byte range LOCK or OPEN request or the stateid associated
with a delegation"), and clients implementing
Flexible File Version 2 <bcp14>MUST NOT</bcp14> carry over those
expectations to the data path.</t>
          <t>The three roles the RFC 8881 stateid plays on a regular
NFSv4 server split apart in the Flexible File Version 2
data-server model:</t>
          <dl>
            <dt>Open and share-mode tracking:</dt>
            <dd>
              <t>Lives at the metadata server, established by OPEN
(<xref section="18.16" sectionFormat="of" target="RFC8881"/>) on the metadata-server
filehandle.  The metadata server's open stateid is NOT
exposed to data servers; share-mode conflicts are
resolved at the metadata server before LAYOUTGET grants
a layout.</t>
            </dd>
            <dt>Byte-range lock tracking:</dt>
            <dd>
              <t>Does not apply at the data server.  Locking on the data
path is chunk-range rather than byte range, expressed
via CHUNK_LOCK, and the lock holder
is identified by chunk_owner4 (the (co_cohort_id,
co_client_id, co_id) triple) rather than by a lock stateid.  A
client wanting byte range locks on a file <bcp14>MUST</bcp14> acquire
them on the metadata-server filehandle, where standard
<xref section="12" sectionFormat="of" target="RFC8881"/> byte range locking applies.</t>
            </dd>
            <dt>I/O authorization on the data server:</dt>
            <dd>
              <t>The layout stateid carried on CHUNK operations.
encodings that use CHUNK operations require tight coupling
(<xref target="sec-ff_device_addr4"/>); the metadata server registers
each issued layout stateid with the data server via
TRUST_STATEID together with the
ffv2m_client_id assigned to the writer, and the data
server validates subsequent CHUNK operation stateids against
the trust table and the presented cwa_client_id
against the trust-table's tsa_client_id.  Loose coupling
applies only to PASSTHROUGH mirrors, which use regular
READ/WRITE authorized by the synthetic uid/gid the layout
carries (see <xref target="sec-Fencing-Clients"/>).</t>
            </dd>
          </dl>
          <t>Because the layout stateid does authorization but does not
identify a per-open or per-lock owner, a single client may
present the same layout stateid on many CHUNK operations
across many parallel writers within the client, without any
of the open-owner ordering constraints <xref section="8.2.2" sectionFormat="of" target="RFC8881"/>
imposes on regular NFSv4 stateids.  Chunk-level write ordering and
contention are resolved by the per-chunk chunk_guard4 CAS
(<xref target="sec-chunk_guard4"/>) and the chunk-range CHUNK_LOCK, not by
stateid-owner sequencing.</t>
        </section>
        <section anchor="getattr-on-a-data-file">
          <name>GETATTR on a Data File</name>
          <t>GETATTR <bcp14>MAY</bcp14> be issued by a client against a data file.  The
primary use case is repair: a repair actor selected by
CB_CHUNK_REPAIR may need to query the
per-server file size or allocation state when reconstructing a
payload, and the proxy server described informally in
<xref target="sec-system-model-roles"/> similarly benefits from attribute
queries on surviving mirrors.  Diagnostic use is also permitted.</t>
          <t>Clients <bcp14>MUST NOT</bcp14> treat GETATTR values returned by a data server as
authoritative for any file attribute (size, timestamps, owner,
mode, ACL, and so on).  The metadata server is the sole authority
for file attributes.  Values returned by a data server reflect the
per-server data file instance only and <bcp14>MAY</bcp14> diverge from the
metadata server's view, particularly during a write layout's
lifetime or during a proxy server transition.  A client that uses a
data-server GETATTR result to determine the file's visible size
will observe inconsistencies.</t>
        </section>
        <section anchor="sec-setattr-on-data-file">
          <name>SETATTR on a Data File</name>
          <t>Clients <bcp14>MUST NOT</bcp14> issue SETATTR against a data file.  A data server
that has identified the file as a chunked data file (see
<xref target="sec-data-file-identification"/>) <bcp14>MUST</bcp14> reject a client SETATTR
with NFS4ERR_NOTSUPP.</t>
          <t>Attribute changes on data files <bcp14>MUST</bcp14> be reconciled with the
metadata server's view and cannot be applied unilaterally by a
client.  A client that wants to truncate, change the mode, change
ownership, or otherwise modify attributes on a file <bcp14>MUST</bcp14> issue
SETATTR to the metadata server for the file's metadata server handle; the
metadata server fans the change out to the data files as a
control-plane operation.</t>
          <t>This rule explicitly covers truncate (SETATTR with size in the
bitmap): a client <bcp14>MUST NOT</bcp14> truncate a data file directly.  See
<xref target="sec-mds-truncate-ec"/> for how the metadata server handles
truncate on chunked files.  Similarly, a client <bcp14>MUST NOT</bcp14>
issue DEALLOCATE against a data file; see the next subsection.</t>
        </section>
        <section anchor="sec-mds-truncate-ec">
          <name>Metadata-Server-Driven Truncate on Chunked Files</name>
          <t>A client that wants to truncate a chunked file <bcp14>MUST</bcp14>
issue SETATTR(FATTR4_SIZE) to the metadata-server filehandle
(see <xref target="sec-setattr-on-data-file"/>).  The metadata server
translates the logical truncate into per-shard size changes
across the data servers in each mirror.  For
FFV2_ENCODING_REPLICATED, per-shard size equals the logical
truncate size; for erasure-coded encodings the per-shard sizes
are derived from the geometry parameters below.</t>
          <dl>
            <dt>Stripe-aligned truncate:</dt>
            <dd>
              <t>When the new size lies on a stripe boundary (including
zero), no chunk re-encoding is required.  The metadata
server computes per-shard sizes from the encoding geometry it
issued in the layout (k, m, and the projection parameters
for Mojette; see <xref target="sec-mojette-encoding"/>) and issues
per-data-server SETATTR(FATTR4_SIZE) with the computed
per-shard size.  Geometry parameters are sufficient
arithmetic; no encoding implementation is required at the
metadata server.</t>
            </dd>
            <dt>Non-stripe-aligned truncate:</dt>
            <dd>
              <t>When the new size falls within a stripe, the data shards
covering the partial stripe must be truncated and the
parity shards re-encoded from the truncated data.  Because
re-encoding requires running the erasure transform, the
metadata server <bcp14>MUST</bcp14> delegate this case to an encoding-aware
actor: either a proxy server for proxy-mediated truncate, or
an encoding-aware client selected per <xref target="sec-repair-selection"/>
via CB_CHUNK_REPAIR with the
affected partial-stripe chunks as the repair target.  If
neither path is available, the metadata server <bcp14>MUST</bcp14> return
NFS4ERR_NOTSUPP to the originating SETATTR.</t>
            </dd>
          </dl>
          <t>The metadata server knows encoding geometry from the layout but
is not required to include an encoding implementation.  The
delegation rule above accommodates a metadata server that has
geometry knowledge only.</t>
        </section>
        <section anchor="passthrough-data-files-ffv2encodingpassthrough">
          <name>PASSTHROUGH Data Files (FFV2_ENCODING_PASSTHROUGH)</name>
          <t>For a mirror whose ffv2m_encoding_type_data is
FFV2_ENCODING_PASSTHROUGH (see <xref target="sec-encoding-passthrough"/>),
client operations on the data file follow the same pattern as
the File Layout Type in <xref section="13.6" sectionFormat="of" target="RFC8881"/> and the
Flexible File Version 1 Layout Type in <xref target="RFC8435"/>:</t>
          <t>Required:</t>
          <ul spacing="normal">
            <li>
              <t>READ (<xref section="18.22" sectionFormat="of" target="RFC8881"/>).</t>
            </li>
            <li>
              <t>WRITE (<xref section="18.32" sectionFormat="of" target="RFC8881"/>).</t>
            </li>
            <li>
              <t>COMMIT (<xref section="18.3" sectionFormat="of" target="RFC8881"/>).</t>
            </li>
          </ul>
          <t>Optional (the client <bcp14>MAY</bcp14> send, and the data server <bcp14>MAY</bcp14> support):</t>
          <ul spacing="normal">
            <li>
              <t>READ_PLUS (<xref section="15.10" sectionFormat="of" target="RFC7862"/>): hole-aware reads.</t>
            </li>
            <li>
              <t>SEEK (<xref section="15.11" sectionFormat="of" target="RFC7862"/>): hole and data detection.</t>
            </li>
            <li>
              <t>ALLOCATE (<xref section="15.1" sectionFormat="of" target="RFC7862"/>): space reservation hint.</t>
            </li>
          </ul>
          <t>The client <bcp14>MUST NOT</bcp14> send:</t>
          <ul spacing="normal">
            <li>
              <t>DEALLOCATE (<xref section="15.4" sectionFormat="of" target="RFC7862"/>): hole punching is a
metadata-server responsibility; the client issues DEALLOCATE
on the metadata-server filehandle, and the metadata server
fans out to the data servers as a control-plane operation.</t>
            </li>
          </ul>
        </section>
        <section anchor="chunked-data-files">
          <name>Chunked Data Files</name>
          <t>For a mirror whose ffv2m_encoding_type_data is any of the chunked
encoding types defined in this document -- i.e., every
FFV2<em>ENCODING</em>* value except FFV2_ENCODING_PASSTHROUGH (see
<xref target="sec-encoding-passthrough"/>) -- client operations use the
CHUNK operations rather than READ / WRITE / COMMIT.  This
includes FFV2_ENCODING_REPLICATED, whose per-shard payload is
the input bytes verbatim but is dispatched via the CHUNK
operations to carry the per-chunk checksum and guard
(<xref target="tbl-ops-allowed"/> legend).</t>
          <t>Required for all chunked clients:</t>
          <ul spacing="normal">
            <li>
              <t>CHUNK_WRITE.</t>
            </li>
            <li>
              <t>CHUNK_READ.</t>
            </li>
            <li>
              <t>CHUNK_FINALIZE.</t>
            </li>
            <li>
              <t>CHUNK_COMMIT.</t>
            </li>
            <li>
              <t>CHUNK_HEADER_READ.</t>
            </li>
            <li>
              <t>CHUNK_LOCK and CHUNK_UNLOCK.</t>
            </li>
            <li>
              <t>CHUNK_ROLLBACK.</t>
            </li>
          </ul>
          <t>Required for clients that participate in repair:</t>
          <ul spacing="normal">
            <li>
              <t>CHUNK_ERROR.</t>
            </li>
            <li>
              <t>CHUNK_REPAIRED.</t>
            </li>
            <li>
              <t>CHUNK_WRITE_REPAIR.</t>
            </li>
          </ul>
          <t>Clients <bcp14>MUST NOT</bcp14> send:</t>
          <ul spacing="normal">
            <li>
              <t>READ, WRITE, COMMIT against a chunked data file.  A
data server <bcp14>MUST</bcp14> reject these with NFS4ERR_NOTSUPP and <bcp14>MAY</bcp14>
log the client for operator attention; this case is almost
always a client bug in which the client did not inspect the
mirror's ffv2m_encoding_type_data before issuing I/O.</t>
            </li>
            <li>
              <t>READ_PLUS, SEEK, ALLOCATE, DEALLOCATE against a chunked
data file.  Chunk-level allocation is a metadata-server
responsibility.</t>
            </li>
            <li>
              <t>SETATTR against a chunked data file (the general
prohibition in <xref target="sec-setattr-on-data-file"/> applies to all
data files; truncate in particular is handled by the
metadata server per <xref target="sec-mds-truncate-ec"/>).</t>
            </li>
          </ul>
        </section>
        <section anchor="operations-that-must-not-be-sent-to-a-data-file">
          <name>Operations That MUST NOT Be Sent to a Data File</name>
          <t>Clients <bcp14>MUST NOT</bcp14> send the following operations to a data server
on a data file, regardless of protection mode.  A data server
that has identified the file as a chunked data file (see
<xref target="sec-data-file-identification"/>) <bcp14>MUST</bcp14> return NFS4ERR_NOTSUPP:</t>
          <ul spacing="normal">
            <li>
              <t>OPEN, CLOSE, OPEN_DOWNGRADE, OPEN_CONFIRM (<xref target="RFC8881"/>
Sections 18.16, 18.2, 18.18, 18.20).  Opens occur on the
metadata server; the stateid obtained there is used on the
data path.</t>
            </li>
            <li>
              <t>LOCK, LOCKU, LOCKT, RELEASE_LOCKOWNER (<xref target="RFC8881"/> Sections
18.10, 18.11, 18.13, 18.24).  Byte-range locks on data files
are not supported; chunked files use CHUNK_LOCK, and
PASSTHROUGH files rely on metadata-server coordination.</t>
            </li>
            <li>
              <t>DELEGPURGE, DELEGRETURN, WANT_DELEGATION (<xref target="RFC8881"/> Sections
18.5, 18.6 and <xref section="15.3" sectionFormat="of" target="RFC7862"/>).  Delegations are
issued by the metadata server.</t>
            </li>
            <li>
              <t>Any operation whose purpose is to manipulate the file's
namespace: RENAME, LINK, SYMLINK, CREATE (at the client's
file-creation use, not the metadata server's own
allocation of data files on the data server described
above), REMOVE.  Namespace
operations belong on the metadata server.</t>
            </li>
            <li>
              <t>Any ACL-scoped SETATTR or GETATTR bit (FATTR4_ACL,
FATTR4_DACL, FATTR4_SACL).  Access control on data files is
delegated to the metadata server.</t>
            </li>
            <li>
              <t>CLONE, COPY, COPY_NOTIFY, OFFLOAD_CANCEL, OFFLOAD_STATUS
(<xref target="RFC7862"/> Sections 15.13, 15.2, 15.3, 15.8, 15.9).
File-level data migration is a metadata-server responsibility.</t>
            </li>
            <li>
              <t>LAYOUTGET, LAYOUTCOMMIT, LAYOUTRETURN, LAYOUTSTATS,
LAYOUTERROR, GETDEVICEINFO, GETDEVICELIST (<xref target="RFC8881"/>
Sections 18.43, 18.42, 18.44, <xref target="RFC7862"/> Sections 15.7,
15.6, <xref target="RFC8881"/> Sections 18.40, 18.41).  Layout operations
belong on the metadata server.</t>
            </li>
            <li>
              <t>TRUST_STATEID, REVOKE_STATEID, BULK_REVOKE_STATEID
(<xref target="sec-TRUST_STATEID"/>, <xref target="sec-REVOKE_STATEID"/>,
<xref target="sec-BULK_REVOKE_STATEID"/>).  These are metadata-server-to-data-server
control-plane operations; a data server rejects them with
NFS4ERR_PERM when received on a client session (see
<xref target="sec-tight-coupling-control-session"/>).</t>
            </li>
            <li>
              <t>NFSv4 READ, WRITE, and COMMIT (<xref target="RFC8881"/> Sections 18.22,
18.32, 18.3).  Chunked data files use CHUNK_READ,
CHUNK_WRITE, and CHUNK_COMMIT respectively; NFSv4
byte-range READ / WRITE / COMMIT bypasses the chunk
envelope (chunk_guard4 CAS, per-chunk checksum, lifecycle
state) that this document's consistency guarantees depend
on.  A data server that has identified the file as a
chunked data file <bcp14>MUST</bcp14> reject NFSv4 READ / WRITE / COMMIT
with NFS4ERR_NOTSUPP.  PASSTHROUGH data files
(<xref target="sec-encoding-passthrough"/>) are non-chunked and continue
to use NFSv4 READ / WRITE / COMMIT normally; their
fattr4_chunked_data_file is FALSE
(<xref target="sec-fattr4_chunked_data_file"/>).</t>
            </li>
          </ul>
        </section>
        <section anchor="chunk-operations-on-non-chunked-data-files">
          <name>CHUNK Operations on Non-Chunked Data Files</name>
          <t>The reciprocal rule: clients <bcp14>MUST NOT</bcp14> send CHUNK operations
(CHUNK_READ, CHUNK_WRITE, CHUNK_FINALIZE, CHUNK_COMMIT,
CHUNK_ROLLBACK, CHUNK_HEADER_READ, CHUNK_LOCK, CHUNK_UNLOCK,
CHUNK_ERROR, CHUNK_REPAIRED, CHUNK_WRITE_REPAIR) to a data
server on a file that is not a chunked data file.  Non-chunked
data files (PASSTHROUGH mirrors, and any file the metadata
server has not marked as chunked) do not carry a chunk envelope
and cannot honor CHUNK operation semantics.  A data server that
has identified the file as non-chunked (fattr4_chunked_data_file
= FALSE) <bcp14>MUST</bcp14> reject CHUNK operations against that file with
NFS4ERR_NOTSUPP.  A data server that cannot identify the file
under any of the paths in <xref target="sec-data-file-identification"/>
relies on the client-side "<bcp14>MUST NOT</bcp14>" as the primary defense; a
client with an active layout will not present a chunked-layout
stateid against a non-chunked file, so standard stateid
validation (<xref section="8.2" sectionFormat="of" target="RFC8881"/>) catches the misdirected
CHUNK operation with NFS4ERR_BAD_STATEID before the chunk-layer
rules apply.</t>
        </section>
      </section>
      <section anchor="callback-path-data-server-to-client">
        <name>Callback Path: Data Server to Client</name>
        <t>A data server does not call back directly to pNFS clients.
Recall notifications and repair coordination flow through the
metadata server's backchannel session with the client.  The
callbacks a client will observe that affect its data files are:</t>
        <ul spacing="normal">
          <li>
            <t>CB_LAYOUTRECALL (<xref section="20.3" sectionFormat="of" target="RFC8881"/>).</t>
          </li>
          <li>
            <t>CB_NOTIFY_DEVICEID (<xref section="20.12" sectionFormat="of" target="RFC8881"/>).</t>
          </li>
          <li>
            <t>CB_RECALL_ANY (<xref section="20.6" sectionFormat="of" target="RFC8881"/>).</t>
          </li>
          <li>
            <t>CB_CHUNK_REPAIR.</t>
          </li>
        </ul>
        <t>A data server influences these callbacks only indirectly, via
LAYOUTERROR reports the client issues to the metadata server or
by returning error codes that prompt the client to report.  A
data server <bcp14>MUST NOT</bcp14> attempt to send CB_* operations to clients
directly.</t>
      </section>
      <section anchor="summary-table">
        <name>Summary Table</name>
        <t>The classification below adapts the operation taxonomy of
<xref section="17" sectionFormat="of" target="RFC8881"/> (<bcp14>REQUIRED</bcp14> / <bcp14>RECOMMENDED</bcp14> / <bcp14>OPTIONAL</bcp14> /
<bcp14>MUST NOT</bcp14> IMPLEMENT) to the two-direction per-operation view a
Flexible File Version 2 data server requires.  Two of the four
labels in the table below match <xref target="RFC8881"/> usage; the other
two are extensions specific to this document.</t>
        <dl>
          <dt><bcp14>REQUIRED</bcp14>:</dt>
          <dd>
            <t>The data server <bcp14>MUST</bcp14> support the operation on this path.
Matches <xref section="17" sectionFormat="of" target="RFC8881"/> REQ.</t>
          </dd>
          <dt><bcp14>OPTIONAL</bcp14>:</dt>
          <dd>
            <t>The data server <bcp14>MAY</bcp14> support the operation; if it does, the
actor in this column <bcp14>MUST</bcp14> tolerate the absence of support.
Matches <xref section="17" sectionFormat="of" target="RFC8881"/> OPT.</t>
          </dd>
          <dt><bcp14>MUST NOT</bcp14>:</dt>
          <dd>
            <t>The actor in this column <bcp14>MUST NOT</bcp14> send the operation, and
the data server <bcp14>MUST</bcp14> reject it with NFS4ERR_NOTSUPP.  This
per-direction prohibition extends <xref section="17" sectionFormat="of" target="RFC8881"/>'s
single-axis <bcp14>MUST NOT</bcp14> IMPLEMENT classification: an operation
may be forbidden on one path (client to data server) while
required on another (metadata server to data server).
SETATTR is the canonical example.</t>
          </dd>
          <dt><bcp14>MAY</bcp14>:</dt>
          <dd>
            <t>The metadata server <bcp14>MAY</bcp14> use the operation as an
implementation-defined control-plane action.  Not in
<xref section="17" sectionFormat="of" target="RFC8881"/>; specific to the metadata-server-to-data-server
path in this document.</t>
          </dd>
        </dl>
        <table anchor="tbl-ops-allowed">
          <name>NFSv4.2 operations allowed on data files</name>
          <thead>
            <tr>
              <th align="left">Operation</th>
              <th align="left">Client -&gt; data server</th>
              <th align="left">metadata server -&gt; data server</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">SEQUENCE, PUTFH, GETFH, PUTROOTFH</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
            </tr>
            <tr>
              <td align="left">EXCHANGE_ID, CREATE_SESSION, DESTROY_SESSION, BIND_CONN_TO_SESSION, DESTROY_CLIENTID</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
            </tr>
            <tr>
              <td align="left">RECLAIM_COMPLETE</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
            </tr>
            <tr>
              <td align="left">SECINFO, SECINFO_NO_NAME</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
              <td align="left">
                <bcp14>MAY</bcp14></td>
            </tr>
            <tr>
              <td align="left">GETATTR</td>
              <td align="left">
                <bcp14>OPTIONAL</bcp14> (non-authoritative)</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
            </tr>
            <tr>
              <td align="left">SETATTR</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
            </tr>
            <tr>
              <td align="left">LOOKUP, CREATE, REMOVE</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
            </tr>
            <tr>
              <td align="left">READ, WRITE, COMMIT</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14> (PASSTHROUGH); <bcp14>MUST NOT</bcp14> (chunked)</td>
              <td align="left">
                <bcp14>MAY</bcp14></td>
            </tr>
            <tr>
              <td align="left">READ_PLUS, SEEK, ALLOCATE</td>
              <td align="left">
                <bcp14>OPTIONAL</bcp14> (PASSTHROUGH); <bcp14>MUST NOT</bcp14> (chunked)</td>
              <td align="left">
                <bcp14>MAY</bcp14></td>
            </tr>
            <tr>
              <td align="left">DEALLOCATE</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>MAY</bcp14></td>
            </tr>
            <tr>
              <td align="left">CHUNK_WRITE, CHUNK_READ, CHUNK_FINALIZE, CHUNK_COMMIT, CHUNK_HEADER_READ, CHUNK_LOCK, CHUNK_UNLOCK, CHUNK_ROLLBACK</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14> (chunked); <bcp14>MUST NOT</bcp14> (PASSTHROUGH)</td>
              <td align="left">not used</td>
            </tr>
            <tr>
              <td align="left">CHUNK_ERROR, CHUNK_REPAIRED, CHUNK_WRITE_REPAIR</td>
              <td align="left">
                <bcp14>REQUIRED</bcp14> (chunked repair actors); <bcp14>MUST NOT</bcp14> (PASSTHROUGH)</td>
              <td align="left">not used</td>
            </tr>
            <tr>
              <td align="left">OPEN, CLOSE, OPEN_DOWNGRADE, OPEN_CONFIRM</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>OPTIONAL</bcp14> (proxy I/O)</td>
            </tr>
            <tr>
              <td align="left">LOCK, LOCKU, LOCKT, RELEASE_LOCKOWNER</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
            </tr>
            <tr>
              <td align="left">DELEGPURGE, DELEGRETURN, WANT_DELEGATION</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
            </tr>
            <tr>
              <td align="left">RENAME, LINK, SYMLINK</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
            </tr>
            <tr>
              <td align="left">CLONE, COPY, COPY_NOTIFY, OFFLOAD_CANCEL, OFFLOAD_STATUS</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>MAY</bcp14> (data migration)</td>
            </tr>
            <tr>
              <td align="left">LAYOUTGET, LAYOUTCOMMIT, LAYOUTRETURN, LAYOUTSTATS, LAYOUTERROR, GETDEVICEINFO, GETDEVICELIST</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
            </tr>
            <tr>
              <td align="left">ACL-scoped GETATTR/SETATTR bits</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>MAY</bcp14></td>
            </tr>
            <tr>
              <td align="left">TRUST_STATEID, REVOKE_STATEID, BULK_REVOKE_STATEID</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>REQUIRED</bcp14> (tight coupling)</td>
            </tr>
            <tr>
              <td align="left">CHUNK_ESCROW_INSTALL, CHUNK_ESCROW_RELEASE, CHUNK_ESCROW_ENUMERATE, CHUNK_ESCROW_TAKEOVER</td>
              <td align="left">
                <bcp14>MUST NOT</bcp14></td>
              <td align="left">
                <bcp14>REQUIRED</bcp14></td>
            </tr>
          </tbody>
        </table>
        <t>The (PASSTHROUGH) and (chunked) qualifiers in the client-to-data-server
column select by the mirror's ffv2m_encoding_type_data value.
FFV2<em>ENCODING_PASSTHROUGH (<xref target="sec-encoding-passthrough"/>) uses
NFSv3 WRITE / READ or NFSv4 READ / WRITE directly and does not
use the CHUNK operations.  Every other standards-track encoding
(any FFV2_ENCODING</em>* value other than FFV2_ENCODING_PASSTHROUGH;
see <xref target="tbl-coding-types"/>) is (chunked): it uses CHUNK_WRITE and CHUNK_READ and
<bcp14>MUST NOT</bcp14> use the RFC 8881 READ / WRITE / COMMIT operations
against the data server.  FFV2_ENCODING_REPLICATED replicates
the payload verbatim across N shards but dispatches via the
CHUNK operations so each shard carries the per-chunk checksum
this version of the layout type relies on for end-to-end
integrity (<xref target="sec-encoding-replicated"/>).</t>
      </section>
    </section>
    <section anchor="sec-layouthint">
      <name>Flexible File Version 2 Layout Type Return</name>
      <t>layoutreturn_file4 is used in the LAYOUTRETURN operation to convey
layout type specific information to the server.  It is defined in
<xref section="18.44.1" sectionFormat="of" target="RFC8881"/> (also shown in <xref target="fig-LAYOUTRETURN"/>).</t>
      <figure anchor="fig-LAYOUTRETURN">
        <name>Layout Return XDR</name>
        <sourcecode type="xdr"><![CDATA[
      /* Constants used for LAYOUTRETURN and CB_LAYOUTRECALL */
      const LAYOUT4_RET_REC_FILE      = 1;
      const LAYOUT4_RET_REC_FSID      = 2;
      const LAYOUT4_RET_REC_ALL       = 3;

      enum layoutreturn_type4 {
              LAYOUTRETURN4_FILE = LAYOUT4_RET_REC_FILE,
              LAYOUTRETURN4_FSID = LAYOUT4_RET_REC_FSID,
              LAYOUTRETURN4_ALL  = LAYOUT4_RET_REC_ALL
      };

   struct layoutreturn_file4 {
           offset4         lrf_offset;
           length4         lrf_length;
           stateid4        lrf_stateid;
           /* layouttype4 specific data */
           opaque          lrf_body<>;
   };

   union layoutreturn4 switch(layoutreturn_type4 lr_returntype) {
           case LAYOUTRETURN4_FILE:
                   layoutreturn_file4      lr_layout;
           default:
                   void;
   };

   struct LAYOUTRETURN4args {
           /* CURRENT_FH: file */
           bool                    lora_reclaim;
           layouttype4             lora_layout_type;
           layoutiomode4           lora_iomode;
           layoutreturn4           lora_layoutreturn;
   };
]]></sourcecode>
      </figure>
      <t>If the lora_layout_type layout type is LAYOUT4_FLEX_FILES_V2 and the
lr_returntype is LAYOUTRETURN4_FILE, then the lrf_body opaque value
is defined by ffv2_layoutreturn4 (see <xref target="sec-ffv2_layoutreturn4"/>).  This
allows the client to report I/O error information or layout usage
statistics back to the metadata server as defined below.  Note that
while the data structures are built on concepts introduced in
NFSv4.2, the effective discriminated union (lora_layout_type combined
with ffv2_layoutreturn4) allows for an NFSv4.1 metadata server to
utilize the data.</t>
      <section anchor="sec-io-error">
        <name>I/O Error Reporting</name>
        <section anchor="sec-ffv2_ioerr4">
          <name>ffv2_ioerr4</name>
          <figure anchor="fig-ffv2_ioerr4">
            <name>ffv2_ioerr4</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct ffv2_ioerr4 {
   ///         offset4        ffv2ie_offset;
   ///         length4        ffv2ie_length;
   ///         stateid4       ffv2ie_stateid;
   ///         device_error4  ffv2ie_errors<>;
   /// };
   ///
]]></sourcecode>
          </figure>
          <t>Recall that <xref target="RFC7862"/> defines device_error4 as in <xref target="fig-device_error4"/>:</t>
          <figure anchor="fig-device_error4">
            <name>device_error4</name>
            <sourcecode type="xdr"><![CDATA[
   struct device_error4 {
           deviceid4       de_deviceid;
           nfsstat4        de_status;
           nfs_opnum4      de_opnum;
   };
]]></sourcecode>
          </figure>
          <t>The ffv2_ioerr4 structure is used to return error indications for
data files that generated errors during data transfers.  These are
hints to the metadata server that there are problems with that file.
For each error, ffv2ie_errors.de_deviceid, ffv2ie_offset, and ffv2ie_length
represent the storage device and byte range within the file in which
the error occurred; ffv2ie_errors represents the operation and type
of error.  The use of device_error4 is described in <xref section="15.6" sectionFormat="of" target="RFC7862"/>.</t>
          <t>Even though the storage device might be accessed via NFSv3 and
reports back NFSv3 errors to the client, the client is responsible
for mapping these to appropriate NFSv4 status codes as de_status.
Likewise, the NFSv3 operations need to be mapped to equivalent NFSv4
operations.</t>
        </section>
      </section>
      <section anchor="sec-layout-stats">
        <name>Layout Usage Statistics</name>
        <section anchor="ffiolatency4">
          <name>ff_io_latency4</name>
          <figure anchor="fig-ff_io_latency4">
            <name>ff_io_latency4</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct ffv2_io_latency4 {
   ///         uint64_t       ffv2il_ops_requested;
   ///         uint64_t       ffv2il_bytes_requested;
   ///         uint64_t       ffv2il_ops_completed;
   ///         uint64_t       ffv2il_bytes_completed;
   ///         uint64_t       ffv2il_bytes_not_delivered;
   ///         nfstime4       ffv2il_total_busy_time;
   ///         nfstime4       ffv2il_aggregate_completion_time;
   /// };
   ///
]]></sourcecode>
          </figure>
          <t>Both operation counts and bytes transferred are kept in the
ff_io_latency4 (see <xref target="fig-ff_io_latency4"/>).  As seen in ff_layoutupdate4
(see <xref target="sec-ff_layoutupdate4"/>), READ and WRITE operations are
aggregated separately.  READ operations are used for the ff_io_latency4
ffv2lu_read.  Both WRITE and COMMIT operations are used for the
ff_io_latency4 ffv2lu_write.  "Requested" counters track what the
client is attempting to do, and "completed" counters track what was
done.  There is no requirement that the client only report completed
results that have matching requested results from the reported
period.</t>
          <t>ffv2il_bytes_not_delivered is used to track the aggregate number of
bytes requested but not fulfilled due to error conditions.
ffv2il_total_busy_time is the aggregate time spent with outstanding
RPC calls. ffv2il_aggregate_completion_time is the sum of all round-trip
times for completed RPC calls.</t>
          <t>In <xref section="3.3.1" sectionFormat="of" target="RFC8881"/>, the nfstime4 is defined as the
number of seconds and nanoseconds since midnight or zero hour January
1, 1970 Coordinated Universal Time (UTC).  The use of nfstime4 in
ff_io_latency4 is to store time since the start of the first I/O
from the client after receiving the layout.  In other words, these
are to be decoded as duration and not as a date and time.</t>
          <t>Note that LAYOUTSTATS are cumulative, i.e., not reset each time the
operation is sent.  If two LAYOUTSTATS operations for the same file
and layout stateid originate from the same NFS client and are
processed at the same time by the metadata server, then the one
containing the larger values contains the most recent time series
data.</t>
        </section>
        <section anchor="sec-ff_layoutupdate4">
          <name>ff_layoutupdate4</name>
          <figure anchor="fig-ff_layoutupdate4">
            <name>ff_layoutupdate4</name>
            <sourcecode type="xdr"><![CDATA[
   /// const FFV2_LAYOUTSTATS_FLAGS_LOCAL  = 0x00000001;
   ///
   /// typedef uint32_t   ffv2_layoutstats_flags4;
   ///
   /// struct ffv2_layoutupdate4 {
   ///         netaddr4                ffv2lu_addr;
   ///         nfs_fh4                 ffv2lu_fhandle;
   ///         ffv2_io_latency4        ffv2lu_read;
   ///         ffv2_io_latency4        ffv2lu_write;
   ///         nfstime4                ffv2lu_duration;
   ///         ffv2_layoutstats_flags4 ffv2lu_flags;
   /// };
   ///
]]></sourcecode>
          </figure>
          <t>ffv2lu_addr differentiates which network address the client is connected
to on the storage device.  In the case of multipathing, ffv2lu_fhandle
indicates which read-only copy was selected. ffv2lu_read and ffv2lu_write
convey the latencies for both READ and WRITE operations, respectively.
ffv2lu_duration is used to indicate the time period over which the
statistics were collected.  ffv2lu_flags is a 32-bit bitmask
reporting per-report properties; when FFV2_LAYOUTSTATS_FLAGS_LOCAL
is set, the I/O was serviced by the client's cache.  This flag
allows the client to inform the metadata server about "hot" access
to a file it would not normally be allowed to report on.
Unassigned bits are reserved for future revisions; receivers <bcp14>MUST</bcp14>
ignore bits they do not recognize.</t>
        </section>
        <section anchor="ffiostats4">
          <name>ff_iostats4</name>
          <figure anchor="fig-ff_iostats4">
            <name>ff_iostats4</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct ffv2_iostats4 {
   ///         offset4            ffv2is_offset;
   ///         length4            ffv2is_length;
   ///         stateid4           ffv2is_stateid;
   ///         io_info4           ffv2is_read;
   ///         io_info4           ffv2is_write;
   ///         deviceid4          ffv2is_deviceid;
   ///         ffv2_layoutupdate4 ffv2is_layoutupdate;
   /// };
   ///
]]></sourcecode>
          </figure>
          <t><xref target="RFC7862"/> defines io_info4 as in <xref target="fig-ff_iostats4"/>.</t>
          <figure anchor="fig-io_info4">
            <name>io_info4</name>
            <sourcecode type="xdr"><![CDATA[
   struct io_info4 {
           uint64_t        ii_count;
           uint64_t        ii_bytes;
   };
]]></sourcecode>
          </figure>
          <t>With pNFS, data transfers are performed directly between the pNFS
client and the storage devices.  Therefore, the metadata server has
no direct knowledge of the I/O operations being done and thus cannot
create on its own statistical information about client I/O to
optimize the data storage location.  ff_iostats4 <bcp14>MAY</bcp14> be used by the
client to report I/O statistics back to the metadata server upon
returning the layout.</t>
          <t>Since it is not feasible for the client to report every I/O that
used the layout, the client <bcp14>MAY</bcp14> identify "hot" byte ranges for which
to report I/O statistics.  The definition and/or configuration
mechanism of what is considered "hot" and the size of the reported
byte range are out of the scope of this document.  For client
implementations, providing reasonable default values and an
optional run-time management interface to control these
parameters is suggested.  For example, a client can define the default byte range
resolution to be 1 MB in size and the thresholds for reporting to
be 1 MB/second or 10 I/O operations per second.</t>
          <t>For each byte range, ffv2is_offset and ffv2is_length represent the
starting offset of the range and the range length in bytes.
ffv2is_read.ii_count, ffv2is_read.ii_bytes, ffv2is_write.ii_count, and
ffv2is_write.ii_bytes represent the number of contiguous READ and
WRITE I/Os and the respective aggregate number of bytes transferred
within the reported byte range.</t>
          <t>The combination of ffv2is_deviceid and ffv2lu_addr uniquely identifies
both the storage path and the network route to it.  Finally,
ffv2lu_fhandle allows the metadata server to differentiate between
multiple read-only copies of the file on the same storage device.</t>
        </section>
      </section>
      <section anchor="sec-ffv2_layoutreturn4">
        <name>ffv2_layoutreturn4</name>
        <figure anchor="fig-ffv2_layoutreturn4">
          <name>ffv2_layoutreturn4</name>
          <sourcecode type="xdr"><![CDATA[
   /// struct ffv2_layoutreturn4 {
   ///         ffv2_ioerr4     ffv2lr_ioerr_report<>;
   ///         ffv2_iostats4   ffv2lr_iostats_report<>;
   /// };
   ///
]]></sourcecode>
        </figure>
        <t>When data file I/O operations fail, ffv2lr_ioerr_report&lt;&gt; is used to
report these errors to the metadata server as an array of elements
of type ffv2_ioerr4.  Each element in the array represents an error
that occurred on the data file identified by ffv2ie_errors.de_deviceid.
If no errors are to be reported, the size of the ffv2lr_ioerr_report&lt;&gt;
array is set to zero.  The client <bcp14>MAY</bcp14> also use ffv2lr_iostats_report&lt;&gt;
to report a list of I/O statistics as an array of elements of type
ff_iostats4.  Each element in the array represents statistics for
a particular byte range.  Byte ranges are not guaranteed to be
disjoint and <bcp14>MAY</bcp14> repeat or intersect.</t>
      </section>
    </section>
    <section anchor="sec-LAYOUTERROR">
      <name>Flexible File Version 2 Layout Type LAYOUTERROR</name>
      <t>If the client is using NFSv4.2 to communicate with the metadata
server, then instead of waiting for a LAYOUTRETURN to send error
information to the metadata server (see <xref target="sec-io-error"/>), it <bcp14>MAY</bcp14>
use LAYOUTERROR (see <xref section="15.6" sectionFormat="of" target="RFC7862"/>) to communicate
that information.  For the flexible file v2 layout, this means
that LAYOUTERROR4args is treated the same as ffv2_ioerr4.</t>
    </section>
    <section anchor="flexible-file-version-2-layout-type-layoutstats">
      <name>Flexible File Version 2 Layout Type LAYOUTSTATS</name>
      <t>If the client is using NFSv4.2 to communicate with the metadata
server, then instead of waiting for a LAYOUTRETURN to send I/O
statistics to the metadata server (see <xref target="sec-layout-stats"/>), it
<bcp14>MAY</bcp14> use LAYOUTSTATS (see <xref section="15.7" sectionFormat="of" target="RFC7862"/>) to communicate
that information.  For the flexible file v2 layout, this means
that LAYOUTSTATS4args.lsa_layoutupdate is overloaded with the same
contents as in ffv2is_layoutupdate.</t>
    </section>
    <section anchor="flexible-file-version-2-layout-type-creation-hint">
      <name>Flexible File Version 2 Layout Type Creation Hint</name>
      <t>The layouthint4 type is defined in the <xref target="RFC8881"/> as in
<xref target="fig-layouthint4-v1"/>.</t>
      <figure anchor="fig-layouthint4-v1">
        <name>layouthint4 v1</name>
        <sourcecode type="xdr"><![CDATA[
   struct layouthint4 {
       layouttype4        loh_type;
       opaque             loh_body<>;
   };
]]></sourcecode>
      </figure>
      <t>The layouthint4 structure is used by the client to pass a hint about
the type of layout it would like created for a particular file.  If
the loh_type layout type is LAYOUT4_FLEX_FILES, then the loh_body
opaque value is defined by the ff_layouthint4 type (v1
compatibility).  If the loh_type layout type is
LAYOUT4_FLEX_FILES_V2, then the loh_body opaque value is defined
by the ffv2_layouthint4 type (see <xref target="sec-ffv2-layouthint"/>).</t>
    </section>
    <section anchor="fflayouthint4">
      <name>ff_layouthint4</name>
      <figure anchor="fig-ff_layouthint4-v2">
        <name>ff_layouthint4 (v1 compatibility)</name>
        <sourcecode type="xdr"><![CDATA[
   union ff_mirrors_hint switch (bool ffmc_valid) {
       case TRUE:
           uint32_t    ffmc_mirrors;
       case FALSE:
           void;
   };

   struct ff_layouthint4 {
       ff_mirrors_hint    fflh_mirrors_hint;
   };
]]></sourcecode>
      </figure>
      <t>The ff_layouthint4 is retained for backwards compatibility with
flexible file v1 layouts.  For flexible file v2 layouts, clients
<bcp14>SHOULD</bcp14> use ffv2_layouthint4 (<xref target="fig-ffv2_layouthint4"/>) instead,
which provides encoding type selection and data protection geometry
hints via ffv2_data_protection4 (<xref target="fig-ffv2_data_protection4"/>).</t>
    </section>
    <section anchor="recalling-a-layout">
      <name>Recalling a Layout</name>
      <t>While <xref section="12.5.5" sectionFormat="of" target="RFC8881"/> discusses reasons independent
of layout type for recalling a layout, the flexible file v2 layout
type metadata server should recall outstanding layouts in the
following cases:</t>
      <ul spacing="normal">
        <li>
          <t>When the file's security policy changes, i.e., ACLs or permission
mode bits are set.</t>
        </li>
        <li>
          <t>When the file's layout changes, rendering outstanding layouts
invalid.</t>
        </li>
        <li>
          <t>When existing layouts are inconsistent with the need to enforce
locking constraints.</t>
        </li>
        <li>
          <t>When existing layouts are inconsistent with the requirements
regarding resilvering as described in <xref target="sec-mds-resilvering"/>.</t>
        </li>
      </ul>
      <section anchor="cbrecallany">
        <name>CB_RECALL_ANY</name>
        <t>The metadata server can use the CB_RECALL_ANY callback operation
to notify the client to return some or all of its layouts.  <xref section="22.3" sectionFormat="of" target="RFC8881"/> defines the allowed types of the "NFSv4 Recallable
Object Types Registry".</t>
        <figure anchor="fig-new-rca4">
          <name>RCA4 masks for v2</name>
          <sourcecode type="xdr"><![CDATA[
   /// const RCA4_TYPE_MASK_FF2_LAYOUT_MIN     = 20;
   /// const RCA4_TYPE_MASK_FF2_LAYOUT_MAX     = 21;
   ///
]]></sourcecode>
        </figure>
        <figure anchor="fig-CB_RECALL_ANY4args">
          <name>CB_RECALL_ANY4args XDR</name>
          <sourcecode type="xdr"><![CDATA[
   struct  CB_RECALL_ANY4args      {
       uint32_t        craa_layouts_to_keep;
       bitmap4         craa_type_mask;
   };
]]></sourcecode>
        </figure>
        <t>Typically, CB_RECALL_ANY will be used to recall client state when
the server needs to reclaim resources.  The craa_type_mask bitmap
specifies the type of resources that are recalled, and the
craa_layouts_to_keep value specifies how many of the recalled
flexible file v2 layouts the client is allowed to keep.  The mask flags
for the flexible file v2 layout are defined as in <xref target="fig-mask-flags"/>.</t>
        <figure anchor="fig-mask-flags">
          <name>Recall Mask Flags for v2</name>
          <sourcecode type="xdr"><![CDATA[
   /// enum ffv2_cb_recall_any_mask {
   ///     PNFS_FF_RCA4_TYPE_MASK_READ = 20,
   ///     PNFS_FF_RCA4_TYPE_MASK_RW   = 21
   /// };
   ///
]]></sourcecode>
        </figure>
        <t>The flags represent the iomode of the recalled layouts.  In response,
the client <bcp14>SHOULD</bcp14> return layouts of the recalled iomode that it
needs the least, keeping at most craa_layouts_to_keep flexible file
layouts.</t>
        <t>The PNFS_FF_RCA4_TYPE_MASK_READ flag notifies the client to return
layouts of iomode LAYOUTIOMODE4_READ.  Similarly, the
PNFS_FF_RCA4_TYPE_MASK_RW flag notifies the client to return layouts
of iomode LAYOUTIOMODE4_RW.  When both mask flags are set, the
client is notified to return layouts of either iomode.</t>
      </section>
    </section>
    <section anchor="layout-revocation-and-fencing">
      <name>Layout Revocation and Fencing</name>
      <t>In cases where clients are uncommunicative and their lease has
expired, or when clients fail to return recalled layouts within
a lease period, the metadata server <bcp14>MAY</bcp14> revoke client layouts
and reassign these resources to other clients (see <xref section="12.5.5" sectionFormat="of" target="RFC8881"/>).  To avoid data corruption from a revoked client continuing
to issue I/O, the metadata server <bcp14>MUST</bcp14> fence the revoked client from
the affected data files. The mechanism varies by coupling model and by
whether the client's layout stateid has been registered with the data
servers via TRUST_STATEID:</t>
      <dl>
        <dt>Loosely coupled, untrusted stateid:</dt>
        <dd>
          <t>The metadata server rotates the synthetic uid/gid on the
affected data files per <xref target="sec-Fencing-Clients"/>.  The
revoked client presents stale RPC credentials and receives
NFS4ERR_ACCESS from the data server.  This is the
flexible-file-v1-layout-style fencing mechanism; it operates
per data file and
does not distinguish between clients that hold layouts on
the same file.</t>
        </dd>
        <dt>Tightly coupled, trusted stateid:</dt>
        <dd>
          <t>When the metadata server has registered a client's layout
stateid with the data servers via TRUST_STATEID, it can revoke per-client access
without rotating credentials by issuing REVOKE_STATEID to each affected data server, or
BULK_REVOKE_STATEID when
revoking all stateids belonging to a single clientid4
across a data server.  Subsequent I/O from the revoked
client carrying the revoked stateid receives
NFS4ERR_BAD_STATEID.  This is the preferred mechanism for
chunked layouts because it is per-client and avoids the
flexible file v1 layout's limitation of fencing all clients
on a data file when only one needs to be revoked.</t>
        </dd>
        <dt>Mixed:</dt>
        <dd>
          <t>A metadata server <bcp14>MAY</bcp14> combine the two mechanisms when a
file's layout includes both PASSTHROUGH mirrors (where
stateid registration is not in play) and chunked mirrors
with trusted stateids.  The metadata server rotates
synthetic ids for the PASSTHROUGH mirror's data file and
issues REVOKE_STATEID for the chunked mirror's data
servers.</t>
        </dd>
      </dl>
    </section>
    <section anchor="new-nfsv42-error-values">
      <name>New NFSv4.2 Error Values</name>
      <figure anchor="fig-errors-xdr">
        <name>Errors XDR</name>
        <sourcecode type="xdr"><![CDATA[
   ///
   /// /* Erasure Coding error constants; added to nfsstat4 enum */
   ///
   /// const NFS4ERR_ENCODING_NOT_SUPPORTED         = 10097;
   /// const NFS4ERR_PAYLOAD_NOT_ATOMIC           = 10098;
   /// const NFS4ERR_CHUNK_LOCKED                 = 10099;
   /// const NFS4ERR_CHUNK_GUARDED                = 10100;
   /// const NFS4ERR_PAYLOAD_LOST                 = 10101;
   /// const NFS4ERR_LAYOUT_CHECKSUM_NOT_SUPPORTED = 10102;
   /// const NFS4ERR_NO_PREDECESSOR               = 10103;
   /// const NFS4ERR_NO_ADOPTABLE_LOCK            = 10104;
   /// const NFS4ERR_STALE_ESCROW                 = 10105;
   /// const NFS4ERR_STALE_MDS_EPOCH              = 10106;
   /// const NFS4ERR_PARTIAL                      = 10107;
   ///
]]></sourcecode>
      </figure>
      <t>The new error codes are shown in <xref target="fig-errors-xdr"/>.</t>
      <section anchor="error-definitions">
        <name>Error Definitions</name>
        <table anchor="tbl-protocol-errors">
          <name>Error Definitions</name>
          <thead>
            <tr>
              <th align="left">Error</th>
              <th align="left">Number</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">NFS4ERR_ENCODING_NOT_SUPPORTED</td>
              <td align="left">10097</td>
              <td align="left">
                <xref target="sec-NFS4ERR_ENCODING_NOT_SUPPORTED"/></td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_PAYLOAD_NOT_ATOMIC</td>
              <td align="left">10098</td>
              <td align="left">
                <xref target="sec-NFS4ERR_PAYLOAD_NOT_ATOMIC"/></td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_CHUNK_LOCKED</td>
              <td align="left">10099</td>
              <td align="left">
                <xref target="sec-NFS4ERR_CHUNK_LOCKED"/></td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_CHUNK_GUARDED</td>
              <td align="left">10100</td>
              <td align="left">
                <xref target="sec-NFS4ERR_CHUNK_GUARDED"/></td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_PAYLOAD_LOST</td>
              <td align="left">10101</td>
              <td align="left">
                <xref target="sec-NFS4ERR_PAYLOAD_LOST"/></td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_LAYOUT_CHECKSUM_NOT_SUPPORTED</td>
              <td align="left">10102</td>
              <td align="left">
                <xref target="sec-NFS4ERR_LAYOUT_CHECKSUM_NOT_SUPPORTED"/></td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_NO_PREDECESSOR</td>
              <td align="left">10103</td>
              <td align="left">
                <xref target="sec-NFS4ERR_NO_PREDECESSOR"/></td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_NO_ADOPTABLE_LOCK</td>
              <td align="left">10104</td>
              <td align="left">
                <xref target="sec-NFS4ERR_NO_ADOPTABLE_LOCK"/></td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_STALE_ESCROW</td>
              <td align="left">10105</td>
              <td align="left">
                <xref target="sec-NFS4ERR_STALE_ESCROW"/></td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_STALE_MDS_EPOCH</td>
              <td align="left">10106</td>
              <td align="left">
                <xref target="sec-NFS4ERR_STALE_MDS_EPOCH"/></td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_PARTIAL</td>
              <td align="left">10107</td>
              <td align="left">
                <xref target="sec-NFS4ERR_PARTIAL"/></td>
            </tr>
          </tbody>
        </table>
        <section anchor="sec-NFS4ERR_ENCODING_NOT_SUPPORTED">
          <name>NFS4ERR_ENCODING_NOT_SUPPORTED (Error Code 10097)</name>
          <t>The client requested a ffv2_encoding_type4 which the metadata server
does not support.  I.e., if the client sends a layout_hint requesting
an erasure encoding type that the metadata server does not support,
this error code can be returned.  The client might have to send the
layout_hint several times to determine the overlapping set of
supported erasure encoding types.</t>
        </section>
        <section anchor="sec-NFS4ERR_PAYLOAD_NOT_ATOMIC">
          <name>NFS4ERR_PAYLOAD_NOT_ATOMIC (Error Code 10098)</name>
          <t>The client encountered a payload in which the blocks were non-atomic
and stay non-atomic.  As the client can not tell if another
client is actively writing, it informs the metadata server of this
error via LAYOUTERROR.  The metadata server can then arrange for
repair of the file.</t>
        </section>
        <section anchor="sec-NFS4ERR_CHUNK_LOCKED">
          <name>NFS4ERR_CHUNK_LOCKED (Error Code 10099)</name>
          <t>The client tried an operation on a chunk which resulted in the data
server reporting that the chunk was locked. The client will then
inform the metadata server of this error via LAYOUTERROR.  The
metadata server can then arrange for repair of the file.</t>
        </section>
        <section anchor="sec-NFS4ERR_CHUNK_GUARDED">
          <name>NFS4ERR_CHUNK_GUARDED (Error Code 10100)</name>
          <t>The client tried a guarded CHUNK_WRITE on a chunk which did not match
the guard on the chunk in the data file. As such, the CHUNK_WRITE was
rejected and the client should refresh the chunk it has cached.</t>
        </section>
        <section anchor="sec-NFS4ERR_PAYLOAD_LOST">
          <name>NFS4ERR_PAYLOAD_LOST (Error Code 10101)</name>
          <t>Returned by a repair actor on the CB_CHUNK_REPAIR response
(ccrr_status) to indicate that the identified ranges cannot be
repaired and the underlying data is no longer recoverable.
Causes include: too few surviving shards to meet the
reconstruction threshold (Katz criterion for Mojette, any
k-of-(k + m) subset for Reed-Solomon Vandermonde), inability to
roll back to a previously committed payload because that payload
is also lost, or exhaustion of all FFV2_DS_FLAGS_REPAIR data
servers available in the layout with no additional replacement
reachable from the metadata server's out-of-band pool.</t>
          <t>On receipt of NFS4ERR_PAYLOAD_LOST from a repair actor, the
metadata server <bcp14>MUST NOT</bcp14> retry the repair by selecting a
different client -- the payload is damaged.  Subsequent client
access to the affected ranges <bcp14>MUST</bcp14> fail: a CHUNK_READ (or an
NFSv4 READ against a damaged PASSTHROUGH range) returns
NFS4ERR_PAYLOAD_LOST; a CHUNK_WRITE that overwrites a damaged
range in its entirety <bcp14>MAY</bcp14> succeed and produce a new atomic
generation for that range (the write does not depend on the
damaged prior content), but a partial-range write that would
require reading the damaged bytes returns NFS4ERR_PAYLOAD_LOST
as well.  Client NFSv4 implementations <bcp14>MUST</bcp14> surface
NFS4ERR_PAYLOAD_LOST to the calling application as the POSIX
errno EIO; a client <bcp14>MAY</bcp14> additionally record a more specific
diagnostic (e.g., Linux EMEDIUMTYPE) in an out-of-band log or
attribute, but the application-visible errno is EIO for
portability.  The metadata server <bcp14>MAY</bcp14> additionally reflect the
damage in an attribute-level indicator or operator-facing
notification, but those mechanisms are outside the scope of
this specification.</t>
          <t>NFS4ERR_PAYLOAD_LOST is distinct from NFS4ERR_DELAY (transient;
metadata server <bcp14>MAY</bcp14> extend the deadline or re-select) and from
NFS4ERR_IO (per-operation failure; metadata server <bcp14>MAY</bcp14> retry or
re-select).  Only NFS4ERR_PAYLOAD_LOST is terminal.</t>
        </section>
        <section anchor="sec-NFS4ERR_LAYOUT_CHECKSUM_NOT_SUPPORTED">
          <name>NFS4ERR_LAYOUT_CHECKSUM_NOT_SUPPORTED (Error Code 10102)</name>
          <t>Returned by the client on LAYOUTRETURN to indicate that the
layout's ffv2m_checksum_algorithm
(<xref target="sec-ffv2-mirror4"/>) names a checksum_algorithm4
(<xref target="sec-checksum4"/>) that the client does not implement.
The client returns the layout with this error code rather
than attempting CHUNK operations it cannot validate.</t>
          <t>On receipt, the metadata server <bcp14>MAY</bcp14>:</t>
          <ul spacing="normal">
            <li>
              <t>issue a new layout for the same file naming a different
checksum_algorithm4 that the client supports (if the
file's policy permits any of the algorithms the client
does support); or</t>
            </li>
            <li>
              <t>deny the layout request, in which case the client <bcp14>MUST</bcp14>
either fall back to metadata-server-mediated I/O or report an I/O
error to the application.</t>
            </li>
          </ul>
          <t>NFS4ERR_LAYOUT_CHECKSUM_NOT_SUPPORTED is distinct from
NFS4ERR_BADLAYOUT (generic "this layout shape is unusable"):
the explicit per-checksum-algorithm signal lets the metadata
server discriminate "client can't read this layout because
of the checksum algorithm" from "client can't read this
layout for some other reason" and respond accordingly.</t>
        </section>
        <section anchor="sec-NFS4ERR_NO_PREDECESSOR">
          <name>NFS4ERR_NO_PREDECESSOR (Error Code 10103)</name>
          <t>Returned on a CHUNK_ROLLBACK
against a COMMITTED chunk when the caller names a
predecessor generation whose owner-to-index association
is no longer recorded by the data server, and no other
per-entry error covers the situation.  This is the "no
restorable predecessor" outcome of the restore case
described under "Rollback of COMMITTED Chunks": the
predecessor's payload+association pair was released some
time earlier under the retention scope rule
(<xref target="sec-system-model-retention-scope"/>) -- by lease expiry,
by an earlier CHUNK_ROLLBACK delete case, or by any
other terminal transition -- and the data server cannot
restore what it no longer holds.</t>
          <t>NFS4ERR_NO_PREDECESSOR is a per-entry status (a caller
that names several generations in a single
CHUNK_ROLLBACK <bcp14>MAY</bcp14> receive NFS4ERR_NO_PREDECESSOR on
some slots and NFS4_OK or other per-entry errors on
others).  It is a data-plane result, NOT a
control-plane failure: the caller reached the data
server successfully, was authorized, and the operation
evaluated normally -- the named predecessor simply
does not exist to restore.</t>
          <t>NFS4ERR_NO_PREDECESSOR is distinct from NFS4ERR_INVAL
(the triple was invalidated by an explicit delete case
and cannot be resurrected -- see "Deletion Atomicity and
Invalidated Triples") and from NFS4ERR_PAYLOAD_LOST
(terminal payload loss reported on CB_CHUNK_REPAIR).
The data server distinguishes NFS4ERR_NO_PREDECESSOR
from NFS4ERR_INVAL on the basis of what the data server
can concretely observe about the presented triple, NOT
on historical knowledge the data server may no longer
retain:</t>
          <dl>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>returned in exactly the cases where the data server can
concretely recognize the presented triple as invalid:</t>
              <dl>
                <dt>Structurally invalid:</dt>
                <dd>
                  <t>the triple is malformed or truncated, or names a
different file or a different data server.</t>
                </dd>
                <dt>Within-window release:</dt>
                <dd>
                  <t>a prior explicit CHUNK_ROLLBACK delete case released the
association and the current request falls within the
same session slot's replay-cache window of that
CHUNK_ROLLBACK, so the data server still holds the
concrete invalidation context that identifies this
triple as released-by-delete-case.</t>
                </dd>
              </dl>
            </dd>
            <dt>NFS4ERR_NO_PREDECESSOR:</dt>
            <dd>
              <t>covers every other case in which the data server holds no
association for the presented triple, including:</t>
              <dl>
                <dt>Retention-scope release:</dt>
                <dd>
                  <t>release under the retention scope rule (lease expiry,
storage-pressure release).</t>
                </dd>
                <dt>Post-window release:</dt>
                <dd>
                  <t>the eventual release of a triple invalidated by an
earlier delete case whose replay-cache window has since
elapsed.</t>
                </dd>
                <dt>No surviving record:</dt>
                <dd>
                  <t>a well-formed triple for this file and this data server
for which the data server holds no surviving record and
no concrete invalidation context.</t>
                </dd>
              </dl>
            </dd>
          </dl>
          <t>An implementation that does not retain a per-triple record
after release cannot distinguish "the data server never
recorded this triple" from "the data server recorded and later
released this triple" outside a live invalidation context, and
this specification does not require it to: both cases resolve
to NFS4ERR_NO_PREDECESSOR under the "no surviving record" case
above.  The two errors are
not interchangeable: NFS4ERR_INVAL is a caller-side
signal that the client <bcp14>MUST NOT</bcp14> retry the same
identity, while NFS4ERR_NO_PREDECESSOR is a data-plane
signal that the caller <bcp14>MAY</bcp14> fall back to
best-effort reconstruction via CHUNK_WRITE_REPAIR.</t>
          <t>A client that receives NFS4ERR_NO_PREDECESSOR <bcp14>MAY</bcp14> fall
back to reconstructing authoritative bytes from
surviving shards and writing them via
CHUNK_WRITE_REPAIR under a
new owner triple; that fallback is best-effort and
<bcp14>MAY</bcp14> itself terminate at NFS4ERR_PAYLOAD_LOST if no
authoritative source exists.  A client that requires
the restored generation to retain the predecessor's
original owner triple in cases where the retention
scope (<xref target="sec-system-model-retention-scope"/>) would
otherwise permit release <bcp14>MUST</bcp14> use the metadata-server escrow
control plane (<xref target="sec-CHUNK_ESCROW_INSTALL"/>
through <xref target="sec-CHUNK_ESCROW_TAKEOVER"/>), which pins
the predecessor's payload and its owner-to-index
association jointly against that release rule for as
long as the escrow-lock or a client-owned lock
adopted from it remains in continuous custody (see
<xref target="sec-composed-rollback"/>).</t>
        </section>
        <section anchor="sec-NFS4ERR_NO_ADOPTABLE_LOCK">
          <name>NFS4ERR_NO_ADOPTABLE_LOCK (Error Code 10104)</name>
          <t>Returned by CHUNK_LOCK when a
repair actor attempts to adopt a metadata-server escrow lock
(<xref target="sec-chunk_guard_mds"/>) and no such adoption is
possible on the data server for the requested range.
There are four state-level causes:</t>
          <ul spacing="normal">
            <li>
              <t>no metadata-server escrow lock is installed on the data server
for the requested range;</t>
            </li>
            <li>
              <t>a metadata-server escrow lock is installed but its
escrow_id4 (<xref target="sec-escrow_id4"/>) does not match
the identity the repair actor presents;</t>
            </li>
            <li>
              <t>the range's escrow lock is currently under a
reconciliation hold following a metadata-server
incarnation change (see
<xref target="sec-CHUNK_ESCROW_TAKEOVER"/>) and cannot be
adopted until the hold clears; or</t>
            </li>
            <li>
              <t>the escrow was already adopted by a different
repair actor whose adoption remains active.</t>
            </li>
          </ul>
          <t>Authorization-level failures -- the caller is not
the metadata-server-designated repair actor for
this escrow, or the caller lacks credentials for
the escrow's scope -- surface as NFS4ERR_ACCESS
rather than NFS4ERR_NO_ADOPTABLE_LOCK, so that no
data-plane information about the current adopter is
leaked to an unauthorized caller.</t>
          <t>On receipt of NFS4ERR_NO_ADOPTABLE_LOCK, the repair
client <bcp14>MUST</bcp14> report the outcome to the metadata
server via CB_CHUNK_REPAIR's per-range status array
(<xref target="sec-CB_CHUNK_REPAIR"/>) and <bcp14>MUST NOT</bcp14>
unilaterally acquire a fresh CHUNK_LOCK, retry the
adoption, or invoke the discovery/fallback path of
NFS4ERR_NO_PREDECESSOR
(<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>) -- the four causes
above are all control-plane conditions the metadata
server is best placed to resolve (by reissuing the
escrow, waiting for the reconciliation hold to
clear, or abandoning the repair).</t>
        </section>
        <section anchor="sec-NFS4ERR_STALE_ESCROW">
          <name>NFS4ERR_STALE_ESCROW (Error Code 10105)</name>
          <t>Returned by CHUNK_ESCROW_RELEASE when the escrow_id4
the metadata server presents does not match any
escrow currently installed on the data server for
the referenced range.  Two causes lead to the same
wire outcome:</t>
          <ul spacing="normal">
            <li>
              <t>no escrow covers the referenced range at the
data server (whether never installed, released
earlier, or consumed by a repair adoption); or</t>
            </li>
            <li>
              <t>an escrow covers the range but its recorded
escrow_id4 differs from the one presented (the
presented identity is a stale reference to an
earlier installation).</t>
            </li>
          </ul>
          <t>The data server <bcp14>MUST NOT</bcp14> alter any current lock or
escrow state as a side effect of returning
NFS4ERR_STALE_ESCROW: the response reports "the
identity you presented is not what I hold" without
changing what is held.  In particular, if the range
carries a metadata-server escrow lock whose escrow_id4 differs
from the presented identity, that lock survives the
call unchanged; and if the range carries a
client-owned lock that was previously adopted from
an escrow whose identity matches, that adopted
lock is not affected by a release of the presented
(now-stale) identity.</t>
        </section>
        <section anchor="sec-NFS4ERR_STALE_MDS_EPOCH">
          <name>NFS4ERR_STALE_MDS_EPOCH (Error Code 10106)</name>
          <t>Returned by any of the CHUNK_ESCROW operations
(<xref target="sec-CHUNK_ESCROW_INSTALL"/>,
<xref target="sec-CHUNK_ESCROW_RELEASE"/>,
<xref target="sec-CHUNK_ESCROW_ENUMERATE"/>) when the requesting
metadata server presents an epoch value the data
server no longer accepts because a newer metadata-server
incarnation has completed a
CHUNK_ESCROW_TAKEOVER.
The metadata server that receives NFS4ERR_STALE_MDS_EPOCH
has been fenced from continued escrow operations on
this data server; it <bcp14>MUST NOT</bcp14> retry the operation
under the same epoch and <bcp14>MUST</bcp14> obtain a fresh
incarnation-lease token and reissue via
CHUNK_ESCROW_TAKEOVER before resuming.  CHUNK_ESCROW_TAKEOVER itself is
not subject to this rejection -- it is the recovery
path out of an expired epoch and carries its own
compare-and-advance semantics per
<xref target="sec-CHUNK_ESCROW_TAKEOVER"/>.</t>
          <t>NFS4ERR_STALE_MDS_EPOCH is distinct from
NFS4ERR_ACCESS (credential-level failure) and from
NFS4ERR_STALE_ESCROW (identity mismatch on a
specific escrow): the stale-epoch response fences
the presenter's entire escrow-control session, not
a single per-escrow operation.</t>
        </section>
        <section anchor="sec-NFS4ERR_PARTIAL">
          <name>NFS4ERR_PARTIAL (Error Code 10107)</name>
          <t>Returned as the top-level status of a
CB_CHUNK_REPAIR response (<xref target="sec-CB_CHUNK_REPAIR"/>)
when the repair actor evaluated every named range
but at least one range's per-range status is not
NFS4_OK.  The per-range status array
(ccrr_range_status) is authoritative for the
outcome of each range; NFS4ERR_PARTIAL is the
top-level signal that the metadata server <bcp14>MUST</bcp14>
consume the per-range array rather than treating
the response as uniformly successful or uniformly
failed.</t>
          <t>NFS4ERR_PARTIAL is distinct from operation-wide
errors (decode failures, authorization failures,
session state failures) that fail every range at
once: those return the operation-wide error at the
top level with an EMPTY per-range array.
NFS4ERR_PARTIAL requires a co-indexed array with
one entry per named range and <bcp14>MAY</bcp14> carry any mix
of NFS4_OK and per-range failure codes.</t>
        </section>
      </section>
      <section anchor="operations-and-their-valid-errors">
        <name>Operations and Their Valid Errors</name>
        <t>The operations and their valid errors are presented in
<xref target="tbl-ops-and-errors"/>.  All error codes not defined in this document
are defined in <xref section="15" sectionFormat="of" target="RFC8881"/> and <xref section="11" sectionFormat="of" target="RFC7862"/>.</t>
        <table anchor="tbl-ops-and-errors">
          <name>Operations and Their Valid Errors</name>
          <thead>
            <tr>
              <th align="left">Operation</th>
              <th align="left">Errors</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">CHUNK_COMMIT</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_DELAY, NFS4ERR_FHEXPIRED, NFS4ERR_INVAL, NFS4ERR_IO, NFS4ERR_NOTSUPP, NFS4ERR_SERVERFAULT, NFS4ERR_STALE</td>
            </tr>
            <tr>
              <td align="left">CHUNK_ERROR</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_INVAL, NFS4ERR_NOTSUPP, NFS4ERR_SERVERFAULT</td>
            </tr>
            <tr>
              <td align="left">CHUNK_FINALIZE</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_DELAY, NFS4ERR_FHEXPIRED, NFS4ERR_INVAL, NFS4ERR_IO, NFS4ERR_NOTSUPP, NFS4ERR_SERVERFAULT, NFS4ERR_STALE</td>
            </tr>
            <tr>
              <td align="left">CHUNK_HEADER_READ</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_DELAY, NFS4ERR_FHEXPIRED, NFS4ERR_INVAL, NFS4ERR_IO, NFS4ERR_NOTSUPP, NFS4ERR_REP_TOO_BIG, NFS4ERR_SERVERFAULT, NFS4ERR_STALE</td>
            </tr>
            <tr>
              <td align="left">CHUNK_LOCK</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_CHUNK_LOCKED, NFS4ERR_INVAL, NFS4ERR_NOTSUPP, NFS4ERR_NO_ADOPTABLE_LOCK, NFS4ERR_SERVERFAULT</td>
            </tr>
            <tr>
              <td align="left">CHUNK_READ</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_DELAY, NFS4ERR_FHEXPIRED, NFS4ERR_IO, NFS4ERR_NOTSUPP, NFS4ERR_PAYLOAD_NOT_ATOMIC, NFS4ERR_SERVERFAULT, NFS4ERR_STALE</td>
            </tr>
            <tr>
              <td align="left">CHUNK_REPAIRED</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_INVAL, NFS4ERR_NOTSUPP, NFS4ERR_SERVERFAULT</td>
            </tr>
            <tr>
              <td align="left">CHUNK_ROLLBACK</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_INVAL, NFS4ERR_NOTSUPP, NFS4ERR_NO_PREDECESSOR, NFS4ERR_SERVERFAULT</td>
            </tr>
            <tr>
              <td align="left">CHUNK_UNLOCK</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_INVAL, NFS4ERR_NOTSUPP, NFS4ERR_SERVERFAULT</td>
            </tr>
            <tr>
              <td align="left">CHUNK_WRITE</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_CHUNK_GUARDED, NFS4ERR_CHUNK_LOCKED, NFS4ERR_DELAY, NFS4ERR_FHEXPIRED, NFS4ERR_IO, NFS4ERR_NOSPC, NFS4ERR_NOTSUPP, NFS4ERR_SERVERFAULT, NFS4ERR_STALE</td>
            </tr>
            <tr>
              <td align="left">CHUNK_WRITE_REPAIR</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_DELAY, NFS4ERR_FHEXPIRED, NFS4ERR_IO, NFS4ERR_NOSPC, NFS4ERR_NOTSUPP, NFS4ERR_SERVERFAULT, NFS4ERR_STALE</td>
            </tr>
            <tr>
              <td align="left">TRUST_STATEID</td>
              <td align="left">NFS4_OK, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_DELAY, NFS4ERR_INVAL, NFS4ERR_NOFILEHANDLE, NFS4ERR_NOTSUPP, NFS4ERR_PERM, NFS4ERR_SERVERFAULT</td>
            </tr>
            <tr>
              <td align="left">REVOKE_STATEID</td>
              <td align="left">NFS4_OK, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_DELAY, NFS4ERR_INVAL, NFS4ERR_NOFILEHANDLE, NFS4ERR_NOTSUPP, NFS4ERR_PERM, NFS4ERR_SERVERFAULT</td>
            </tr>
            <tr>
              <td align="left">BULK_REVOKE_STATEID</td>
              <td align="left">NFS4_OK, NFS4ERR_BADXDR, NFS4ERR_DELAY, NFS4ERR_NOTSUPP, NFS4ERR_PERM, NFS4ERR_SERVERFAULT</td>
            </tr>
            <tr>
              <td align="left">CHUNK_ESCROW_INSTALL</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_CHUNK_LOCKED, NFS4ERR_INVAL, NFS4ERR_NOTSUPP, NFS4ERR_PERM, NFS4ERR_SERVERFAULT, NFS4ERR_STALE_MDS_EPOCH</td>
            </tr>
            <tr>
              <td align="left">CHUNK_ESCROW_RELEASE</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_INVAL, NFS4ERR_NOTSUPP, NFS4ERR_PERM, NFS4ERR_SERVERFAULT, NFS4ERR_STALE_ESCROW, NFS4ERR_STALE_MDS_EPOCH</td>
            </tr>
            <tr>
              <td align="left">CHUNK_ESCROW_ENUMERATE</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_INVAL, NFS4ERR_NOTSUPP, NFS4ERR_PERM, NFS4ERR_SERVERFAULT, NFS4ERR_STALE_MDS_EPOCH</td>
            </tr>
            <tr>
              <td align="left">CHUNK_ESCROW_TAKEOVER</td>
              <td align="left">NFS4_OK, NFS4ERR_ACCESS, NFS4ERR_BADXDR, NFS4ERR_INVAL, NFS4ERR_NOTSUPP, NFS4ERR_PERM, NFS4ERR_SERVERFAULT, NFS4ERR_STALE_MDS_EPOCH</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="callback-operations-and-their-valid-errors">
        <name>Callback Operations and Their Valid Errors</name>
        <t>The callback operations and their valid errors are presented in
<xref target="tbl-cb-ops-and-errors"/>.  All error codes not defined in this document
are defined in <xref section="15" sectionFormat="of" target="RFC8881"/> and <xref section="11" sectionFormat="of" target="RFC7862"/>.</t>
        <table anchor="tbl-cb-ops-and-errors">
          <name>Callback Operations and Their Valid Errors</name>
          <thead>
            <tr>
              <th align="left">Callback Operation</th>
              <th align="left">Errors</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">CB_CHUNK_REPAIR</td>
              <td align="left">NFS4_OK, NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID, NFS4ERR_DEADSESSION, NFS4ERR_DELAY, NFS4ERR_ENCODING_NOT_SUPPORTED, NFS4ERR_INVAL, NFS4ERR_IO, NFS4ERR_ISDIR, NFS4ERR_LOCKED, NFS4ERR_NOTSUPP, NFS4ERR_OLD_STATEID, NFS4ERR_PARTIAL, NFS4ERR_PAYLOAD_LOST, NFS4ERR_SERVERFAULT, NFS4ERR_STALE</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="errors-and-the-operations-that-use-them">
        <name>Errors and the Operations That Use Them</name>
        <t>The operations and their valid errors are presented in
<xref target="tbl-errors-and-ops"/>.  All operations not defined in this document
are defined in <xref section="18" sectionFormat="of" target="RFC8881"/> and <xref section="15" sectionFormat="of" target="RFC7862"/>.</t>
        <table anchor="tbl-errors-and-ops">
          <name>Errors and the Operations That Use Them</name>
          <thead>
            <tr>
              <th align="left">Error</th>
              <th align="left">Operations</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">NFS4ERR_ENCODING_NOT_SUPPORTED</td>
              <td align="left">CB_CHUNK_REPAIR, LAYOUTGET</td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_PAYLOAD_NOT_ATOMIC</td>
              <td align="left">CHUNK_READ</td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_CHUNK_LOCKED</td>
              <td align="left">CHUNK_LOCK, CHUNK_WRITE, CHUNK_ESCROW_INSTALL</td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_CHUNK_GUARDED</td>
              <td align="left">CHUNK_WRITE</td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_PAYLOAD_LOST</td>
              <td align="left">CB_CHUNK_REPAIR</td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_LAYOUT_CHECKSUM_NOT_SUPPORTED</td>
              <td align="left">LAYOUTGET</td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_NO_PREDECESSOR</td>
              <td align="left">CHUNK_ROLLBACK</td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_NO_ADOPTABLE_LOCK</td>
              <td align="left">CHUNK_LOCK</td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_STALE_ESCROW</td>
              <td align="left">CHUNK_ESCROW_RELEASE</td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_STALE_MDS_EPOCH</td>
              <td align="left">CHUNK_ESCROW_INSTALL, CHUNK_ESCROW_RELEASE, CHUNK_ESCROW_ENUMERATE, CHUNK_ESCROW_TAKEOVER</td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_PARTIAL</td>
              <td align="left">CB_CHUNK_REPAIR</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="exchgid4flaguseerasureds">
      <name>EXCHGID4_FLAG_USE_ERASURE_DS</name>
      <figure anchor="fig-EXCHGID4_FLAG_USE_ERASURE_DS">
        <name>The EXCHGID4_FLAG_USE_ERASURE_DS</name>
        <sourcecode type="xdr"><![CDATA[
   /// const EXCHGID4_FLAG_USE_ERASURE_DS      = 0x00100000;
]]></sourcecode>
      </figure>
      <t>When a data server connects to a metadata server it can via
EXCHANGE_ID (see <xref section="18.35" sectionFormat="of" target="RFC8881"/>) state its pNFS role.
The data server can use EXCHGID4_FLAG_USE_ERASURE_DS (see
<xref target="fig-EXCHGID4_FLAG_USE_ERASURE_DS"/>) to indicate that it supports the
new NFSv4.2 operations introduced in this document.  <xref section="13.1" sectionFormat="of" target="RFC8881"/> describes the interaction of the various pNFS roles masked
by EXCHGID4_FLAG_MASK_PNFS.  However, that does not mask out
EXCHGID4_FLAG_USE_ERASURE_DS.  I.e., EXCHGID4_FLAG_USE_ERASURE_DS can
be used in combination with all of the pNFS flags.</t>
      <t>If the data server sets EXCHGID4_FLAG_USE_ERASURE_DS during the
EXCHANGE_ID operation, then it <bcp14>MUST</bcp14> support all of the operations
in <xref target="tbl-protocol-ops"/>.  Further, this support is orthogonal to the
Erasure Encoding Type selected.  The data server is unaware of which type
is driving the I/O.</t>
    </section>
    <section anchor="new-nfsv42-attributes">
      <name>New NFSv4.2 Attributes</name>
      <section anchor="sec-fattr4_coding_block_size">
        <name>Attribute 89: fattr4_coding_block_size</name>
        <figure anchor="fig-fattr4_coding_block_size">
          <name>XDR for fattr4_coding_block_size</name>
          <sourcecode type="xdr"><![CDATA[
   /// typedef uint64_t                  fattr4_coding_block_size;
   ///
   /// const FATTR4_CODING_BLOCK_SIZE  = 89;
   ///
]]></sourcecode>
        </figure>
        <t>The new attribute fattr4_coding_block_size (see
<xref target="fig-fattr4_coding_block_size"/>) is an <bcp14>OPTIONAL</bcp14> to NFSv4.2 attribute
which <bcp14>MUST</bcp14> be supported if the metadata server supports the Flexible
File Version 2 Layout Type.  By querying it, the client can determine
the data block size it is to use when coding the data blocks to
chunks.</t>
      </section>
      <section anchor="sec-fattr4_chunked_data_file">
        <name>Attribute 90: fattr4_chunked_data_file</name>
        <figure anchor="fig-fattr4_chunked_data_file">
          <name>XDR for fattr4_chunked_data_file</name>
          <sourcecode type="xdr"><![CDATA[
   /// typedef bool                      fattr4_chunked_data_file;
   ///
   /// const FATTR4_CHUNKED_DATA_FILE  = 90;
   ///
]]></sourcecode>
        </figure>
        <t>The new attribute fattr4_chunked_data_file (see
<xref target="fig-fattr4_chunked_data_file"/>) is an <bcp14>OPTIONAL</bcp14> to NFSv4.2
attribute a data server uses to classify a data file as a
chunked-encoding data file for the purpose of enforcing the client
restrictions in <xref target="sec-ops-client"/>.  When set to TRUE, the file is
under flexible file v2 layout chunked-encoding management by a
metadata server; the
data server <bcp14>MUST</bcp14> apply the "<bcp14>MUST</bcp14> reject" rules on client operations
against such files (see <xref target="sec-data-file-identification"/>).  When
FALSE or absent, no such enforcement is triggered by this attribute
alone.</t>
        <t>Only the metadata server sets this attribute; the metadata server
sets it as part of allocating a chunked-encoding data file on the
data server.  Clients <bcp14>MUST NOT</bcp14> SETATTR this attribute; a data
server <bcp14>MUST</bcp14> reject a client SETATTR of FATTR4_CHUNKED_DATA_FILE
with NFS4ERR_INVAL.  A data server that does not support this
attribute falls back to the other identification methods described
in <xref target="sec-data-file-identification"/>.</t>
        <t>The attribute describes the format of the file's content rather
than a property that can be applied to content already written:
when TRUE, the file holds chunks; when FALSE, it holds the data as
the writer supplied it.  Changing the attribute on a file that is
not empty would reinterpret existing content under a format it was
not written in, in either direction, and the resulting
misinterpretation is not detectable from the attribute alone.</t>
        <t>The value is therefore fixed once the file holds data.  The
metadata server <bcp14>MUST NOT</bcp14> change the attribute on a file that is
not empty, and a data server <bcp14>MUST</bcp14> reject a SETATTR of
FATTR4_CHUNKED_DATA_FILE against a file that is not empty with
NFS4ERR_INVAL, whether the request arrives from a client or over
the metadata server's control session.  A metadata server that
allocates a data file before it has selected the encoding for that
file <bcp14>MAY</bcp14> set the attribute to its final value at any point while
the file remains empty.  How a data server determines that a file
is not empty is an implementation matter.</t>
      </section>
    </section>
    <section anchor="new-nfsv42-common-data-structures">
      <name>New NFSv4.2 Common Data Structures</name>
      <section anchor="sec-chunk_cohort_id4">
        <name>chunk_cohort_id4</name>
        <figure anchor="fig-chunk_cohort_id4">
          <name>XDR for chunk_cohort_id4</name>
          <sourcecode type="xdr"><![CDATA[
   /// typedef uint64_t   chunk_cohort_id4;
]]></sourcecode>
        </figure>
        <t>The chunk_cohort_id4 is a 64-bit writer-chosen opaque identifier
that names a single write transaction (a "cohort" of chunks written
together in one CHUNK_WRITE batch, or across several CHUNK_WRITEs
that a single writer chooses to associate as one logical
transaction).  Under the shared-cohort model
(<xref target="sec-CHUNK_WRITE"/>), every chunk in a batch carries the same
chunk_cohort_id4 so that lifecycle operations (CHUNK_FINALIZE,
CHUNK_COMMIT, CHUNK_ROLLBACK) can name the transaction as a
whole.  The data server treats chunk_cohort_id4 opaquely: it does
NOT interpret the value beyond equality comparison, and it is NOT
required to be monotonic, dense, or ordered in any way.  Writers
<bcp14>MUST</bcp14> choose a new chunk_cohort_id4 per distinct write transaction
so that transactions can be distinguished on the data server; the
uniqueness scope required is per-(writer, file), not global.  A
writer with sufficient state <bcp14>MAY</bcp14> generate chunk_cohort_id4 values
from a counter, a random 64-bit source, a hashed transaction
identifier, or any other locally convenient scheme, subject to
the per-writer uniqueness rule.</t>
        <t>On the wire, a single CHUNK_WRITE carries a 12-byte cohort
header (chunk_cohort_id4 + writer's cg_client_id) once for
the batch, followed by, per chunk in the batch, the tagged
checksum4 and the opaque chunk payload, as shown in
<xref target="fig-chunk-wire-layout"/>.  The payload length is carried
separately in the CHUNK_WRITE4args cwa_chunks&lt;&gt; slot; the
diagram shows the header once and the per-chunk framing
that repeats.</t>
        <figure anchor="fig-chunk-wire-layout">
          <name>CHUNK_WRITE wire framing: cohort header + per-chunk chunks</name>
          <artwork><![CDATA[
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    cwa_cohort_id (hi 32)                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    cwa_cohort_id (lo 32)                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       cwa_client_id                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       cs_algorithm                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        cs_value_len                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    cs_value ... (variable)                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    opaque payload ...                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Bytes 0-7:    cwa_cohort_id   (chunk_cohort_id4; 64-bit opaque
                                  writer-chosen cohort identifier;
                                  once per CHUNK_WRITE)
   Bytes 8-11:   cwa_client_id   (writer's layout-granted 32-bit
                                  client id; once per CHUNK_WRITE)
   Bytes 12-15:  cs_algorithm    (checksum_algorithm4; per chunk)
   Bytes 16-19:  cs_value_len    (XDR opaque length prefix; per chunk)
   Bytes 20-N:   cs_value        (checksum bytes; length per
                                  cs_algorithm's registered output;
                                  per chunk)
   Bytes N+1-M:  opaque payload  (encoded shard; variable length;
                                  per chunk)

   The checksum block (cs_algorithm + cs_value_len + cs_value)
   is the XDR encoding of one checksum4.
   For CHECKSUM_ALG_NONE the cs_value_len is zero and the
   payload follows immediately after byte 19.  The per-chunk
   framing (bytes 12 onward) repeats for each chunk in the
   batch; the cohort header (bytes 0-11) appears once per
   CHUNK_WRITE.  The per-chunk co_id values live in
   CHUNK_WRITE4args cwa_co_ids<> and are not part of this
   framing.
]]></artwork>
        </figure>
      </section>
      <section anchor="sec-chunk_guard4">
        <name>chunk_guard4</name>
        <figure anchor="fig-chunk_guard4">
          <name>XDR for chunk_guard4</name>
          <sourcecode type="xdr"><![CDATA[
   /// const CHUNK_GUARD_CLIENT_ID_NONE = 0x00000000;
   /// const CHUNK_GUARD_CLIENT_ID_MDS  = 0xFFFFFFFF;
   ///
   /// struct chunk_guard4 {
   ///     uint32_t   cg_gen_id;
   ///     uint32_t   cg_client_id;
   /// };
]]></sourcecode>
        </figure>
        <t>The chunk_guard4 (see <xref target="fig-chunk_guard4"/>) is the per-chunk
compare-and-swap (CAS) state used by CHUNK_WRITE to detect concurrent updates.  It is state
that the data server MAINTAINS per chunk; the writer transaction
identity (the "cohort") is carried separately by
chunk_cohort_id4 (<xref target="sec-chunk_cohort_id4"/>) and is NOT part of
chunk_guard4.  chunk_guard4 has two fields:</t>
        <dl>
          <dt>cg_gen_id:</dt>
          <dd>
            <t>A per-chunk monotonic generation counter, tracked by the data
server.  Each chunk's gen_id starts at 0 when the chunk is
first written and is incremented on each successful CHUNK_WRITE
by any client.  cg_gen_id is NOT a timestamp -- the protocol
does not rely on a global clock, and no interpretation of
cg_gen_id as a wall-clock value is supported.  cg_gen_id
values are NOT comparable across distinct chunks; a given
cg_gen_id is only meaningful within the scope of a single
chunk on a single file.  cg_gen_id is NOT a transaction
identifier and <bcp14>MUST NOT</bcp14> be interpreted as naming or ordering
write transactions: transaction identity is chunk_cohort_id4
(<xref target="sec-chunk_cohort_id4"/>).</t>
          </dd>
          <dt>cg_client_id:</dt>
          <dd>
            <t>A 32-bit value established by the metadata server at the time
the client's layout is granted (see <xref target="sec-ffv2-mirror4"/> and
ffv2m_client_id).  The metadata server <bcp14>MUST</bcp14> assign distinct
cg_client_id values to distinct clients that hold concurrent
write layouts on the same file.  cg_client_id is opaque with
respect to client identity -- a data server <bcp14>MUST NOT</bcp14>
interpret its bits as naming or ordering clients in any
external sense.  The value supports two operations only:
equality comparison (to detect whether the current writer is
the client that last wrote a chunk) and numeric comparison
(to implement the tiebreaker rule below).  The same
cg_client_id value appears in the cohort record
(<xref target="sec-chunk_owner4"/>) as co_client_id; the two are
redundant carriers of the same layout-granted writer identity
so that both CAS state and cohort records remain
self-contained.</t>
          </dd>
          <dt>Uniqueness contract:</dt>
          <dd>
            <t>The chunk_guard4 pair (cg_gen_id, cg_client_id) identifies the
MOST RECENT successful writer of a chunk plus that chunk's
generation counter; it does NOT identify a specific write
transaction (that role is filled by chunk_cohort_id4).
Neither field alone is globally unique; two clients <bcp14>MAY</bcp14>
observe the same cg_gen_id on distinct chunks (each chunk's
counter is independent), and the cg_client_id is what makes
concurrent writers distinguishable at the CAS layer.</t>
          </dd>
          <dt>Observability:</dt>
          <dd>
            <t>The data server exposes the chunk's current chunk_guard4 on
the read path so that a client preparing a CAS update in
multiple writer mode (<xref target="sec-multi-writer"/>) can obtain the
expected prior value without racing.  Two operations return
it: CHUNK_READ carries cr_guard in each read_chunk4
(<xref target="sec-CHUNK_READ"/>), and CHUNK_HEADER_READ returns a
chrr_guards&lt;&gt; array co-indexed with the other per-chunk
arrays (<xref target="sec-CHUNK_HEADER_READ"/>).  A client places the
observed pair into cwa_guard.cwg_guard and sets
cwa_guard.cwg_check = TRUE on the subsequent CHUNK_WRITE; the data server compares against its
currently-held chunk_guard4 and returns NFS4ERR_CHUNK_GUARDED
on mismatch.</t>
          </dd>
          <dt>Deterministic contention resolution for concurrent writers:</dt>
          <dd>
            <t>When two or more clients race on the same chunk in the
multi-writer mode, the losing writer -- the one whose CAS
fails at any affected data server -- <bcp14>MUST</bcp14> roll back the
chunks it already wrote for the affected transaction and
retry under a fresh cohort id.  Convergence is achieved
by making losing writers back off, not by having the data
server pick a winner from the losing writer's state.
This is the wire-level mechanism that implements the
consistency invariant in <xref target="sec-system-model-consistency"/>
("one writer's entire chunk-generation wins and becomes
COMMITTED; the other writer sees NFS4ERR_CHUNK_GUARDED and
is expected to re-read and retry"); <xref target="sec-system-model-progress"/>
documents the progress guarantee this rule underwrites.
</t>
            <dl>
              <dt>At CHUNK_WRITE (per data server, arrival-order):</dt>
              <dd>
                <t>the data server accepts the first CHUNK_WRITE whose
chunk_guard4 CAS check succeeds against the chunk's
current chunk_guard4 value.  Later writers whose CAS
fails receive NFS4ERR_CHUNK_GUARDED for that chunk.
Because arrival order can differ between data servers,
different subsets of the mirror set <bcp14>MAY</bcp14> initially accept
different clients' writes for different chunks; that is
transient divergence, resolved by the client-driven
rollback below.</t>
              </dd>
              <dt>At NFS4ERR_CHUNK_GUARDED (client-driven rollback and retry):</dt>
              <dd>
                <t>a client that observes NFS4ERR_CHUNK_GUARDED on any
chunk of an in-flight transaction <bcp14>MUST</bcp14> treat the entire
transaction as lost.  It <bcp14>MUST</bcp14> issue CHUNK_ROLLBACK against every data server that
accepted a CHUNK_WRITE under this transaction's cohort
pair, so that the data server can release the PENDING
state and revert cg_gen_id to the value it held before
the losing writer's CAS succeeded.  The client then
re-reads the chunks with CHUNK_READ, applies its intended
change to the as-observed data, chooses a fresh
cwa_cohort_id, and re-issues CHUNK_WRITE with
cwa_guard.cwg_check = TRUE supplying the refreshed prior
chunk_guard4.</t>
              </dd>
              <dt>At CHUNK_FINALIZE (single winner already established):</dt>
              <dd>
                <t>by the time the mirror set converges, only one writer's
cohort remains as the PENDING state for each affected
chunk (all others have rolled back).  CHUNK_FINALIZE
against that PENDING state succeeds; there is no
tiebreaker comparison against the caller's co_client_id
at FINALIZE.  A caller that attempts CHUNK_FINALIZE
against a chunk whose current PENDING state carries a
cohort pair not matching the caller's transaction <bcp14>MUST</bcp14>
receive NFS4ERR_CHUNK_GUARDED and <bcp14>MUST</bcp14> proceed with the
rollback-and-retry flow above.  A caller whose own
PENDING state was overwritten by a different writer
<bcp14>SHOULD</bcp14> also receive NFS4ERR_CHUNK_GUARDED (the caller no
longer has a PENDING chunk to finalize).</t>
              </dd>
            </dl>
            <t>A client that has rolled back and retried but continues
to observe NFS4ERR_CHUNK_GUARDED without forward
progress after a bounded number of retries <bcp14>MUST</bcp14>
escalate via LAYOUTERROR and the repair coordination
flow in <xref target="sec-repair-selection"/>.  Bounded retry is a
client-implementation matter; the protocol does not
mandate a specific count, only that unbounded retry is
forbidden so that a contentious workload cannot livelock
without surfacing the contention to the metadata server.</t>
            <t>Client cg_client_id ordering is NOT used to pick a
winner: the numeric ordering of cg_client_id values is
arbitrary with respect to clients' external identities
and <bcp14>MUST NOT</bcp14> be interpreted as a preference ordering
over the clients themselves.  The arrival-order
arbitration at each data server, combined with mandatory
client rollback on CAS failure, is what makes the mirror
set converge; the metadata server <bcp14>MAY</bcp14> still arrange
cg_client_id assignment to influence diagnosis but <bcp14>MUST
NOT</bcp14> rely on numeric ordering for correctness.</t>
          </dd>
        </dl>
        <section anchor="metadata-server-assignment-rules-for-cgclientid">
          <name>Metadata-Server Assignment Rules for cg_client_id</name>
          <t>To uphold the uniqueness contract, the metadata server <bcp14>MUST</bcp14>
follow these rules when assigning cg_client_id (that is, when
populating ffv2m_client_id at layout-grant time):</t>
          <ul spacing="normal">
            <li>
              <t>Two clients holding concurrent write layouts on the same
file <bcp14>MUST</bcp14> receive distinct cg_client_id values.  A client
that holds only a read layout need not be assigned a
distinct value.</t>
            </li>
            <li>
              <t>The reserved sentinel CHUNK_GUARD_CLIENT_ID_NONE (0x00000000)
<bcp14>MUST NOT</bcp14> be assigned to any client.  Reserving 0 prevents an
uninitialized cg_client_id field from passing as a real
client and ensures the deterministic tiebreaker (numerically
lowest wins) does not encode an implicit priority via
assignment of 0.</t>
            </li>
            <li>
              <t>The reserved sentinel CHUNK_GUARD_CLIENT_ID_MDS (0xFFFFFFFF)
<bcp14>MUST NOT</bcp14> be assigned to any client.</t>
            </li>
            <li>
              <t>A cg_client_id <bcp14>MAY</bcp14> be reused by the metadata server after
the prior holder's layout has been fully returned (via
LAYOUTRETURN or revocation).  The metadata server <bcp14>SHOULD</bcp14>
avoid reusing a cg_client_id within a single lease period
to simplify diagnosis of stale writes.</t>
            </li>
            <li>
              <t>cg_client_id values do not persist across metadata-server
restart.  Clients reclaiming layouts during the grace period
receive freshly assigned values; the protocol does not rely
on any pre-restart assignment surviving.</t>
            </li>
          </ul>
        </section>
        <section anchor="data-server-collision-handling">
          <name>Data-Server Collision Handling</name>
          <t>A (cg_gen_id, cg_client_id) pair that the uniqueness contract
would otherwise render unique can nonetheless collide if a
client and the metadata server disagree about which
cg_client_id the client currently holds, or if a client
presents a spoofed cg_client_id.  The data server enforces the
contract locally:</t>
          <ul spacing="normal">
            <li>
              <t>If the data server receives a CHUNK_WRITE whose
chunk_guard4 has the same (cg_gen_id, cg_client_id) as a
chunk already in PENDING, FINALIZED, or COMMITTED state
AND the presented payload differs from the retained
payload, the data server <bcp14>MUST</bcp14> reject the write with
NFS4ERR_CHUNK_GUARDED and <bcp14>SHOULD</bcp14> report the collision to
the metadata server via LAYOUTERROR.  This situation is a
protocol violation on one side of the conversation; the
metadata server resolves it by revoking the offending
client's layout and selecting a repair actor under
<xref target="sec-repair-selection"/>.</t>
            </li>
            <li>
              <t>If a client presents CHUNK_GUARD_CLIENT_ID_MDS as
cg_client_id in any client-originated operation, the data
server <bcp14>MUST</bcp14> reject the operation with NFS4ERR_INVAL (see
<xref target="sec-chunk_guard_mds"/>).</t>
            </li>
            <li>
              <t>A cg_client_id that does not match the tsa_client_id
recorded for the layout stateid under which the
CAS operation is issued <bcp14>MUST</bcp14> be rejected with
NFS4ERR_BAD_STATEID.  This (stateid, client_id) binding is
registered by the metadata server via TRUST_STATEID; an unmatched cg_client_id is
treated as a stale-layout condition, see
<xref target="sec-tight-coupling-control"/>.</t>
            </li>
          </ul>
        </section>
        <section anchor="sec-chunk_guard_none">
          <name>Reserved cg_client_id Value: CHUNK_GUARD_CLIENT_ID_NONE</name>
          <t>The value <tt>CHUNK_GUARD_CLIENT_ID_NONE</tt> (0x00000000) is reserved.
It does not denote any client.  Reserving 0 prevents an
uninitialized cg_client_id field from passing as a real client
and ensures the deterministic tiebreaker (numerically lowest
wins, see <xref target="sec-chunk_guard4"/>) does not encode an implicit
priority via assignment of 0.</t>
          <t>Clients <bcp14>MUST NOT</bcp14> present CHUNK_GUARD_CLIENT_ID_NONE as the
cg_client_id of any client-originated chunk_guard4 or
chunk_owner4.  A data server that receives such a value from
a client <bcp14>MUST</bcp14> reject the operation with NFS4ERR_INVAL.</t>
        </section>
        <section anchor="sec-chunk_guard_mds">
          <name>CHUNK_GUARD_CLIENT_ID_MDS and the Metadata-Server Escrow Lock</name>
          <t>The value <tt>CHUNK_GUARD_CLIENT_ID_MDS</tt> (0xFFFFFFFF) is reserved.
It denotes that the chunk lock is held by the metadata server
itself, in escrow during a repair coordination sequence (see
<xref target="sec-repair-selection"/>).  The data server produces a
chunk_guard4 with this cg_client_id when the metadata server
revokes the prior holder's stateid while that holder still holds
chunk locks; the locks <bcp14>MUST NOT</bcp14> be dropped and are transferred to
the metadata-server escrow owner instead.</t>
          <t>The metadata server does not originate CHUNK_LOCK or CHUNK_WRITE
traffic on its own session.  Clients <bcp14>MUST NOT</bcp14> present
CHUNK_GUARD_CLIENT_ID_MDS as the cg_client_id of any
client-originated chunk_guard4 or chunk_owner4.  A data server
that receives such a value from a client <bcp14>MUST</bcp14> reject the
operation with NFS4ERR_INVAL.</t>
          <t>The metadata-server escrow owner is released only by a CHUNK_LOCK from the
client selected via CB_CHUNK_REPAIR, carrying
CHUNK_LOCK_FLAGS_ADOPT.  See <xref target="sec-CHUNK_LOCK"/>.</t>
          <t>Each metadata-server escrow lock carries an escrow_id4
(<xref target="sec-escrow_id4"/>) the metadata server chose at
CHUNK_ESCROW_INSTALL (<xref target="sec-CHUNK_ESCROW_INSTALL"/>) time
and presents on every subsequent operation that refers
to that lock (CHUNK_ESCROW_RELEASE, CB_CHUNK_REPAIR,
CHUNK_LOCK adoption via cla_adopt).  When a repair
client adopts the metadata-server escrow lock (CHUNK_LOCK with
CHUNK_LOCK_FLAGS_ADOPT), the data server <bcp14>MUST</bcp14> retain
the adopted escrow_id4 as durable custody metadata on
the resulting client-owned lock, for as long as a
subsequent revocation-transfer can occur that would
convert the client-owned lock back to a metadata-server escrow
lock (for example, when the client's lease later
expires while the lock is still held).  If such a
revocation-transfer occurs, the resulting new
metadata-server escrow lock <bcp14>MUST</bcp14> be installed with the SAME
escrow_id4 that was preserved as custody metadata,
not a fresh identity: this preserves the full durable
key <tt>(file, escrow_id, data-server set)</tt> across the entire
custody chain so that a metadata server's tuple
records can re-associate with the reappeared escrow
across an incarnation change (see
<xref target="sec-CHUNK_ESCROW_ENUMERATE"/> discovery).</t>
        </section>
      </section>
      <section anchor="sec-chunk_owner4">
        <name>chunk_owner4</name>
        <figure anchor="fig-chunk_owner4">
          <name>XDR for chunk_owner4</name>
          <sourcecode type="xdr"><![CDATA[
   /// struct chunk_owner4 {
   ///     chunk_cohort_id4  co_cohort_id;
   ///     uint32_t          co_client_id;
   ///     uint32_t          co_id;
   /// };
]]></sourcecode>
        </figure>
        <t>The chunk_owner4 (see <xref target="fig-chunk_owner4"/>) is the "cohort
record" for a chunk: it identifies the write transaction that
produced the chunk and which of that transaction's chunks the
record refers to.  It is separate from chunk_guard4
(<xref target="sec-chunk_guard4"/>), which is the per-chunk CAS state.  The
three fields together form the full owner triple.</t>
        <t>co_cohort_id is the chunk_cohort_id4 shared by every chunk
written together in a single logical transaction (see
<xref target="sec-CHUNK_WRITE"/> and the discussion of chunk_cohort_id4
above).  Two chunks are members of the same write transaction
iff their (co_cohort_id, co_client_id) pairs are equal.
Lifecycle operations (CHUNK_FINALIZE, CHUNK_COMMIT,
CHUNK_ROLLBACK) name transactions by co_cohort_id + co_client_id.</t>
        <t>co_client_id is the writer's layout-granted 32-bit identity, the
same value that appears as cg_client_id in the chunk_guard4 CAS
state (see <xref target="sec-chunk_guard4"/>).  It supports equality
comparison (matching cohort records to lifecycle operations) and
numeric comparison (implementing the multi-writer tiebreaker
described in <xref target="sec-chunk_guard4"/>).</t>
        <t>co_id is a writer-supplied opaque per-chunk identifier the client
chooses at CHUNK_WRITE time (see <xref target="sec-CHUNK_WRITE"/>).  It is
NOT required to equal the chunk's file index; the client <bcp14>MAY</bcp14>
choose any uint32_t value, subject only to the uniqueness
constraint that within a single (co_cohort_id, co_client_id) all
co_id values <bcp14>MUST</bcp14> be distinct so that a subsequent lifecycle
operation can name individual chunks unambiguously.  The data
server treats co_id opaquely; it does NOT interpret the value
beyond equality comparison against the co_id values it previously
accepted from the client for this cohort.  Writers that would
otherwise choose file-index values <bcp14>MAY</bcp14> do so, but the wire
semantics do not privilege that choice.</t>
        <t>Each distinct chunk-write transaction from a given client <bcp14>MUST</bcp14>
carry a unique co_cohort_id, so lifecycle operations can be
correlated with the transactions that produced them across all
data files.  The uniqueness scope required is per-(co_client_id,
file); different clients <bcp14>MAY</bcp14> independently pick colliding
co_cohort_id values because co_client_id disambiguates them.</t>
      </section>
      <section anchor="sec-escrow_id4">
        <name>escrow_id4</name>
        <t>For the design rationale of the escrow control plane -- what
problem it solves and how the components compose -- see
<xref target="sec-system-model-escrow"/>.  This section defines the
identifier only.</t>
        <figure anchor="fig-escrow_id4">
          <name>XDR for escrow_id4</name>
          <sourcecode type="xdr"><![CDATA[
   /// typedef opaque   escrow_id4[16];
]]></sourcecode>
        </figure>
        <t>The escrow_id4 is a 128-bit opaque identifier the
metadata server chooses for each metadata-server escrow lock
(<xref target="sec-chunk_guard_mds"/>) it installs on a data
server.  It is distinct from the chunk_owner4 owner
triple (<xref target="sec-chunk_owner4"/>) that identifies a chunk
generation: the escrow identity refers to the
custody of a repair-scope lock, while the owner
triple refers to a specific generation's bytes.  The
two namespaces do not overlap and are compared only
within their own contexts (an escrow_id4 is never
matched against a chunk_owner4 field).</t>
        <t>The escrow identity is threaded through the
metadata-server operations that manage escrow
custody: it appears in each escrow-family operation
this specification defines (CHUNK_ESCROW_INSTALL /
CHUNK_ESCROW_RELEASE / CHUNK_ESCROW_ENUMERATE /
CHUNK_ESCROW_TAKEOVER), in the callback that carries
the repair instruction (CB_CHUNK_REPAIR), and in the
CHUNK_LOCK argument variant that adopts an escrow
lock (see <xref target="sec-CHUNK_LOCK"/>).  A conforming
metadata server <bcp14>MUST</bcp14> choose escrow_id4 values that
are unique across every escrow it has ever installed
on any data server that might still recognize a
prior installation -- sufficient uniqueness is
provided by a 128-bit identifier drawn from a
metadata-server-incarnation prefix and a
per-incarnation monotonic counter, or by any
mechanism whose collision probability is negligible
across the lifetime of the deployment.  The metadata
server <bcp14>MUST NOT</bcp14> reuse an escrow_id4 whose lifecycle
is not provably complete.</t>
        <t>The data server treats escrow_id4 opaquely: it
compares two escrow_id4 values for equality when
matching a CHUNK_LOCK adoption against an
installed escrow, or when reconciling an escrow
tuple against a discovery response, and does not
interpret the internal structure.</t>
      </section>
      <section anchor="sec-chunk_state_flags4">
        <name>chunk_state_flags4</name>
        <figure anchor="fig-chunk_state_flags4">
          <name>XDR for chunk_state_flags4</name>
          <sourcecode type="xdr"><![CDATA[
   /// const CHUNK_STATE_FLAGS_LOCKED  = 0x00000001;
   ///
   /// typedef uint32_t   chunk_state_flags4;
]]></sourcecode>
        </figure>
        <t>The chunk_state_flags4 is a 32-bit bitmask carried in per-chunk
result arrays (chrr_locked in CHUNK_HEADER_READ4resok, cr_locked
in read_chunk4) to report the read-time state of a chunk on the
data server.  The value 0 means "no state flags set"; each
defined bit indicates a specific state property.  Unassigned
bits are reserved for future revisions of this specification;
receivers <bcp14>MUST</bcp14> ignore bits they do not recognize so that
additions are additive on the wire.</t>
        <dl>
          <dt>CHUNK_STATE_FLAGS_LOCKED:</dt>
          <dd>
            <t>the chunk currently has a CHUNK_LOCK held by some
chunk_owner4.  This state is reported orthogonally to the
per-chunk chrr_status / cr_status so that a locked chunk
still surfaces its lifecycle state and chunk_owner4 to the
inspector.</t>
          </dd>
        </dl>
      </section>
      <section anchor="sec-proof-profile">
        <name>Incarnation-Lease Proof</name>
        <t>CHUNK_ESCROW_TAKEOVER accepts a bounded
opaque proof payload identified by a proof profile
identifier.  The proof is not the metadata server's
own machine credential (which would only prove the
role, not the current exclusive incarnation): it is
an assertion issued by a single writer authority
external to the metadata server (a high-availability
manager, a cluster-consensus service, or an
operator-mediated recovery workflow) that only one
metadata-server instance currently holds the
incarnation lease.  The data server verifies the
proof before it will compare-and-advance its
recorded metadata-server epoch to the value the
takeover names.</t>
        <figure anchor="fig-proof-profile-typedef">
          <name>XDR for proof_profile_id4</name>
          <sourcecode type="xdr"><![CDATA[
   /// /* Registered proof profile identifier.  Values
   ///  * are allocated from the flexible file v2 layout
   ///  * proof-profile registry (see IANA Considerations,
   ///  * "Proof-Profile Registry").
   ///  */
   /// typedef uint32_t   proof_profile_id4;
   ///
   /// /* Reserved sentinel; MUST NOT appear on the wire. */
   /// const PROOF_PROFILE_UNSPECIFIED           = 0;
   ///
   /// /* Mandatory-to-implement profile:
   ///  * HA-authority-signed COSE_Sign1 lease token
   ///  * (see "Mandatory-to-Implement Profile" below).
   ///  */
   /// const PROOF_PROFILE_HA_AUTHORITY_ED25519  = 1;
   ///
   /// /* Upper bound (in bytes) on the proof payload
   ///  * a metadata server MAY present.
   ///  */
   /// const CETA_INCARNATION_PROOF_MAX4         = 4096;
]]></sourcecode>
        </figure>
        <section anchor="mandatory-to-implement-profile">
          <name>Mandatory-to-Implement Profile</name>
          <t>A conforming implementation <bcp14>MUST</bcp14> support at least
one proof profile so that two independent
implementations can verify each other's takeover
proofs at the wire level without prior out-of-band
negotiation.  This specification designates the
following profile as mandatory-to-implement.</t>
          <t>The mandatory profile carries a signed token whose
signer is the incarnation-lease authority (NOT the
metadata server itself).  The envelope is a
COSE_Sign1 structure (Section 4.2 of <xref target="RFC9052"/>)
over a deterministic CBOR payload (Section 4.2 of
<xref target="RFC8949"/>) with the following normative choices:</t>
          <dl>
            <dt>Signature algorithm (mandatory-to-implement):</dt>
            <dd>
              <t>Ed25519 (algorithm identifier -8 per <xref target="RFC9053"/>).  A
conforming signer <bcp14>MUST</bcp14> use
Ed25519; a conforming verifier <bcp14>MUST</bcp14> accept
Ed25519.  Other signature algorithms (e.g.,
ECDSA-P256 with identifier -7, RSASSA-PSS-SHA256
with identifier -37) <bcp14>MAY</bcp14> be registered as
additional profiles per the IANA Considerations.</t>
            </dd>
            <dt>kid header parameter:</dt>
            <dd>
              <t><bcp14>OPTIONAL</bcp14>.  A deployment
with a single trust anchor <bcp14>MAY</bcp14> omit it; a
deployment supporting key rotation or multiple
trust anchors <bcp14>SHOULD</bcp14> include it so a data server
can select the correct verification key.  Absent
kid, the data server attempts verification
against each configured trust anchor and accepts
on the first match.</t>
            </dd>
            <dt>Payload map fields:</dt>
            <dd>
              <t>the signed CBOR payload is a map with integer-keyed fields
(per <xref target="RFC9053"/> convention for compact wire size).
The mandatory-profile keys are:
 - 1 = principal (CBOR text string): the
   metadata-server principal that holds this
   incarnation.  Comparison is byte-for-byte
   against the RPCSEC_GSS authenticated name of
   the presenter (Section 5 of <xref target="RFC7861"/>),
   with no Unicode normalization or case
   folding; a deployment <bcp14>MUST</bcp14> provision the
   authority to sign tokens whose principal
   field is exactly the RPC-authenticated name
   the data server will observe.
 - 2 = epoch (CBOR uint): the metadata-server
   epoch value being claimed.  On presentation in
   CHUNK_ESCROW_TAKEOVER the data server
   <bcp14>MUST</bcp14> verify that this field equals
   ceta_new_epoch in the operation arguments; any
   mismatch is a signature-and-payload check
   failure at step 4 of "Presentation and
   Verification" below and returns NFS4ERR_ACCESS.
 - 3 = scope (CBOR text string): identifier of
   the data server or data-server set the token
   is valid for.  Comparison is byte-for-byte
   against the data-server-side value the
   deployment provisions at trust-anchor setup
   (see "Trust Anchor Provisioning" below); a
   data server accepts a token whose scope
   field exactly matches any scope identifier
   it has been provisioned to serve, and
   rejects any other value.  The scope
   namespace is deployment-local -- this
   specification neither defines a format nor
   constrains the character set beyond
   requiring UTF-8 CBOR text.
 - 4 = issued_at (CBOR tag-1 epoch-based
   date/time per <xref target="RFC8949"/> Section 3.4.2):
   the instant the authority signed the token.
   A conforming issuer <bcp14>MUST</bcp14> encode this as a
   CBOR unsigned integer number of seconds
   since the POSIX epoch; a verifier <bcp14>MUST</bcp14>
   reject a token whose issued_at is not an
   unsigned integer under tag 1 (fractional or
   negative values are rejected).
 - 5 = expires_at (CBOR tag-1 epoch-based
   date/time per <xref target="RFC8949"/> Section 3.4.2):
   the instant the token ceases to be
   admissible.  Same encoding constraints as
   issued_at.
 - 6 = token_id (CBOR byte string, 16 bytes):
   a nonce for replay detection.</t>
            </dd>
          </dl>
        </section>
        <section anchor="presentation-and-verification">
          <name>Presentation and Verification</name>
          <t>The metadata server presents the profile identifier
and the proof bytes together in the takeover
arguments (see <xref target="sec-CHUNK_ESCROW_TAKEOVER"/>).  The
data server <bcp14>MUST</bcp14> evaluate the takeover in a fixed
order so that no failure discloses state that a
prior check would have denied:</t>
          <ol spacing="normal" type="1"><li>
              <t>session replay-cache lookup: retransmission of a
prior request in the current session slot
returns the cached response;</t>
            </li>
            <li>
              <t>presenter authorization: RPCSEC_GSS presenter
authentication and credential check
(NFS4ERR_ACCESS if the caller lacks metadata-server
role);</t>
            </li>
            <li>
              <t>profile support: unknown proof_profile_id4
returns NFS4ERR_NOTSUPP;</t>
            </li>
            <li>
              <t>proof verification: the profile's signature and
payload checks are applied (NFS4ERR_ACCESS on
any failure -- bad signature, mismatched
principal, mismatched epoch, mismatched scope,
token past expires_at, or token_id already in
the data server's replay cache);</t>
            </li>
            <li>
              <t>epoch compare-and-advance: NFS4ERR_STALE_MDS_EPOCH
on mismatch, otherwise the epoch and
epoch_expires_at are advanced atomically per
<xref target="sec-CHUNK_ESCROW_TAKEOVER"/>.</t>
            </li>
          </ol>
          <t>The strict ordering ensures an unauthenticated
caller learns nothing about which profiles the data
server supports or which epoch it currently holds.</t>
          <t>Replay-cache scoping (both layers): the NFSv4.1
session replay cache in step 1 is scoped to the
session slot and its lifetime is bounded by session
liveness.  The token_id replay cache in step 4 is
scoped to the (proof_profile_id4, verified issuer)
pair and <bcp14>MUST</bcp14> be sized and expired coherently with
the token's own expires_at, so that a valid token
cannot be replayed after its natural expiry and a
recently-observed token cannot be inadvertently
retired while still admissible.  A data server <bcp14>MAY</bcp14>
persist the token_id replay cache across restart.
Loss of a cache entry (eviction, non-persisted
restart) does not permanently defeat lost-response
recovery: the byte-identical uncertain-completion
recovery path in
<xref target="sec-CHUNK_ESCROW_TAKEOVER-uncertain-completion"/>
covers the cache-miss form and returns the same
postcondition-equivalent NFS4_OK when the operation
had already completed.</t>
        </section>
        <section anchor="sec-CHUNK_ESCROW_TAKEOVER-uncertain-completion">
          <name>Uncertain-Completion Recovery for TAKEOVER</name>
          <t>CHUNK_ESCROW_TAKEOVER is the recovery
path a metadata server uses after an incarnation
change; the compare-and-advance semantics make the
successful case observable to the data server, but
the metadata server <bcp14>MAY</bcp14> lose the response to a
successful TAKEOVER (network drop, RPC
retransmission timeout, session loss).  The bare
strict-ordering rules above would rebuff a
byte-identical reissue: either the token_id
replay-cache check at step 4 rejects with
NFS4ERR_ACCESS (the cache still holds the entry) or
the epoch compare-and-advance at step 5 rejects
with NFS4ERR_STALE_MDS_EPOCH (the ordinary path,
because the reissue's ceta_expected_prior_epoch
names the pre-advance epoch that the earlier
successful TAKEOVER has already moved past).  In
either case the metadata server has no way to
distinguish "the prior TAKEOVER succeeded and the
response was lost" from "the proof is invalid."</t>
          <t>To close that recovery gap, a data server <bcp14>MUST</bcp14>
accept a byte-identical CHUNK_ESCROW_TAKEOVER
reissue as postcondition-equivalent success when
step 4's signature and payload checks succeed
(signature verifies against the deployment-provisioned
trust anchor; the signed principal,
scope, and epoch match; the token is within its
expires_at window; all per <xref target="sec-proof-profile"/>
"Payload map fields"), with the ordinary step-4
"token_id already in the replay cache" rejection
overridden as stated below, and both of the
following hold:</t>
          <ul spacing="normal">
            <li>
              <t>the reissue's ceta_new_epoch equals the data
server's currently-recorded metadata-server
epoch (the takeover the token authorized has
already completed); and</t>
            </li>
            <li>
              <t>the reissue's ceta_expected_prior_epoch is
strictly less than the reissue's ceta_new_epoch
(the token names a genuine advance, not a
no-op).</t>
            </li>
          </ul>
          <t>The recovery rule takes two forms distinguished by
the state of the token_id replay cache at the data
server:</t>
          <dl>
            <dt>Cache-hit form (ordinary lost-response case):</dt>
            <dd>
              <t>the token_id is present in the token_id replay cache.  The
data server recognizes the
cached byte-identical decision and returns the
cached NFS4_OK result; step 5 is not re-executed.
Cache-miss form (applies after eviction or non-persisted restart):</t>
            </dd>
            <dt/>
            <dd>
              <t>the token_id is not present in the replay cache.  The data
server
treats the presentation as a fresh byte-identical
proof under the two epoch predicates
above and does NOT execute step 5 (the epoch is
already at the post-advance state).</t>
            </dd>
          </dl>
          <t>Under these predicates the data server returns
NFS4_OK without side effect: the epoch and
epoch_expires_at are already at the post-advance
state, no state changes, and the second observation
is idempotent.  The rule is safe against a fresh
presentation of an already-used token by a
different party -- a different party would not
present the same proof bytes without stealing the
signer's key material, the token was issued to a
specific principal matched by step 4's principal
check, expiry admissibility windows for successor
principals do not overlap (<xref target="sec-proof-profile"/>
"Time-Related Bounds"), and a subsequent
successful TAKEOVER by any party advances the
current epoch past ceta_new_epoch and
disqualifies the reissue on the first predicate
above.</t>
          <t>When any predicate fails the data server returns
NFS4ERR_ACCESS or NFS4ERR_STALE_MDS_EPOCH per the
ordinary strict-ordering rule and the metadata
server <bcp14>MUST</bcp14> obtain a fresh incarnation-lease token
from the authority.  A fresh token has a new
token_id and does not collide with the replay
cache; the fresh takeover uses the ordinary
advance form.</t>
        </section>
        <section anchor="trust-anchor-provisioning">
          <name>Trust Anchor Provisioning</name>
          <t>The verification trust anchor (the public key or
key set the authority's signatures verify against)
is provisioned at each data server at deployment
time.  Key distribution mechanisms (X.509 chain,
JWK set fetch, raw public key push) are deployment
concerns outside the scope of this specification;
rotation is likewise deployment-local.  The wire
format is fully specified so that two independent
implementations sharing the same trust anchor can
interoperate; the trust-anchor bootstrap itself is
not a wire-negotiated step.</t>
        </section>
        <section anchor="time-related-bounds">
          <name>Time-Related Bounds</name>
          <t>The token's issued_at <bcp14>MUST NOT</bcp14> be more than
<tt>skew_tolerance</tt> in the future when the data server
evaluates it (deployment-configured; recommend
NTP-consistent, roughly 10 s).  The token's
expires_at is compared strictly: the token becomes
inadmissible at the first instant <tt>now &gt;=
expires_at</tt>.  No skew tolerance is added to the
right edge; the incarnation-lease authority <bcp14>MUST
NOT</bcp14> issue a successor token to a different
metadata-server principal until at least
<tt>prior.expires_at + max_ds_skew_tolerance</tt>, where
max_ds_skew_tolerance is a deployment-configured
bound that <bcp14>MUST</bcp14> equal or exceed the largest
skew_tolerance any data server in the scope is
allowed to use.  This ordering ensures that no
data server admits the prior holder at any instant
after the successor's token becomes admissible.</t>
        </section>
      </section>
      <section anchor="sec-checksum4">
        <name>checksum4</name>
        <figure anchor="fig-checksum4">
          <name>XDR for checksum4</name>
          <sourcecode type="xdr"><![CDATA[
   /// typedef uint32_t   checksum_algorithm4;
   ///
   /// const CHECKSUM_ALG_NONE      = 0;
   /// const CHECKSUM_ALG_CRC32     = 1;
   /// const CHECKSUM_ALG_CRC32C    = 2;
   /// const CHECKSUM_ALG_FLETCHER4 = 3;
   /// const CHECKSUM_ALG_SHA256    = 4;
   /// const CHECKSUM_ALG_SHA512    = 5;
   /// const CHECKSUM_ALG_BLAKE3    = 6;
   /// /* Additional values registered with IANA;
   ///    see Section "Checksum Algorithm Registry" in
   ///    the IANA Considerations. */
   ///
   /// struct checksum4 {
   ///     checksum_algorithm4   cs_algorithm;
   ///     opaque                cs_value<64>;
   /// };
]]></sourcecode>
        </figure>
        <t>The checksum4 (see <xref target="fig-checksum4"/>) is a tagged
checksum value used to detect transport corruption and
on-disk bit rot of chunk payloads.  Every chunk on the
wire and at rest carries a checksum4 alongside its
chunk_owner4.</t>
        <dl>
          <dt>cs_algorithm:</dt>
          <dd>
            <t>identifies the checksum algorithm.  The values
listed above are registered by this document; additional
values are managed by the IANA registry (see
"Checksum Algorithm Registry" in the IANA
Considerations section).  CHECKSUM_ALG_NONE indicates
the deployment relies on transport-layer (TLS, IPsec)
or storage-layer integrity instead of a protocol-level
per-chunk checksum.</t>
          </dd>
          <dt>cs_value:</dt>
          <dd>
            <t>the checksum bytes.  The length is fixed per registered
algorithm:
</t>
            <ul spacing="normal">
              <li>
                <t>CHECKSUM_ALG_NONE: 0 bytes.</t>
              </li>
              <li>
                <t>CHECKSUM_ALG_CRC32: 4 bytes.</t>
              </li>
              <li>
                <t>CHECKSUM_ALG_CRC32C: 4 bytes.</t>
              </li>
              <li>
                <t>CHECKSUM_ALG_FLETCHER4: 32 bytes (four 64-bit
accumulators, matching the ZFS Fletcher4 layout).</t>
              </li>
              <li>
                <t>CHECKSUM_ALG_SHA256: 32 bytes.</t>
              </li>
              <li>
                <t>CHECKSUM_ALG_SHA512: 64 bytes.</t>
              </li>
              <li>
                <t>CHECKSUM_ALG_BLAKE3: 32 bytes (BLAKE3 standard
output length).</t>
              </li>
            </ul>
            <t>A checksum4 whose cs_value length does not match the
registered length for cs_algorithm <bcp14>MUST</bcp14> be rejected
with NFS4ERR_INVAL.</t>
          </dd>
          <dt>Coverage:</dt>
          <dd>
            <t>Every registered algorithm covers the same input
bytes: the chunk's header immediately followed by the
chunk payload, in wire-transmission order, with the
bytes of the header's own checksum field (<tt>cs_value</tt>)
treated as zero for the duration of the computation.
After computing, the writer stores the resulting bytes
into <tt>cs_value</tt> for transmission and at-rest storage;
the reader saves the received <tt>cs_value</tt>, treats those
bytes as zero, recomputes over the same input, and
compares against the saved value.  Including the header
in coverage protects the per-chunk metadata
(<tt>payload_id</tt>, guard, owner, length fields) as well as
the payload; treating the checksum field as zero makes
the computation independent of the field's wire value
so the same input produces the same output on both
ends.  This coverage rule applies uniformly to every
registered <tt>cs_algorithm</tt>; individual registry entries
name the function and any function-specific parameters,
but do not restate the covered-bytes rule.</t>
          </dd>
        </dl>
        <t>The checksum algorithm for a given file is selected by
the metadata server at LAYOUTGET time and carried in
the layout (see <xref target="sec-ffv2-mirror4"/>).  A client that
does not implement the algorithm a layout names returns
the layout with NFS4ERR_LAYOUT_CHECKSUM_NOT_SUPPORTED
(<xref target="sec-NFS4ERR_LAYOUT_CHECKSUM_NOT_SUPPORTED"/>); the
metadata server may then offer a layout with a
different algorithm.</t>
      </section>
    </section>
    <section anchor="sec-new-ops">
      <name>New NFSv4.2 Operations</name>
      <figure anchor="fig-ops-xdr">
        <name>Operations XDR</name>
        <sourcecode type="xdr"><![CDATA[
   ///
   /// /* New operations for Erasure Coding start here */
   ///
   ///  OP_CHUNK_COMMIT        = 78,
   ///  OP_CHUNK_ERROR         = 79,
   ///  OP_CHUNK_FINALIZE      = 80,
   ///  OP_CHUNK_HEADER_READ   = 81,
   ///  OP_CHUNK_LOCK          = 82,
   ///  OP_CHUNK_READ          = 83,
   ///  OP_CHUNK_REPAIRED      = 84,
   ///  OP_CHUNK_ROLLBACK      = 85,
   ///  OP_CHUNK_UNLOCK        = 86,
   ///  OP_CHUNK_WRITE         = 87,
   ///  OP_CHUNK_WRITE_REPAIR  = 88,
   ///
   /// /* metadata-server-to-data-server control-plane
   ///  * operations for tight coupling
   ///  */
   ///
   ///  OP_TRUST_STATEID       = 89,
   ///  OP_REVOKE_STATEID      = 90,
   ///  OP_BULK_REVOKE_STATEID = 91,
   ///
   /// /* metadata-server-side escrow control-plane operations */
   ///
   ///  OP_CHUNK_ESCROW_INSTALL   = 92,
   ///  OP_CHUNK_ESCROW_RELEASE   = 93,
   ///  OP_CHUNK_ESCROW_ENUMERATE = 94,
   ///  OP_CHUNK_ESCROW_TAKEOVER  = 95,
   ///
]]></sourcecode>
      </figure>
      <t>The following amendment blocks extend the nfs_argop4 and
nfs_resop4 dispatch unions defined in <xref target="RFC7863"/> with arms for
each of the new operations defined in this document.  A consumer
that combines this document's extracted XDR with the RFC 7863
XDR applies these amendments at the union's extension point.</t>
      <figure anchor="fig-nfs_argop4-amend">
        <name>nfs_argop4 amendment block</name>
        <sourcecode type="xdr"><![CDATA[
   /// /* nfs_argop4 amendment block */
   ///
   /// case OP_CHUNK_COMMIT: CHUNK_COMMIT4args opchunkcommit;
   /// case OP_CHUNK_ERROR: CHUNK_ERROR4args opchunkerror;
   /// case OP_CHUNK_FINALIZE: CHUNK_FINALIZE4args opchunkfinalize;
   /// case OP_CHUNK_HEADER_READ:
   ///     CHUNK_HEADER_READ4args opchunkheaderread;
   /// case OP_CHUNK_LOCK: CHUNK_LOCK4args opchunklock;
   /// case OP_CHUNK_READ: CHUNK_READ4args opchunkread;
   /// case OP_CHUNK_REPAIRED: CHUNK_REPAIRED4args opchunkrepaired;
   /// case OP_CHUNK_ROLLBACK: CHUNK_ROLLBACK4args opchunkrollback;
   /// case OP_CHUNK_UNLOCK: CHUNK_UNLOCK4args opchunkunlock;
   /// case OP_CHUNK_WRITE: CHUNK_WRITE4args opchunkwrite;
   /// case OP_CHUNK_WRITE_REPAIR:
   ///     CHUNK_WRITE_REPAIR4args opchunkwriterepair;
   /// case OP_TRUST_STATEID: TRUST_STATEID4args optruststateid;
   /// case OP_REVOKE_STATEID: REVOKE_STATEID4args oprevokestateid;
   /// case OP_BULK_REVOKE_STATEID:
   ///     BULK_REVOKE_STATEID4args opbulkrevokestateid;
   /// case OP_CHUNK_ESCROW_INSTALL:
   ///     CHUNK_ESCROW_INSTALL4args opchunkescrowinstall;
   /// case OP_CHUNK_ESCROW_RELEASE:
   ///     CHUNK_ESCROW_RELEASE4args opchunkescrowrelease;
   /// case OP_CHUNK_ESCROW_ENUMERATE:
   ///     CHUNK_ESCROW_ENUMERATE4args opchunkescrowenumerate;
   /// case OP_CHUNK_ESCROW_TAKEOVER:
   ///     CHUNK_ESCROW_TAKEOVER4args opchunkescrowtakeover;
]]></sourcecode>
      </figure>
      <figure anchor="fig-nfs_resop4-amend">
        <name>nfs_resop4 amendment block</name>
        <sourcecode type="xdr"><![CDATA[
   /// /* nfs_resop4 amendment block */
   ///
   /// case OP_CHUNK_COMMIT: CHUNK_COMMIT4res opchunkcommit;
   /// case OP_CHUNK_ERROR: CHUNK_ERROR4res opchunkerror;
   /// case OP_CHUNK_FINALIZE: CHUNK_FINALIZE4res opchunkfinalize;
   /// case OP_CHUNK_HEADER_READ:
   ///     CHUNK_HEADER_READ4res opchunkheaderread;
   /// case OP_CHUNK_LOCK: CHUNK_LOCK4res opchunklock;
   /// case OP_CHUNK_READ: CHUNK_READ4res opchunkread;
   /// case OP_CHUNK_REPAIRED: CHUNK_REPAIRED4res opchunkrepaired;
   /// case OP_CHUNK_ROLLBACK: CHUNK_ROLLBACK4res opchunkrollback;
   /// case OP_CHUNK_UNLOCK: CHUNK_UNLOCK4res opchunkunlock;
   /// case OP_CHUNK_WRITE: CHUNK_WRITE4res opchunkwrite;
   /// case OP_CHUNK_WRITE_REPAIR:
   ///     CHUNK_WRITE_REPAIR4res opchunkwriterepair;
   /// case OP_TRUST_STATEID: TRUST_STATEID4res optruststateid;
   /// case OP_REVOKE_STATEID: REVOKE_STATEID4res oprevokestateid;
   /// case OP_BULK_REVOKE_STATEID:
   ///     BULK_REVOKE_STATEID4res opbulkrevokestateid;
   /// case OP_CHUNK_ESCROW_INSTALL:
   ///     CHUNK_ESCROW_INSTALL4res opchunkescrowinstall;
   /// case OP_CHUNK_ESCROW_RELEASE:
   ///     CHUNK_ESCROW_RELEASE4res opchunkescrowrelease;
   /// case OP_CHUNK_ESCROW_ENUMERATE:
   ///     CHUNK_ESCROW_ENUMERATE4res opchunkescrowenumerate;
   /// case OP_CHUNK_ESCROW_TAKEOVER:
   ///     CHUNK_ESCROW_TAKEOVER4res opchunkescrowtakeover;
]]></sourcecode>
      </figure>
      <t>Operations 78 through 88 (the CHUNK operations) are sent by
clients to storage devices on the data path.  Operations 89
through 91 (TRUST_STATEID, REVOKE_STATEID, BULK_REVOKE_STATEID)
and operations 92 through 95 (CHUNK_ESCROW_INSTALL,
CHUNK_ESCROW_RELEASE, CHUNK_ESCROW_ENUMERATE,
CHUNK_ESCROW_TAKEOVER) are sent by the metadata server to
storage devices on the metadata-server-to-data-server control session (see
<xref target="sec-tight-coupling-control-session"/>); they <bcp14>MUST NOT</bcp14> be sent by
pNFS clients.  The escrow control-plane operations (92 through
95) are available on the metadata-server-to-data-server control session under either
loose- or tight coupling deployment; the tight coupling section
is cited for its description of the session itself, not to
restrict availability to the tight coupling profile.</t>
      <t>All CHUNK operations <bcp14>MUST</bcp14> be issued under an active flexible
file v2 layout obtained via LAYOUTGET against the metadata
server.  Because encodings that use CHUNK operations require tight coupling (see
the three constraints in <xref target="sec-ff_device_addr4"/>), the presented
stateid is the tight coupling registered layout stateid, and the
data server <bcp14>MUST</bcp14> validate it against its per-file trust table:
a stateid not present in the trust table <bcp14>MUST</bcp14> be rejected with
NFS4ERR_BAD_STATEID per <xref target="sec-TRUST_STATEID"/>.  The anonymous
stateid is reserved for PASSTHROUGH mirrors under loose coupling
(<xref target="sec-encoding-negotiation"/>) and <bcp14>MUST NOT</bcp14> appear on a CHUNK
operation; a data server receiving a CHUNK operation with the
anonymous stateid <bcp14>MUST</bcp14> reject it with NFS4ERR_BAD_STATEID.</t>
      <t>The chunk envelope's safety properties (atomicity via
chunk_guard4 CAS, integrity via checksum, lock continuity across
revocation) depend on metadata-server coordination of layout
grants, guard generation, and lock escrow.  A client that
issues CHUNK operations without an active chunked-encoding
layout has no chunked-layout stateid to present; whatever
stateid it does send (anonymous, open, lock, forged, expired)
is rejected by the data server's normal stateid validation
per <xref section="8.2" sectionFormat="of" target="RFC8881"/>, typically with NFS4ERR_BAD_STATEID
(or NFS4ERR_STALE_STATEID or NFS4ERR_OLD_STATEID as
appropriate).  See <xref target="sec-system-model-chunk-not-block"/> for the
distinction between the CHUNK operations and a generic block I/O
interface.</t>
      <table anchor="tbl-protocol-ops">
        <name>Protocol OPs</name>
        <thead>
          <tr>
            <th align="left">Operation</th>
            <th align="left">Number</th>
            <th align="left">Target Server</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">CHUNK_COMMIT</td>
            <td align="left">78</td>
            <td align="left">data server (client)</td>
            <td align="left">
              <xref target="sec-CHUNK_COMMIT"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_ERROR</td>
            <td align="left">79</td>
            <td align="left">data server (client)</td>
            <td align="left">
              <xref target="sec-CHUNK_ERROR"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_FINALIZE</td>
            <td align="left">80</td>
            <td align="left">data server (client)</td>
            <td align="left">
              <xref target="sec-CHUNK_FINALIZE"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_HEADER_READ</td>
            <td align="left">81</td>
            <td align="left">data server (client)</td>
            <td align="left">
              <xref target="sec-CHUNK_HEADER_READ"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_LOCK</td>
            <td align="left">82</td>
            <td align="left">data server (client)</td>
            <td align="left">
              <xref target="sec-CHUNK_LOCK"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_READ</td>
            <td align="left">83</td>
            <td align="left">data server (client)</td>
            <td align="left">
              <xref target="sec-CHUNK_READ"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_REPAIRED</td>
            <td align="left">84</td>
            <td align="left">data server (client)</td>
            <td align="left">
              <xref target="sec-CHUNK_REPAIRED"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_ROLLBACK</td>
            <td align="left">85</td>
            <td align="left">data server (client)</td>
            <td align="left">
              <xref target="sec-CHUNK_ROLLBACK"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_UNLOCK</td>
            <td align="left">86</td>
            <td align="left">data server (client)</td>
            <td align="left">
              <xref target="sec-CHUNK_UNLOCK"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_WRITE</td>
            <td align="left">87</td>
            <td align="left">data server (client)</td>
            <td align="left">
              <xref target="sec-CHUNK_WRITE"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_WRITE_REPAIR</td>
            <td align="left">88</td>
            <td align="left">data server (client)</td>
            <td align="left">
              <xref target="sec-CHUNK_WRITE_REPAIR"/></td>
          </tr>
          <tr>
            <td align="left">TRUST_STATEID</td>
            <td align="left">89</td>
            <td align="left">data server (metadata server control)</td>
            <td align="left">
              <xref target="sec-TRUST_STATEID"/></td>
          </tr>
          <tr>
            <td align="left">REVOKE_STATEID</td>
            <td align="left">90</td>
            <td align="left">data server (metadata server control)</td>
            <td align="left">
              <xref target="sec-REVOKE_STATEID"/></td>
          </tr>
          <tr>
            <td align="left">BULK_REVOKE_STATEID</td>
            <td align="left">91</td>
            <td align="left">data server (metadata server control)</td>
            <td align="left">
              <xref target="sec-BULK_REVOKE_STATEID"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_ESCROW_INSTALL</td>
            <td align="left">92</td>
            <td align="left">data server (metadata server control)</td>
            <td align="left">
              <xref target="sec-CHUNK_ESCROW_INSTALL"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_ESCROW_RELEASE</td>
            <td align="left">93</td>
            <td align="left">data server (metadata server control)</td>
            <td align="left">
              <xref target="sec-CHUNK_ESCROW_RELEASE"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_ESCROW_ENUMERATE</td>
            <td align="left">94</td>
            <td align="left">data server (metadata server control)</td>
            <td align="left">
              <xref target="sec-CHUNK_ESCROW_ENUMERATE"/></td>
          </tr>
          <tr>
            <td align="left">CHUNK_ESCROW_TAKEOVER</td>
            <td align="left">95</td>
            <td align="left">data server (metadata server control)</td>
            <td align="left">
              <xref target="sec-CHUNK_ESCROW_TAKEOVER"/></td>
          </tr>
        </tbody>
      </table>
      <section anchor="sec-chunk-op-bounds">
        <name>Bounds on Chunk-Operation Arrays</name>
        <t>The chunk-lifecycle operations (CHUNK_WRITE, CHUNK_WRITE_REPAIR,
CHUNK_READ, CHUNK_FINALIZE, CHUNK_COMMIT, CHUNK_ROLLBACK,
CHUNK_LOCK, CHUNK_UNLOCK, CHUNK_ERROR, CHUNK_REPAIRED,
CHUNK_HEADER_READ) carry variable-length arrays of chunks,
owners, status codes, checksums, and payloads.  To bound
allocation and to guarantee that a valid request always has an
encodable response, this document defines the following
protocol maxima:</t>
        <figure anchor="fig-chunk-op-bounds">
          <name>Chunk-operation array maxima</name>
          <sourcecode type="xdr"><![CDATA[
   ///
   /// const CHUNK_MAX_CHUNKS_PER_OP     = 4096;
   /// const CHUNK_MAX_PAYLOAD_BYTES     = 4194304;
   /// const CHUNK_MAX_CHECKSUMS_PER_OP  = 4096;
   /// const CHUNK_MAX_OWNERS_PER_OP     = 4096;
   /// const CHUNK_MAX_STATUS_PER_OP     = 4096;
   ///
]]></sourcecode>
        </figure>
        <t><tt>CHUNK_MAX_CHUNKS_PER_OP</tt> is the maximum number of chunks
addressed by a single CHUNK_WRITE, CHUNK_WRITE_REPAIR,
CHUNK_READ, CHUNK_FINALIZE, CHUNK_COMMIT, CHUNK_ROLLBACK, or
CHUNK_LOCK request; it bounds cwa_co_ids, cra_ranges, cca_chunks,
cfa_chunks, cra_chunks (CHUNK_ROLLBACK), and the equivalent
arrays in the other operations.  <tt>CHUNK_MAX_PAYLOAD_BYTES</tt>
bounds the aggregate opaque payload (cwa_chunks, cwra_chunks,
and the concatenated cr_chunk bytes returned in
CHUNK_READ4resok).  <tt>CHUNK_MAX_CHECKSUMS_PER_OP</tt>,
<tt>CHUNK_MAX_OWNERS_PER_OP</tt>, and <tt>CHUNK_MAX_STATUS_PER_OP</tt> bound
the co-indexed result and argument arrays with matching
cardinality; each <bcp14>MUST</bcp14> equal the request's chunk count on
success, and <bcp14>MUST</bcp14> be present with the requested cardinality on
failures for positional correlation.</t>
        <t>A data server <bcp14>MUST</bcp14> reject a request whose array length exceeds
any of these maxima with NFS4ERR_INVAL before performing any
mutation.  A data server <bcp14>MUST</bcp14> also verify, before performing
any mutation, that the response it will construct fits within
the session's negotiated <tt>ca_maxresponsesize</tt> (<xref section="18.36" sectionFormat="of" target="RFC8881"/>); if the mandatory response arrays (per-chunk status,
per-chunk owner, per-chunk checksum, and payload where applicable)
would exceed <tt>ca_maxresponsesize</tt>, the data server <bcp14>MUST</bcp14> reject with
NFS4ERR_TOOSMALL and <bcp14>MUST NOT</bcp14> partially process the request.  The
client is expected to split the request across multiple compounds when
either bound is reached.</t>
        <t>Short processing (a data server returning fewer chunks than
requested at its discretion) is NOT permitted for the
lifecycle operations because the co-indexed result arrays would
lose positional correlation.  A data server that cannot process
all requested chunks <bcp14>MUST</bcp14> reject the entire request rather than
partially serve it.  The rejection uses one of the errors
already defined for the two capacity-limit paths above --
NFS4ERR_INVAL when the request array length exceeds a
CHUNK_MAX_* bound, NFS4ERR_TOOSMALL when the response would
exceed the session-negotiated ca_maxresponsesize
(<xref section="18.36" sectionFormat="of" target="RFC8881"/>), or NFS4ERR_DELAY when the data
server is out of transient resources to process the requested
batch -- and the entire request is a no-op with respect to
mutation.</t>
        <t>On receiving any of these rejections, a client that wishes to
retry <bcp14>SHOULD</bcp14> halve the batch size and retry, subject to the
static maxima in <xref target="fig-chunk-op-bounds"/> and the session's
ca_maxresponsesize.  A client that has already reduced the
batch to a single chunk and continues to see the rejection
<bcp14>MUST</bcp14> escalate via LAYOUTERROR rather than retry unbounded.</t>
      </section>
      <section anchor="sec-CHUNK_COMMIT">
        <name>Operation 78: CHUNK_COMMIT - Activate Cached Chunk Data</name>
        <section anchor="arguments">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_COMMIT4args">
            <name>XDR for CHUNK_COMMIT4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_COMMIT4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4        cca_stateid;
   ///     offset4         cca_offset;
   ///     count4          cca_count;
   ///     chunk_owner4    cca_chunks<>;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_COMMIT4resok">
            <name>XDR for CHUNK_COMMIT4resok</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_COMMIT4resok {
   ///     verifier4       ccr_writeverf;
   ///     nfsstat4        ccr_status<>;
   /// };
]]></sourcecode>
          </figure>
          <figure anchor="fig-CHUNK_COMMIT4res">
            <name>XDR for CHUNK_COMMIT4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_COMMIT4res switch (nfsstat4 ccr_status) {
   ///     case NFS4_OK:
   ///         CHUNK_COMMIT4resok   ccr_resok4;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description">
          <name>DESCRIPTION</name>
          <t>The CHUNK_COMMIT operation is based upon the NFSv4.1 COMMIT
operation (see <xref section="18.3" sectionFormat="of" target="RFC8881"/>) and similarly
commits previously written data to stable storage on the
regular file identified by the current filehandle, with the
difference that CHUNK_COMMIT operates on the chunk
coordinate system used by Flexible File Version 2 layouts
rather than on the byte coordinate system, and that
CHUNK_COMMIT advances each named chunk through the chunk
state machine from FINALIZED to COMMITTED
(<xref target="fig-chunk-state-machine"/>) rather than acting on a byte
range without a state-machine context.</t>
          <t>The client provides cca_offset and cca_count to bound the
chunk range, and cca_chunks to name the specific
(chunk_owner4) generations within that range to commit:</t>
          <dl>
            <dt>cca_offset:</dt>
            <dd>
              <t>starting chunk index in the file (not a byte offset).</t>
            </dd>
            <dt>cca_count:</dt>
            <dd>
              <t>number of chunks the range covers, starting at
cca_offset.  When cca_count is zero, the client <bcp14>MUST</bcp14>
also supply an empty cca_chunks array, and the data
server returns NFS4_OK with an empty ccr_status array.
A cca_offset beyond the data server's highest chunk
with a non-zero cca_count is not itself an error at the
operation level: the data server evaluates each
cca_chunks entry per its normal per-entry rules and
returns the co-indexed ccr_status.</t>
            </dd>
            <dt>cca_chunks:</dt>
            <dd>
              <t>an array of chunk_owner4 entries
(<xref target="fig-chunk_owner4"/>) naming the specific generations to
commit.  For each entry the data server looks up the
chunk index it associated with the complete
owner triple when the
client wrote it via CHUNK_WRITE or
CHUNK_WRITE_REPAIR.  That recorded chunk index <bcp14>MUST</bcp14>
lie in [cca_offset, cca_offset + cca_count); if the
triple does not match any recorded owner association
on this data server for this file, or the recorded
chunk index lies outside the requested range, the
entry is rejected with NFS4ERR_INVAL in the
corresponding ccr_status slot.  The reserved sentinels
CHUNK_GUARD_CLIENT_ID_NONE and CHUNK_GUARD_CLIENT_ID_MDS
<bcp14>MUST NOT</bcp14> appear as the co_client_id of any cca_chunks
entry; see <xref target="sec-chunk_guard_none"/> and
<xref target="sec-chunk_guard_mds"/>.</t>
            </dd>
          </dl>
          <t>cca_offset and cca_count are NOT redundant with
cca_chunks: the owner triples in cca_chunks name specific
generations (which the data server correlates via its
recorded owner-to-index association), while cca_offset
and cca_count bound the intended chunk-index scope of the
operation.  A chunk index <bcp14>MAY</bcp14> have multiple persisted
generations at the moment CHUNK_COMMIT arrives -- an
older COMMITTED generation retained for the rollback
invariant (<xref target="sec-system-model-consistency"/>) alongside a
newer FINALIZED successor.  cca_chunks selects which
owner triple to advance to
COMMITTED at each affected index; cca_offset and
cca_count let the data server reject malformed requests
that name generations whose recorded chunk index lies
outside the intended commit window.</t>
          <t>The CHUNK_COMMIT result reports the outcome per chunk in
the same order as cca_chunks:</t>
          <dl>
            <dt>ccr_writeverf:</dt>
            <dd>
              <t>a verifier identifying the data server's incarnation
at the time the commit completed.  A client compares
ccr_writeverf to the cwr_writeverf returned by the
prior CHUNK_WRITE to detect a
data server restart that lost UNSTABLE4 writes
between the write and the commit; on a mismatch the
client <bcp14>MUST</bcp14> re-issue the CHUNK_WRITE before any
committed bytes are considered durable.
ccr_writeverf changes on every data server restart
that loses uncommitted state.</t>
            </dd>
            <dt>ccr_status:</dt>
            <dd>
              <t>per-chunk commit status, one entry per cca_chunks
entry, co-indexed.  NFS4_OK indicates that the named
chunk is COMMITTED on return.  Other per-entry
failure codes are described in
"Interaction with CHUNK_FINALIZE" and "Interaction
with a Locked Chunk" below.  The top-level
CHUNK_COMMIT status is NFS4_OK as long as the data
server could evaluate each cca_chunks entry;
per-chunk failures are reported in ccr_status rather
than by failing the whole operation.  The top-level
status returns a non-OK code only when the request
could not be evaluated at all.</t>
            </dd>
          </dl>
          <t>Like CHUNK_READ and CHUNK_WRITE, CHUNK_COMMIT carries an explicit
layout stateid in cca_stateid.  The data server authorizes
CHUNK_COMMIT by validating cca_stateid against the file
identified by the current filehandle: cca_stateid <bcp14>MUST</bcp14> be
the layout stateid the metadata server issued to the
caller for the current filehandle, or the special anonymous
stateid (see below).  Under trusted stateid tight coupling
(<xref target="sec-TRUST_STATEID"/>), the data server rejects
CHUNK_COMMIT with NFS4ERR_BAD_STATEID unless cca_stateid
is present in the data server's trust table for the
current filehandle.  The explicit field ensures that a
CHUNK_COMMIT in its own standalone compound (typical for
recovery and pipelined lifecycle operations) carries the
authorization the data server needs without depending on
any prior operation's implicit state.  Passing the special
anonymous stateid is permitted only when the underlying
security regime authorizes an unattributed writer (that is,
when tight coupling is not in force and the deployment's
access-control policy permits it).</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
          <section anchor="interaction-with-chunkfinalize">
            <name>Interaction with CHUNK_FINALIZE</name>
            <t>CHUNK_COMMIT transitions a chunk from FINALIZED to COMMITTED
(see <xref target="sec-system-model-chunk-state"/>).  A chunk <bcp14>MUST</bcp14> have
previously been transitioned from PENDING to FINALIZED via
CHUNK_FINALIZE before CHUNK_COMMIT is accepted:</t>
            <ul spacing="normal">
              <li>
                <t>If the target chunk is PENDING (i.e., the writer never
issued CHUNK_FINALIZE), the data server <bcp14>MUST</bcp14> reject the
CHUNK_COMMIT entry for that chunk with
NFS4ERR_PAYLOAD_NOT_ATOMIC in the corresponding
ccr_status slot.  The writer is expected to either issue
CHUNK_FINALIZE to advance the state or CHUNK_ROLLBACK to
abandon the PENDING generation.</t>
              </li>
              <li>
                <t>If the target chunk is EMPTY (no generation to commit), the
data server <bcp14>MUST</bcp14> reject with NFS4ERR_PAYLOAD_NOT_ATOMIC
for that chunk.</t>
              </li>
            </ul>
            <t>The two rejection cases above share the error code because
the client's local bookkeeping distinguishes them without
requiring the data server to differentiate.  A client with
intact local state that recognizes it holds a PENDING
generation for the chunk calls CHUNK_FINALIZE; a client with
no local record calls CHUNK_HEADER_READ to inspect the
chunk's actual state (owner triple, disposition) and
reconcile from there.</t>
            <ul spacing="normal">
              <li>
                <t>If the target chunk is already COMMITTED at the generation
identified by the cca_chunks entry's owner triple, the
CHUNK_COMMIT is idempotent and <bcp14>MUST</bcp14> succeed.  Idempotence
preserves the NFSv4 COMMIT contract for duplicate-request
retransmission.</t>
              </li>
              <li>
                <t>If the target chunk is FINALIZED at a different generation
than the one named in the cca_chunks entry, the data server
<bcp14>MUST</bcp14> reject with NFS4ERR_CHUNK_GUARDED.  A client that sees
this has lost a race and <bcp14>SHOULD</bcp14> re-read the chunk (see
<xref target="sec-chunk_guard4"/>).</t>
              </li>
            </ul>
          </section>
          <section anchor="pipelining-considerations">
            <name>Pipelining Considerations</name>
            <t>The three-step CHUNK_WRITE -&gt; CHUNK_FINALIZE -&gt; CHUNK_COMMIT
sequence <bcp14>MAY</bcp14> be pipelined within a single NFSv4.2 compound
(see <xref section="12.8" sectionFormat="of" target="RFC8881"/>) in single writer mode, where
no other writer can race the client's per-chunk transitions
and the CHUNK_WRITE per-block status array reports only
local-failure cases (NFS4ERR_NOSPC, NFS4ERR_IO, and so on).</t>
            <t>Same-compound pipelining is <bcp14>NOT RECOMMENDED</bcp14> in multiple-writer
mode.  CHUNK_WRITE reports per-block outcomes in cwr_block_status
(<xref target="sec-CHUNK_WRITE"/>); a partial-success outcome (some chunks
accepted, others rejected with NFS4ERR_CHUNK_GUARDED on a lost
race) leaves the client without an opportunity to react before
a same-compound CHUNK_FINALIZE / CHUNK_COMMIT proceeds against
whichever chunks happen to be PENDING.  The compound-level
status is NFS4_OK in this case because per-block failures are
reported in the per-op status array rather than as a compound-level
error, so NFSv4 compound short-circuit (<xref section="2.10.6.4" sectionFormat="of" target="RFC8881"/>) does not stop the trailing ops.  A client that wants
atomic-or-none semantics across multiple chunks <bcp14>MUST</bcp14> examine the
per-block status returned by each CHUNK_WRITE before issuing the
corresponding CHUNK_FINALIZE.</t>
            <t>For multi-chunk pipelines in multiple-writer mode, the
recommended pattern is to stagger the three steps across
compounds so each trailing operation acts only on chunks whose
preceding operation's status the client has already inspected:</t>
            <figure anchor="fig-staggered-chunk-pipeline">
              <name>Staggered three-stage chunk pipeline (multiple-writer mode)</name>
              <artwork><![CDATA[
Compound A:  SEQUENCE PUTFH CHUNK_WRITE(a)
Compound B:  SEQUENCE PUTFH CHUNK_WRITE(b) CHUNK_FINALIZE(a)
Compound C:  SEQUENCE PUTFH CHUNK_WRITE(c) CHUNK_FINALIZE(b)
                              CHUNK_COMMIT(a)
Compound D:  SEQUENCE PUTFH CHUNK_WRITE(d) CHUNK_FINALIZE(c)
                              CHUNK_COMMIT(b)
...
]]></artwork>
            </figure>
            <t>In each compound, the CHUNK_WRITE acts on the trailing chunk
the client wants to enqueue next; the CHUNK_FINALIZE operates
on a chunk whose CHUNK_WRITE the client has already inspected
in a previous compound; the CHUNK_COMMIT operates on a chunk
whose CHUNK_FINALIZE the client has already inspected.  If
any per-block status in compound N reports a guard loss or
other failure, the client abandons the affected chunk (via
CHUNK_ROLLBACK in compound N + 1 or later) without ever issuing
the trailing FINALIZE / COMMIT for it.</t>
            <t>This pattern adds two compounds of latency between a chunk's
write and its commit (one for the FINALIZE wait, one for the
COMMIT wait), but provides the client with the per-step
inspection point required for atomic-or-none multi-chunk
writes under contention.</t>
          </section>
          <section anchor="interaction-with-a-locked-chunk">
            <name>Interaction with a Locked Chunk</name>
            <t>When a chunk is locked via CHUNK_LOCK (see <xref target="sec-CHUNK_LOCK"/>),
CHUNK_COMMIT is permitted only when the submitter owns the
lock -- that is, when the stateid carried on the compound
matches the lock holder's stateid (or is an
CHUNK_LOCK_FLAGS_ADOPT-transferred continuation):</t>
            <ul spacing="normal">
              <li>
                <t>The owning writer <bcp14>MAY</bcp14> issue CHUNK_COMMIT; the chunk
transitions from FINALIZED to COMMITTED normally.</t>
              </li>
              <li>
                <t>A non-owning client <bcp14>MUST</bcp14> receive NFS4ERR_CHUNK_LOCKED in
the corresponding ccr_status slot.  The chunk's state is
not changed.</t>
              </li>
              <li>
                <t>During repair, the metadata-server escrow owner
(CHUNK_GUARD_CLIENT_ID_MDS, see <xref target="sec-chunk_guard_mds"/>)
holds the lock while the repair actor adopts it via
CHUNK_LOCK_FLAGS_ADOPT.  CHUNK_COMMIT during the escrow
window is permitted only to the holder of the adopted
lock.</t>
              </li>
            </ul>
            <t>This rule is what <xref target="sec-system-model-consistency"/> calls
"lock continuity across revocation": the COMMIT privilege
follows the lock without gaps in which a non-owner could race.</t>
          </section>
        </section>
        <section anchor="response-codes">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>every named chunk transitioned to COMMITTED.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the layout stateid or credentials are not
permitted to commit on this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>no active layout stateid for this file (or, in trusted stateid
tight coupling, the stateid is not in the trust table).  See
<xref target="sec-new-ops"/>.</t>
            </dd>
            <dt>NFS4ERR_DELAY:</dt>
            <dd>
              <t>the data server is temporarily unable to process
the request.</t>
            </dd>
            <dt>NFS4ERR_FHEXPIRED:</dt>
            <dd>
              <t>the current filehandle has expired.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>arguments named chunks outside the file's mirror
set or in a non-atomic state.</t>
            </dd>
            <dt>NFS4ERR_IO:</dt>
            <dd>
              <t>an I/O error occurred while persisting the commit.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement CHUNK_COMMIT.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
            <dt>NFS4ERR_STALE:</dt>
            <dd>
              <t>the current filehandle no longer identifies a
valid file.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_ERROR">
        <name>Operation 79: CHUNK_ERROR - Report Error on Cached Chunk Data</name>
        <section anchor="arguments-1">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_ERROR4args">
            <name>XDR for CHUNK_ERROR4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_ERROR4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4        cea_stateid;
   ///     offset4         cea_offset;
   ///     count4          cea_count;
   ///     nfsstat4        cea_error;
   ///     chunk_owner4    cea_owner;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-1">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_ERROR4res">
            <name>XDR for CHUNK_ERROR4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_ERROR4res {
   ///     nfsstat4        cer_status;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-1">
          <name>DESCRIPTION</name>
          <t>CHUNK_ERROR allows a client that has detected corruption or
inconsistency in a chunk to report the condition to the data
server, so that the data server can mark the affected chunks
as errored.  Errored chunks are excluded from subsequent
CHUNK_READ responses until they are repaired via
CHUNK_WRITE_REPAIR and the
repair is confirmed via CHUNK_REPAIRED.</t>
          <t>CHUNK_ERROR has no direct analog in <xref target="RFC8881"/>.  The closest
parallel is LAYOUTERROR (<xref section="15.6" sectionFormat="of" target="RFC7862"/>), which
reports layout-level errors to the metadata server.
CHUNK_ERROR is the data-path counterpart: it reports a
chunk-level integrity finding directly to the data server so
that the corrupted chunks are quarantined before the
metadata server has had time to coordinate repair.  A client
<bcp14>SHOULD</bcp14> issue CHUNK_ERROR to the data server holding the bad
chunks before issuing LAYOUTERROR to the metadata server.</t>
          <t>The client provides:</t>
          <dl>
            <dt>cea_stateid:</dt>
            <dd>
              <t>the layout stateid the metadata server granted for
this file.  Under trusted stateid tight coupling
(<xref target="sec-TRUST_STATEID"/>), this stateid <bcp14>MUST</bcp14> be in the
data server's trust table; otherwise the data server
rejects the operation with NFS4ERR_BAD_STATEID.</t>
            </dd>
            <dt>cea_offset:</dt>
            <dd>
              <t>starting chunk index of the affected range (not a byte
offset).</t>
            </dd>
            <dt>cea_count:</dt>
            <dd>
              <t>number of chunks the affected range covers, starting at
cea_offset.</t>
            </dd>
            <dt>cea_error:</dt>
            <dd>
              <t>the nfsstat4 error code that describes the integrity
finding.  Typical values include
NFS4ERR_PAYLOAD_NOT_ATOMIC (the chunk's persisted checksum
or guard did not match the value the client expected),
NFS4ERR_IO (the client's CHUNK_READ returned an I/O
error from this data server), and NFS4ERR_INVAL (the
chunk's chunk_owner4 did not match the expected
generation across mirrors).  The data server <bcp14>MAY</bcp14> record
the supplied error code in operator logs but does not
otherwise interpret it; the chunk-level effect (mark
errored) is the same for any cea_error value.</t>
            </dd>
            <dt>cea_owner:</dt>
            <dd>
              <t>the chunk_owner4 (<xref target="fig-chunk_owner4"/>) the client read
when it observed the error, so the data server can
record which owner triple generation was
reported as corrupted.  The reserved sentinels
CHUNK_GUARD_CLIENT_ID_NONE and
CHUNK_GUARD_CLIENT_ID_MDS <bcp14>MUST NOT</bcp14> appear in
cea_owner; see <xref target="sec-chunk_guard_none"/> and
<xref target="sec-chunk_guard_mds"/>.</t>
            </dd>
          </dl>
          <t>CHUNK_ERROR returns a single top-level status in cer_status;
there is no per-chunk status array because the data server
either accepts the report for the whole range or returns a
top-level error.  Once a CHUNK_ERROR has been accepted, the
affected chunks transition into the errored state described
in <xref target="sec-system-model-chunk-state"/>; subsequent CHUNK_READ
operations against those chunks return
NFS4ERR_PAYLOAD_NOT_ATOMIC in the per-chunk cr_status slot
until a successful CHUNK_REPAIRED sequence clears the
errored flag.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
        </section>
        <section anchor="response-codes-1">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the client's chunk error report has been recorded.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the layout stateid or credentials are not
permitted to report errors on this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>no active layout stateid for this file (or, in trusted stateid
tight coupling, the stateid is not in the trust table).  See
<xref target="sec-new-ops"/>.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>the reported chunk range or error code was not
recognized.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement CHUNK_ERROR.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_FINALIZE">
        <name>Operation 80: CHUNK_FINALIZE - Transition Chunks from Pending to Finalized</name>
        <section anchor="arguments-2">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_FINALIZE4args">
            <name>XDR for CHUNK_FINALIZE4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_FINALIZE4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4        cfa_stateid;
   ///     offset4         cfa_offset;
   ///     count4          cfa_count;
   ///     chunk_owner4    cfa_chunks<>;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-2">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_FINALIZE4resok">
            <name>XDR for CHUNK_FINALIZE4resok</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_FINALIZE4resok {
   ///     verifier4       cfr_writeverf;
   ///     nfsstat4        cfr_status<>;
   /// };
]]></sourcecode>
          </figure>
          <figure anchor="fig-CHUNK_FINALIZE4res">
            <name>XDR for CHUNK_FINALIZE4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_FINALIZE4res switch (nfsstat4 cfr_status) {
   ///     case NFS4_OK:
   ///         CHUNK_FINALIZE4resok   cfr_resok4;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-2">
          <name>DESCRIPTION</name>
          <t>CHUNK_FINALIZE transitions chunks from the PENDING state (set
by CHUNK_WRITE, see <xref target="sec-CHUNK_WRITE"/>) to the FINALIZED
state in the chunk state machine (<xref target="fig-chunk-state-machine"/>).
A FINALIZED chunk is visible on the owning stateid for reads
(<xref target="sec-system-model-consistency"/>) and is eligible for
CHUNK_COMMIT; the FINALIZED transition
is the writer's signal that it will issue no further
CHUNK_WRITEs for the named owner triple
generation of each chunk.</t>
          <t>CHUNK_FINALIZE has no direct analog in <xref target="RFC8881"/>: the COMMIT
operation in <xref section="18.3" sectionFormat="of" target="RFC8881"/> combines the "no more
writes" signal and the "make durable and globally visible"
step into one operation; the Flexible File Version 2 chunk
lifecycle separates them so a writer in multiple-writer mode
can validate the per-chunk acceptance status reported by
CHUNK_WRITE before committing any chunk to durable storage
(see "Pipelining Considerations" in
<xref target="sec-CHUNK_COMMIT"/>).</t>
          <t>The client provides cfa_offset and cfa_count to bound the
chunk range, and cfa_chunks to name the specific
(chunk_owner4) generations within that range to finalize:</t>
          <dl>
            <dt>cfa_offset:</dt>
            <dd>
              <t>starting chunk index in the file (not a byte offset).</t>
            </dd>
            <dt>cfa_count:</dt>
            <dd>
              <t>number of chunks the range covers, starting at
cfa_offset.  When cfa_count is zero, the client <bcp14>MUST</bcp14>
also supply an empty cfa_chunks array, and the data
server returns NFS4_OK with an empty cfr_status array.
A cfa_offset beyond the data server's highest chunk
with a non-zero cfa_count is not itself an error at the
operation level: the data server evaluates each
cfa_chunks entry per its normal per-entry rules and
returns the co-indexed cfr_status.</t>
            </dd>
            <dt>cfa_chunks:</dt>
            <dd>
              <t>an array of chunk_owner4 entries
(<xref target="fig-chunk_owner4"/>) naming the specific generations to
finalize.  For each entry the data server looks up
the chunk index it associated with the complete
owner triple when the
client wrote it via CHUNK_WRITE or
CHUNK_WRITE_REPAIR.  That recorded chunk index <bcp14>MUST</bcp14>
lie in [cfa_offset, cfa_offset + cfa_count); if the
triple does not match any recorded owner association
on this data server for this file, or the recorded
chunk index lies outside the requested range, the
entry is rejected with NFS4ERR_INVAL in the
corresponding cfr_status slot.  The reserved sentinels
CHUNK_GUARD_CLIENT_ID_NONE and CHUNK_GUARD_CLIENT_ID_MDS
<bcp14>MUST NOT</bcp14> appear as the co_client_id of any cfa_chunks
entry; see <xref target="sec-chunk_guard_none"/> and
<xref target="sec-chunk_guard_mds"/>.</t>
            </dd>
          </dl>
          <t>The CHUNK_FINALIZE result reports the outcome per chunk in
the same order as cfa_chunks:</t>
          <dl>
            <dt>cfr_writeverf:</dt>
            <dd>
              <t>a verifier identifying the data server's incarnation
at the time the finalization completed.  Semantics
match cwr_writeverf in CHUNK_WRITE: a client that observes a
different writeverf on a subsequent CHUNK_COMMIT <bcp14>MUST</bcp14>
re-issue the CHUNK_WRITE before treating any of the
finalized chunks as durable.</t>
            </dd>
            <dt>cfr_status:</dt>
            <dd>
              <t>per-chunk finalization status, one entry per
cfa_chunks entry, co-indexed.  NFS4_OK indicates that
the named chunk is FINALIZED on return.  Other
per-entry failure cases:
</t>
              <ul spacing="normal">
                <li>
                  <t>NFS4ERR_INVAL -- the named generation is not in the
PENDING state at its recorded chunk index (the
chunk is EMPTY, FINALIZED at a different generation,
or COMMITTED), or the triple does not match any
recorded owner association, or the recorded chunk
index lies outside [cfa_offset, cfa_offset +
cfa_count).</t>
                </li>
                <li>
                  <t>NFS4ERR_CHUNK_GUARDED -- the chunk is PENDING but
the current PENDING owner is a different
(co_cohort_id, co_client_id) than the one named in
the cfa_chunks entry.  A client that sees this has
lost a race with another writer; see
<xref target="sec-chunk_guard4"/>.</t>
                </li>
                <li>
                  <t>NFS4ERR_CHUNK_LOCKED -- the chunk is locked by a
CHUNK_LOCK held by a different
stateid; the finalize is rejected.</t>
                </li>
              </ul>
              <t>The top-level CHUNK_FINALIZE status is NFS4_OK as long
as the data server could evaluate each cfa_chunks
entry; per-chunk failures are reported in cfr_status
rather than by failing the whole operation.  The
top-level status returns a non-OK code only when the
request could not be evaluated at all.</t>
            </dd>
          </dl>
          <t>CHUNK_FINALIZE serves as the CRC validation checkpoint for
the chunk lifecycle.  The data server <bcp14>SHOULD</bcp14> have validated
each chunk's checksum against the value supplied in cwa_checksums
at CHUNK_WRITE time; the FINALIZE transition persists the
chunk metadata (CRC, owner, state) to stable storage so it
survives a data server restart.  An implementation <bcp14>MAY</bcp14>
defer some metadata persistence to CHUNK_COMMIT instead of
CHUNK_FINALIZE; in that case the FINALIZED state is
recovered by replay of the data server's local journal on
restart.</t>
          <t>A chunk that has been FINALIZED but not yet COMMITTED <bcp14>MAY</bcp14>
be rolled back via CHUNK_ROLLBACK,
which returns the chunk to the EMPTY state (or to the
prior COMMITTED generation, if one exists).</t>
          <t>Like CHUNK_COMMIT, CHUNK_FINALIZE
carries an explicit layout stateid in cfa_stateid.  The
data server authorizes CHUNK_FINALIZE by validating
cfa_stateid against the file identified by the current
filehandle: cfa_stateid <bcp14>MUST</bcp14> be the layout stateid the
metadata server issued to the caller for the current
filehandle, or the special anonymous stateid (see below).
Under trusted stateid tight coupling
(<xref target="sec-TRUST_STATEID"/>), the data server rejects
CHUNK_FINALIZE with NFS4ERR_BAD_STATEID unless
cfa_stateid is present in the data server's trust table
for the current filehandle.  The explicit field ensures
that a CHUNK_FINALIZE in its own standalone compound
(typical for pipelined and recovery cases) carries the
authorization the data server needs.  Passing the
special anonymous stateid is permitted only when the
underlying security regime authorizes an unattributed
writer.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
        </section>
        <section anchor="response-codes-2">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>every named chunk transitioned from PENDING to
FINALIZED.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the layout stateid or credentials are not
permitted to finalize on this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>no active layout stateid for this file (or, in trusted stateid
tight coupling, the stateid is not in the trust table).  See
<xref target="sec-new-ops"/>.</t>
            </dd>
            <dt>NFS4ERR_DELAY:</dt>
            <dd>
              <t>the data server is temporarily unable to process
the request.</t>
            </dd>
            <dt>NFS4ERR_FHEXPIRED:</dt>
            <dd>
              <t>the current filehandle has expired.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>arguments named chunks not in PENDING or outside
the file's mirror set.</t>
            </dd>
            <dt>NFS4ERR_IO:</dt>
            <dd>
              <t>an I/O error occurred while persisting the
transition.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
CHUNK_FINALIZE.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
            <dt>NFS4ERR_STALE:</dt>
            <dd>
              <t>the current filehandle no longer identifies a
valid file.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_HEADER_READ">
        <name>Operation 81: CHUNK_HEADER_READ - Read Chunk Header from File</name>
        <section anchor="arguments-3">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_HEADER_READ4args">
            <name>XDR for CHUNK_HEADER_READ4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_HEADER_READ4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4    chra_stateid;
   ///     offset4     chra_offset;
   ///     count4      chra_count;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-3">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_HEADER_READ4resok">
            <name>XDR for CHUNK_HEADER_READ4resok</name>
            <sourcecode type="xdr"><![CDATA[
   /// /* Upper bound on both chra_count and each of the
   ///  * four co-indexed response arrays.  Bounds argument
   ///  * range width and response-array width together so
   ///  * that a caller cannot request an unbounded scan
   ///  * and a data server cannot construct an unbounded
   ///  * response.
   ///  */
   /// const CHUNK_HEADER_READ_MAX4 = 1024;
   ///
   /// struct retained_predecessor4 {
   ///     chunk_owner4  rp_owner;
   /// };
   ///
   /// enum retained_generation_disposition4 {
   ///     RETAINED_GENERATION_DISPOSITION_ABSENT   = 0,
   ///     RETAINED_GENERATION_DISPOSITION_PRESENT  = 1,
   ///     RETAINED_GENERATION_DISPOSITION_ERRORED  = 2
   /// };
   ///
   /// union optional_retained4
   ///     switch (retained_generation_disposition4
   ///             disposition) {
   /// case RETAINED_GENERATION_DISPOSITION_ABSENT:
   ///     void;
   /// case RETAINED_GENERATION_DISPOSITION_PRESENT:
   ///     retained_predecessor4  restorable;
   /// case RETAINED_GENERATION_DISPOSITION_ERRORED:
   ///     retained_predecessor4  errored;
   /// };
   ///
   /// struct CHUNK_HEADER_READ4resok {
   ///     bool                chrr_eof;
   ///     nfsstat4
   ///         chrr_status<CHUNK_HEADER_READ_MAX4>;
   ///     chunk_state_flags4
   ///         chrr_locked<CHUNK_HEADER_READ_MAX4>;
   ///     chunk_owner4
   ///         chrr_owners<CHUNK_HEADER_READ_MAX4>;
   ///     chunk_guard4
   ///         chrr_guards<CHUNK_HEADER_READ_MAX4>;
   ///     optional_retained4
   ///         chrr_predecessors<CHUNK_HEADER_READ_MAX4>;
   /// };
]]></sourcecode>
          </figure>
          <figure anchor="fig-CHUNK_HEADER_READ4res">
            <name>XDR for CHUNK_HEADER_READ4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_HEADER_READ4res switch (nfsstat4 chrr_status) {
   ///     case NFS4_OK:
   ///         CHUNK_HEADER_READ4resok     chrr_resok4;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-3">
          <name>DESCRIPTION</name>
          <t>CHUNK_HEADER_READ returns the per-chunk metadata
(chunk_owner4, chunk_guard4, lock state, and per-chunk
status) for a range of chunks in the target data file
without returning the chunk payloads.  The operation enables clients and
repair coordinators to inspect chunk lifecycle and
ownership cheaply, without the data-transfer cost of
CHUNK_READ.  CHUNK_HEADER_READ has
no direct analog in <xref target="RFC8881"/>; it is the chunk-protocol
counterpart of a stat-like fast probe and exists because
chunks are first-class state-bearing objects whose
ownership, lock state, and lifecycle status are not
recoverable from a byte-offset query.</t>
          <t>The client provides:</t>
          <dl>
            <dt>chra_stateid:</dt>
            <dd>
              <t>the layout stateid the metadata server granted for
this file.  Under trusted stateid tight coupling
(<xref target="sec-TRUST_STATEID"/>), this stateid <bcp14>MUST</bcp14> be in the
data server's trust table; otherwise the data server
rejects the operation with NFS4ERR_BAD_STATEID.</t>
            </dd>
            <dt>chra_offset:</dt>
            <dd>
              <t>starting chunk index of the range to inspect (not a
byte offset).</t>
            </dd>
            <dt>chra_count:</dt>
            <dd>
              <t>number of chunks the inspection range covers,
starting at chra_offset.  chra_count <bcp14>MUST NOT</bcp14>
exceed CHUNK_HEADER_READ_MAX4; a request that
exceeds the bound is rejected with NFS4ERR_INVAL.
The bound protects the data server against
arbitrarily large response construction.</t>
            </dd>
          </dl>
          <t>The CHUNK_HEADER_READ result returns five co-indexed
arrays, one entry per chunk in the requested range in
chunk-offset order from chra_offset:</t>
          <dl>
            <dt>chrr_eof:</dt>
            <dd>
              <t>TRUE if the requested range extended at or past the
data server's last chunk for this file.  Same
per-data-server semantics as crr_eof in CHUNK_READ.</t>
            </dd>
            <dt>chrr_status:</dt>
            <dd>
              <t>per-chunk lifecycle state encoded as an nfsstat4
(see "Per-Chunk Status Encoding" below).</t>
            </dd>
            <dt>chrr_locked:</dt>
            <dd>
              <t>per-chunk chunk_state_flags4
(<xref target="sec-chunk_state_flags4"/>).  CHUNK_STATE_FLAGS_LOCKED
set indicates the chunk currently has a CHUNK_LOCK held
by some chunk_owner4.  Lock state is reported
orthogonally to chrr_status so that a locked chunk
still surfaces its lifecycle state and chunk_owner4 to
the inspector.</t>
            </dd>
            <dt>chrr_owners:</dt>
            <dd>
              <t>per-chunk chunk_owner4 (<xref target="fig-chunk_owner4"/>).  For a
chunk whose chrr_status is NFS4_OK the field is the
COMMITTED generation's owner.  For
NFS4ERR_PAYLOAD_NOT_ATOMIC the field is the writer of
the in-progress (PENDING or FINALIZED) generation.
For NFS4ERR_NOENT (EMPTY chunk) the chunk_owner4 is
unspecified.</t>
            </dd>
            <dt>chrr_guards:</dt>
            <dd>
              <t>per-chunk chunk_guard4 (<xref target="fig-chunk_guard4"/>) -- the
(cg_gen_id, cg_client_id) pair the data server holds
as the chunk's current guard at CHUNK_HEADER_READ
time.  A caller that intends to update the chunk in
multiple writer mode uses the corresponding chrr_guards
entry as the expected prior value for the guard CAS
(<xref target="sec-multi-writer"/>), avoiding the payload cost of
CHUNK_READ.  For a chunk whose chrr_status is
NFS4ERR_NOENT (EMPTY) the chunk_guard4 is the
all-zeros pair (cg_gen_id = 0 and cg_client_id =
CHUNK_GUARD_CLIENT_ID_NONE, see
<xref target="sec-chunk_guard_none"/>).  chrr_guards is a read-time
observation; a concurrent writer <bcp14>MAY</bcp14> advance the
guard between the CHUNK_HEADER_READ response and the
subsequent CHUNK_WRITE, in which case the CAS returns
NFS4ERR_CHUNK_GUARDED and the caller re-observes the
guard per the rollback-and-retry flow in
<xref target="sec-chunk_guard4"/>.</t>
            </dd>
            <dt>chrr_predecessors:</dt>
            <dd>
              <t>per-chunk immediate-predecessor disposition, one
optional_retained4 entry per chunk in the returned
range, co-indexed with chrr_status, chrr_locked, and
chrr_owners.  Each entry names the read-time state
of the single most recent retained predecessor of
the current generation the data server holds for
that chunk index under the retention scope rule
(<xref target="sec-system-model-retention-scope"/>); the entry's
discriminant is exactly one of:
</t>
              <dl>
                <dt>RETAINED_GENERATION_DISPOSITION_ABSENT:</dt>
                <dd>
                  <t>the data server holds no retained predecessor at that
index (either the current chrr_owners generation is the
only one, or the chunk is EMPTY).  The arm carries no
owner triple.</t>
                </dd>
                <dt>RETAINED_GENERATION_DISPOSITION_PRESENT:</dt>
                <dd>
                  <t>the data server retains an immediate predecessor whose
owner triple is carried in the restorable arm and whose
payload is in the AVAILABLE read-time state
(<xref target="sec-system-model-read-time-status"/>).  A
CHUNK_ROLLBACK naming this owner triple satisfies
"Rollback of COMMITTED Chunks" case (a)
(<xref target="sec-CHUNK_ROLLBACK"/>).</t>
                </dd>
                <dt>RETAINED_GENERATION_DISPOSITION_ERRORED:</dt>
                <dd>
                  <t>the data server retains the immediate predecessor's
owner triple (in the errored arm) but its payload is in
the ERRORED read-time state and cannot be restored by
CHUNK_ROLLBACK.  A CHUNK_ROLLBACK naming this owner
triple <bcp14>MUST</bcp14> return NFS4ERR_NO_PREDECESSOR
(<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>); the client falls back
to best-effort reconstruction via CHUNK_WRITE_REPAIR with an
authoritative source of its own choosing.
The owner triple is disclosed so a caller can
coordinate reconstruction from surviving
shards.</t>
                </dd>
              </dl>
              <t>The list is informational and <bcp14>MAY</bcp14> change between
successive CHUNK_HEADER_READ calls -- the data
server <bcp14>MAY</bcp14> release a predecessor between calls
under the retention scope rule.  A caller that
observes a PRESENT disposition and issues
CHUNK_ROLLBACK before that release remains
guaranteed by the composed rollback guarantee
(<xref target="sec-composed-rollback"/>) when it holds a
qualifying lock or escrow; without such a lock,
the retention scope <bcp14>MAY</bcp14> release the predecessor
at any time and a subsequent CHUNK_ROLLBACK <bcp14>MAY</bcp14>
return NFS4ERR_NO_PREDECESSOR even though a
previous CHUNK_HEADER_READ observed PRESENT.</t>
            </dd>
            <dt>Cardinality and short responses:</dt>
            <dd>
              <t>All five response arrays are the same length; the data
server <bcp14>MUST NOT</bcp14> sparsify or truncate one array independently
of the others.</t>
              <t>The response array length N <bcp14>MAY</bcp14> be smaller than chra_count
when the requested range extends past the data server's last
chunk (chrr_eof = TRUE, N = the number of chunks the data
server holds within the requested range) or when the
fully-populated response would exceed the session-negotiated
ca_maxresponsesize (<xref section="18.36.3" sectionFormat="of" target="RFC8881"/>).  In the
response-size case the data server returns a short response
with chrr_eof = FALSE containing as many entries N as fit
under ca_maxresponsesize minus COMPOUND/RPC overhead; the
client resumes at chra_offset + N.  If even the minimum
useful response (a single entry) will not fit, the data
server returns NFS4ERR_REP_TOO_BIG per <xref target="RFC8881"/>; the
client <bcp14>MUST NOT</bcp14> retry with a smaller chra_count and
instead uses a session or COMPOUND with more available
response budget.</t>
            </dd>
          </dl>
          <t>The operation has several uses:</t>
          <dl>
            <dt>Whole-file repair scan:</dt>
            <dd>
              <t>A repair actor selected via CB_CHUNK_REPAIR walks the affected chunk
range and uses the per-chunk chunk_owner4 returned by
each mirror's data server to identify which chunks
carry an atomic stripe (all k data shards share the
same chunk_guard4) and which require reconstruction.
CHUNK_HEADER_READ is the discovery primitive that
drives the per-chunk decisions described in
<xref target="sec-repair-multi-writer"/>; without it, a repair
client would have to issue CHUNK_READ to retrieve the
full payload of every chunk merely to inspect its
guard.</t>
            </dd>
            <dt>Client-side recovery from partial writes:</dt>
            <dd>
              <t>After a network disruption or client restart, a writer
that holds the file's layout <bcp14>MAY</bcp14> issue
CHUNK_HEADER_READ to learn which of its prior
CHUNK_WRITEs reached the data server.  Chunks whose
chunk_owner4 reports the writer's own (co_cohort_id,
co_client_id) pair are PENDING or FINALIZED and
recoverable; chunks absent from the response or
carrying another writer's owner are not.  The writer
can then re-issue CHUNK_WRITE for the missing chunks
or CHUNK_ROLLBACK for the abandoned ones without
reading payloads it has already committed locally.</t>
            </dd>
            <dt>Read-side atomicity check:</dt>
            <dd>
              <t>Before issuing a multi-chunk CHUNK_READ in
multiple-writer mode, a client <bcp14>MAY</bcp14> issue
CHUNK_HEADER_READ to verify that the chunks in the
target range share a common <tt>(co_cohort_id,
co_client_id)</tt> pair in chrr_owners (the cohort-atomicity
property in
<xref target="sec-system-model-consistency"/>) and <bcp14>MAY</bcp14> additionally
inspect chrr_guards as a cheaper generation-level
corroboration.  If the cohort pairs diverge, the
client knows the read will not be atomic and can
wait for a writer to commit, retry, or report
NFS4ERR_PAYLOAD_NOT_ATOMIC via LAYOUTERROR.  This is
a hint rather than a guarantee: a concurrent writer
<bcp14>MAY</bcp14> advance a chunk's state between the
CHUNK_HEADER_READ response and the subsequent
CHUNK_READ.</t>
            </dd>
            <dt>Predecessor-guided rollback discovery:</dt>
            <dd>
              <t>A caller preparing a CHUNK_ROLLBACK against a COMMITTED
chunk inspects the corresponding chrr_predecessors entry
to decide whether CHUNK_ROLLBACK will succeed.</t>
              <dl>
                <dt>PRESENT:</dt>
                <dd>
                  <t>name the disclosed owner triple in the cra_chunks entry
of the subsequent CHUNK_ROLLBACK.  "Rollback of
COMMITTED Chunks" case (a) will succeed subject to the
composed rollback guarantee's continuous-custody
condition (<xref target="sec-composed-rollback"/>).</t>
                </dd>
                <dt>ERRORED:</dt>
                <dd>
                  <t>do NOT issue CHUNK_ROLLBACK against the disclosed owner
triple.  The data server <bcp14>MUST</bcp14> return
NFS4ERR_NO_PREDECESSOR for that owner; use
CHUNK_WRITE_REPAIR directly with a reconstructed
authoritative source.  The disclosed owner triple lets
the caller coordinate reconstruction from other sources.</t>
                </dd>
                <dt>ABSENT:</dt>
                <dd>
                  <t>no restorable predecessor exists.  Skip CHUNK_ROLLBACK;
use CHUNK_WRITE_REPAIR if reconstruction is possible, or
defer to a guaranteed-pinning mechanism when the caller
requires the original owner triple be preserved.</t>
                </dd>
              </dl>
              <t>As with the atomicity check, a subsequent lifecycle event
<bcp14>MAY</bcp14> change a chunk's disposition between the
CHUNK_HEADER_READ response and the CHUNK_ROLLBACK (a
PRESENT observation <bcp14>MAY</bcp14> become ABSENT if the retention
scope releases the predecessor and the caller does not
hold a qualifying lock or escrow).</t>
            </dd>
            <dt>Lock probe before write:</dt>
            <dd>
              <t>A client <bcp14>MAY</bcp14> issue CHUNK_HEADER_READ and inspect the
chrr_locked array to discover whether any chunk in
the target range is currently held by a CHUNK_LOCK before attempting CHUNK_WRITE,
avoiding the round-trip cost of receiving
NFS4ERR_CHUNK_LOCKED.  As above, this is a hint; a
lock <bcp14>MAY</bcp14> be acquired between the header read and the
write.</t>
            </dd>
          </dl>
          <t>CHUNK_HEADER_READ does not change any chunk state.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
          <section anchor="per-chunk-status-encoding">
            <name>Per-Chunk Status Encoding</name>
            <t>The per-chunk chrr_status field reports the chunk's
lifecycle state encoded as an nfsstat4:</t>
            <dl>
              <dt>NFS4_OK:</dt>
              <dd>
                <t>the chunk is COMMITTED and the chunk_owner4 in the
corresponding chrr_owners slot is the COMMITTED
generation's owner.</t>
              </dd>
              <dt>NFS4ERR_PAYLOAD_NOT_ATOMIC:</dt>
              <dd>
                <t>the chunk is PENDING or FINALIZED (a non-globally-visible
generation is in progress).  The
chunk_owner4 in the corresponding chrr_owners slot
names the writer of that in-progress generation.</t>
              </dd>
              <dt>NFS4ERR_NOENT:</dt>
              <dd>
                <t>the chunk is EMPTY (no COMMITTED generation has been
written at this offset).  The chunk_owner4 in the
corresponding chrr_owners slot is unspecified.</t>
              </dd>
            </dl>
            <t>CHUNK_HEADER_READ never returns NFS4ERR_CHUNK_LOCKED in
chrr_status; lock state is reported orthogonally via
chrr_locked so that locked chunks still surface their
chunk_owner4 to the inspector.</t>
          </section>
        </section>
        <section anchor="response-codes-3">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the chunk headers have been returned.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the layout stateid or credentials are not
permitted to read chunk headers on this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>no active layout stateid for this file (or, in trusted stateid
tight coupling, the stateid is not in the trust table).  See
<xref target="sec-new-ops"/>.</t>
            </dd>
            <dt>NFS4ERR_DELAY:</dt>
            <dd>
              <t>the data server is temporarily unable to process
the request.</t>
            </dd>
            <dt>NFS4ERR_FHEXPIRED:</dt>
            <dd>
              <t>the current filehandle has expired.</t>
            </dd>
            <dt>NFS4ERR_IO:</dt>
            <dd>
              <t>an I/O error occurred while reading chunk headers.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
CHUNK_HEADER_READ.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
            <dt>NFS4ERR_STALE:</dt>
            <dd>
              <t>the current filehandle no longer identifies a
valid file.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_LOCK">
        <name>Operation 82: CHUNK_LOCK - Lock Cached Chunk Data</name>
        <section anchor="arguments-4">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_LOCK4args">
            <name>XDR for CHUNK_LOCK4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// const CHUNK_LOCK_FLAGS_ADOPT    = 0x00000001;
   /// const CHUNK_LOCK_FLAGS_TAKEOVER = 0x00000002;
   ///
   /// union chunk_lock_adopt4 switch (bool cla_adopt) {
   ///     case TRUE:
   ///         escrow_id4      cla_escrow_id;
   ///     case FALSE:
   ///         void;
   /// };
   ///
   /// struct CHUNK_LOCK4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4            cla_stateid;
   ///     offset4             cla_offset;
   ///     count4              cla_count;
   ///     uint32_t            cla_flags;
   ///     chunk_owner4        cla_owner;
   ///     chunk_lock_adopt4   cla_adopt;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-4">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_LOCK4res">
            <name>XDR for CHUNK_LOCK4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_LOCK4res switch (nfsstat4 clr_status) {
   ///     case NFS4_OK:
   ///         void;
   ///     case NFS4ERR_CHUNK_LOCKED:
   ///         chunk_owner4    clr_owner;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-4">
          <name>DESCRIPTION</name>
          <t>CHUNK_LOCK acquires an exclusive chunk-range lock on the
range specified by cla_offset and cla_count.  While the
lock is held, CHUNK_WRITE, CHUNK_WRITE_REPAIR,
CHUNK_FINALIZE, CHUNK_COMMIT, CHUNK_ROLLBACK, and
CHUNK_UNLOCK operations on any of
the locked chunks from any other chunk_owner4 receive
NFS4ERR_CHUNK_LOCKED in the corresponding per-chunk
status slot.  The lock is associated with the
chunk_owner4 in cla_owner.</t>
          <t>CHUNK_LOCK is loosely analogous to LOCK (<xref section="18.10" sectionFormat="of" target="RFC8881"/>)
in that it acquires an exclusive guard against concurrent
modification, but the two operate on different coordinate systems and
use different naming: LOCK is byte range and stateid-based; CHUNK_LOCK
is chunk-range and chunk_owner4-based. CHUNK_LOCK is used in
multiple-writer mode (<xref target="sec-multi-writer"/>) to serialize racing
writers on a common chunk range, and in the repair flow
(<xref target="sec-repair-selection"/>) to transfer lock ownership to a repair
actor via CHUNK_LOCK_FLAGS_ADOPT.</t>
          <t>The client provides:</t>
          <dl>
            <dt>cla_stateid:</dt>
            <dd>
              <t>the layout stateid the metadata server granted for
this file.  Under trusted stateid tight coupling
(<xref target="sec-TRUST_STATEID"/>), this stateid <bcp14>MUST</bcp14> be in the
data server's trust table; otherwise the data server
rejects the operation with NFS4ERR_BAD_STATEID.</t>
            </dd>
            <dt>cla_offset:</dt>
            <dd>
              <t>starting chunk index of the lock range (not a byte
offset).</t>
            </dd>
            <dt>cla_count:</dt>
            <dd>
              <t>number of chunks the lock range covers, starting at
cla_offset.</t>
            </dd>
            <dt>cla_flags:</dt>
            <dd>
              <t>bitmask of CHUNK_LOCK_FLAGS_* values.  Defined:
CHUNK_LOCK_FLAGS_ADOPT (adopt a metadata-server escrow lock;
see "Lock Transfer via CHUNK_LOCK_FLAGS_ADOPT" below);
CHUNK_LOCK_FLAGS_TAKEOVER (transfer ownership of a
live client-held lock, distinct from adoption; see
"Live-Client Lock Takeover via
CHUNK_LOCK_FLAGS_TAKEOVER" below).  The two flags
are mutually exclusive; a request with both bits set
<bcp14>MUST</bcp14> be rejected with NFS4ERR_INVAL.  Unknown bits
<bcp14>MUST</bcp14> be rejected with NFS4ERR_INVAL.</t>
            </dd>
            <dt>cla_owner:</dt>
            <dd>
              <t>the chunk_owner4 (<xref target="fig-chunk_owner4"/>) that will hold
the lock on success.  The reserved sentinel values
CHUNK_GUARD_CLIENT_ID_NONE and
CHUNK_GUARD_CLIENT_ID_MDS <bcp14>MUST NOT</bcp14> appear as the
co_client_id of cla_owner; see
<xref target="sec-chunk_guard_none"/> and <xref target="sec-chunk_guard_mds"/>.
(A client requesting CHUNK_LOCK_FLAGS_ADOPT <bcp14>MUST</bcp14> use
its own co_client_id, not the metadata-server escrow sentinel,
even when adopting from a metadata-server escrow holder.)</t>
            </dd>
            <dt>cla_adopt:</dt>
            <dd>
              <t>a discriminated union carrying the escrow_id4
(<xref target="sec-escrow_id4"/>) that identifies the specific
metadata-server escrow lock the caller is adopting.  When
cla_flags carries CHUNK_LOCK_FLAGS_ADOPT, cla_adopt
<bcp14>MUST</bcp14> be the TRUE arm and cla_escrow_id <bcp14>MUST</bcp14> match
the escrow_id4 the metadata server installed on
this data server for the requested range (identity
mismatch is one of the state-level causes of
NFS4ERR_NO_ADOPTABLE_LOCK per
<xref target="sec-NFS4ERR_NO_ADOPTABLE_LOCK"/>).  When cla_flags
does not carry CHUNK_LOCK_FLAGS_ADOPT, cla_adopt
<bcp14>MUST</bcp14> be the FALSE arm.  The two conditions
(bit-flag value and discriminant value) <bcp14>MUST</bcp14> agree;
a mismatch is rejected with NFS4ERR_INVAL.</t>
            </dd>
          </dl>
          <t>The CHUNK_LOCK result returns:</t>
          <dl>
            <dt>clr_status:</dt>
            <dd>
              <t>NFS4_OK if the lock was acquired (or transferred via
ADOPT).  NFS4ERR_CHUNK_LOCKED if one or more chunks
in the range are already locked and the request does
not carry CHUNK_LOCK_FLAGS_ADOPT.</t>
            </dd>
            <dt>clr_owner (NFS4ERR_CHUNK_LOCKED case only):</dt>
            <dd>
              <t>the chunk_owner4 of the current lock holder, so the
caller can identify the blocking writer.</t>
            </dd>
          </dl>
          <t>The lock is released by CHUNK_UNLOCK or implicitly when the holder's
lease expires; on lease expiry without explicit
release, the data server transitions the lock to the
metadata-server escrow owner if the metadata server has revoked
the holder's stateid via REVOKE_STATEID, per the lock-continuity-across-revocation
invariant in
<xref target="sec-system-model-consistency"/>.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
          <section anchor="lock-transfer-via-chunklockflagsadopt">
            <name>Lock Transfer via CHUNK_LOCK_FLAGS_ADOPT</name>
            <t>The CHUNK_LOCK_FLAGS_ADOPT flag in cla_flags requests an atomic
transfer of lock ownership to cla_owner for every chunk in
[cla_offset, cla_offset+cla_count).  The data server <bcp14>MUST</bcp14> perform
the transfer as a single atomic step per chunk: there is no window
in which the chunk is unlocked.  After a successful ADOPT, subsequent
CHUNK_WRITE, CHUNK_WRITE_REPAIR, CHUNK_ROLLBACK, and CHUNK_UNLOCK
operations <bcp14>MUST</bcp14> present cla_owner as their chunk_owner4.</t>
            <t>CHUNK_LOCK_FLAGS_ADOPT is the sole mechanism by which a chunk lock
can change hands without first being released.  The lock ordering
invariant -- that every chunk in a payload transitioning through
repair is held by exactly one owner continuously from failure
detection to repair completion -- depends on it.</t>
            <t>CHUNK_LOCK_FLAGS_ADOPT is valid only when the caller has been
selected as the repair actor for the range by the metadata server,
typically via CB_CHUNK_REPAIR.  A data
server that receives CHUNK_LOCK with the ADOPT flag from a client
that has not been so designated <bcp14>MAY</bcp14> reject the operation with
NFS4ERR_ACCESS.  Because CHUNK_LOCK is a CHUNK operation and
encodings that use CHUNK operations require tight coupling
(<xref target="sec-ff_device_addr4"/>), the metadata server notifies the data
server of the ADOPT designation via the control protocol (e.g.,
TRUST_STATEID with the new client's stateid or a similar
facility); no loose coupling ADOPT path exists.</t>
            <t>The current lock holder at the moment of ADOPT <bcp14>MAY</bcp14> be:</t>
            <ol spacing="normal" type="1"><li>
                <t>Another client whose stateid remains valid (for example, a
client that has stopped making progress but has not yet lost
its lease).  The prior owner's PENDING or FINALIZED shards
remain on disk until the new owner issues CHUNK_WRITE_REPAIR,
CHUNK_ROLLBACK, or CHUNK_COMMIT.</t>
              </li>
              <li>
                <t>The metadata server itself, acting through the
CHUNK_GUARD_CLIENT_ID_MDS escrow owner
(<xref target="sec-chunk_guard_mds"/>).  This occurs when the metadata
server has revoked the prior holder's stateid in a tightly
coupled deployment.</t>
              </li>
            </ol>
            <t>In either case, ADOPT's effect from the repair actor's
perspective is the same: after the successful return the caller
holds the lock and may drive the range to consistency.</t>
            <t>The data server <bcp14>MUST</bcp14> reject CHUNK_LOCK with
CHUNK_LOCK_FLAGS_ADOPT if cla_owner's co_client_id equals
CHUNK_GUARD_CLIENT_ID_MDS -- that value is reserved for server
production and <bcp14>MUST NOT</bcp14> be presented by a client.  The operation
returns NFS4ERR_INVAL in that case.</t>
          </section>
          <section anchor="live-client-lock-takeover-via-chunklockflagstakeover">
            <name>Live-Client Lock Takeover via CHUNK_LOCK_FLAGS_TAKEOVER</name>
            <t>The CHUNK_LOCK_FLAGS_TAKEOVER flag in cla_flags requests
an atomic transfer of lock ownership from a currently
live client-held lock to cla_owner, distinct from
CHUNK_LOCK_FLAGS_ADOPT which transfers from an
metadata-server escrow lock.  The two flags are mutually exclusive:
ADOPT names the metadata server's escrow identity via
cla_adopt, while TAKEOVER names another client's
already-held lock and is used only when the metadata
server has designated cla_owner as the successor to a
displaced live client (for example, when a repair
sequence must proceed while the prior writer's session
remains valid).</t>
            <t>Under CHUNK_LOCK_FLAGS_TAKEOVER, cla_adopt <bcp14>MUST</bcp14> be the
FALSE arm (there is no escrow identity being adopted);
the metadata server's designation is what authorizes
the transfer, and the data server verifies the
designation by the same coupling-model-dependent
mechanism used for ADOPT above.  A data server that
receives TAKEOVER from a client not designated as
successor <bcp14>MAY</bcp14> reject with NFS4ERR_ACCESS.  As with
ADOPT, TAKEOVER is atomic: no window exists in which
the chunk is unlocked, and after a successful
TAKEOVER subsequent operations on the range <bcp14>MUST</bcp14>
present cla_owner as their chunk_owner4.</t>
          </section>
        </section>
        <section anchor="response-codes-4">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the requested chunk range has been locked.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the layout stateid or credentials are not
permitted to lock chunks on this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>no active layout stateid for this file (or, in trusted stateid
tight coupling, the stateid is not in the trust table).  See
<xref target="sec-new-ops"/>.</t>
            </dd>
            <dt>NFS4ERR_CHUNK_LOCKED:</dt>
            <dd>
              <t>one or more chunks in the requested
range are already locked by another writer.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>the requested range was malformed or outside
the file's mirror set.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement CHUNK_LOCK.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_READ">
        <name>Operation 83: CHUNK_READ - Read Chunks from File</name>
        <section anchor="arguments-5">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_READ4args">
            <name>XDR for CHUNK_READ4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_READ4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4    cra_stateid;
   ///     offset4     cra_offset;
   ///     count4      cra_count;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-5">
          <name>RESULTS</name>
          <figure anchor="fig-read_chunk4">
            <name>XDR for read_chunk4</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct read_chunk4 {
   ///     checksum4          cr_checksum;
   ///     uint32_t           cr_effective_len;
   ///     chunk_owner4       cr_owner;
   ///     chunk_guard4       cr_guard;
   ///     uint32_t           cr_payload_id;
   ///     chunk_state_flags4 cr_locked;
   ///     nfsstat4           cr_status;
   ///     opaque             cr_chunk<>;
   /// };
]]></sourcecode>
          </figure>
          <figure anchor="fig-CHUNK_READ4resok">
            <name>XDR for CHUNK_READ4resok</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_READ4resok {
   ///     bool        crr_eof;
   ///     read_chunk4 crr_chunks<>;
   /// };
]]></sourcecode>
          </figure>
          <figure anchor="fig-CHUNK_READ4res">
            <name>XDR for CHUNK_READ4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_READ4res switch (nfsstat4 crr_status) {
   ///     case NFS4_OK:
   ///          CHUNK_READ4resok     crr_resok4;
   ///     default:
   ///          void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-5">
          <name>DESCRIPTION</name>
          <t>The CHUNK_READ operation is based upon the NFSv4.1 READ
operation (see <xref section="18.22" sectionFormat="of" target="RFC8881"/>) and similarly
reads data from the regular file identified by the current
filehandle, with the difference that CHUNK_READ operates on
the chunk coordinate system used by Flexible File Version 2
layouts rather than on the byte coordinate system.</t>
          <t>The client provides a cra_offset of where the CHUNK_READ is
to start and a cra_count of how many chunks are to be read.
cra_offset is the starting chunk index in the file (not a
byte offset); the chunk at index N occupies the bytes
[N * chunk_size, (N + 1) * chunk_size) for encodings with a
uniform chunk size, where chunk_size is taken from
ffv2m_striping_unit_size in the file's layout
(<xref target="sec-ffv2-mirror4"/>).  For encodings whose parity shards
have variable sizes (the Mojette family), the parity-shard
chunks on a given data server may use a smaller per-shard
chunk size; see <xref target="sec-mojette-encoding"/>.  cra_count is a
count of chunks to read and not bytes to read.</t>
          <t>A cra_offset of zero starts reading at the first chunk of
the file.  If cra_offset is greater than or equal to the
number of chunks the data server holds for this file, the
status NFS4_OK is returned with crr_chunks empty and
crr_eof set to TRUE.</t>
          <t>If cra_count is zero, the CHUNK_READ succeeds and returns
zero chunks.  In all situations the data server <bcp14>MAY</bcp14> choose
to return fewer chunks than the client requested; the
client must be prepared to handle a short read and reissue
CHUNK_READ for the remaining chunks.</t>
          <t>The CHUNK_READ result is comprised of an array of
read_chunk4, each describing the metadata and payload of
one chunk.  The array entries are in chunk-index order
starting from cra_offset.  Within each read_chunk4
(<xref target="fig-read_chunk4"/>):</t>
          <dl>
            <dt>cr_checksum:</dt>
            <dd>
              <t>the checksum4 (<xref target="sec-checksum4"/>) the data server
recomputed over the chunk header and cr_chunk (with the
checksum field's bytes treated as zero, per the uniform
coverage rule in <xref target="sec-checksum4"/>) at CHUNK_READ time,
from the persisted value it recorded at CHUNK_FINALIZE
or CHUNK_COMMIT time.  The cs_algorithm field matches
the layout's ffv2m_checksum_algorithm
(<xref target="sec-ffv2-mirror4"/>); the cs_value carries the
computed bytes at the length registered for that
algorithm.  The client uses cr_checksum to detect
transport corruption between the data server and the
client; see <xref target="sec-security-checksum-scope"/> for the
scope and limits of checksum protection per algorithm
class.</t>
            </dd>
            <dt>cr_effective_len:</dt>
            <dd>
              <t>the byte length of cr_chunk.  This may be smaller than
the layout's chunk_size when the chunk is the final
chunk of a file whose size is not chunk-aligned, or
when the chunk belongs to a variable-size Mojette
parity shard.</t>
            </dd>
            <dt>cr_owner:</dt>
            <dd>
              <t>the full owner triple
of the COMMITTED generation being returned (see
<xref target="sec-chunk_owner4"/>); co_id is the opaque writer-supplied
per-chunk identifier the client provided at
CHUNK_WRITE or CHUNK_WRITE_REPAIR time, not a chunk
index.  A client reading from multiple data servers in
an erasure-coded layout <bcp14>MUST</bcp14> compare the pair
<tt>(cr_owner.co_cohort_id, cr_owner.co_client_id)</tt> across
data servers; agreement of the cohort pair across the k
data shards is the atomicity invariant on which
reconstruction depends.  See
<xref target="sec-system-model-consistency"/>.</t>
            </dd>
            <dt>cr_guard:</dt>
            <dd>
              <t>the (cg_gen_id, cg_client_id) pair the data server holds
as the chunk's current chunk_guard4 (<xref target="sec-chunk_guard4"/>)
at CHUNK_READ time.  A client that intends to update this
chunk in multiple writer mode uses cr_guard as the
expected prior value for the guard CAS: it supplies
cwa_guard.cwg_check = TRUE with cwa_guard.cwg_guard set
to the observed cr_guard on the subsequent CHUNK_WRITE
(<xref target="sec-CHUNK_WRITE"/>, <xref target="sec-multi-writer"/>).  A client
reading from multiple data servers in an erasure-coded
layout <bcp14>MAY</bcp14> also compare cr_guard values across shards as
an auxiliary check on payload atomicity; the cr_owner
cohort-pair comparison (see the bullet above and
<xref target="sec-system-model-consistency"/>) is the normative
atomicity invariant and cr_guard adds a cheaper
generation-level check.  For the
NFS4ERR_NOENT synthetic zero-filled chunk the cr_guard is
set to the all-zeros pair (cg_client_id =
CHUNK_GUARD_CLIENT_ID_NONE, see <xref target="sec-chunk_guard_none"/>).</t>
            </dd>
            <dt>cr_payload_id:</dt>
            <dd>
              <t>the payload-id the writer associated with the chunk at
CHUNK_WRITE time, used by repair coordinators to
correlate chunks across mirrors.</t>
            </dd>
            <dt>cr_locked:</dt>
            <dd>
              <t>chunk_state_flags4 (<xref target="sec-chunk_state_flags4"/>).
CHUNK_STATE_FLAGS_LOCKED set indicates the chunk
currently has a CHUNK_LOCK held against it.  Lock
state does not block the read.</t>
            </dd>
            <dt>cr_status:</dt>
            <dd>
              <t>per-chunk status.  NFS4_OK indicates that cr_chunk is
the COMMITTED payload.  NFS4ERR_PAYLOAD_NOT_ATOMIC
indicates the chunk's persisted checksum or guard check
failed at read time, in which case cr_chunk content
is undefined; see <xref target="sec-NFS4ERR_PAYLOAD_NOT_ATOMIC"/>.
NFS4ERR_NOENT indicates the chunk is EMPTY (no
COMMITTED generation has been written at this offset).</t>
            </dd>
            <dt>cr_chunk:</dt>
            <dd>
              <t>the chunk payload bytes.  Empty for cr_status values
other than NFS4_OK.</t>
            </dd>
          </dl>
          <t>A chunk that is EMPTY at the requested offset is returned
as a synthetic zero-filled chunk: cr_status is
NFS4ERR_NOENT, cr_chunk is zero-filled to the layout's
chunk_size, cr_owner is set to all-zeros (with co_client_id
= CHUNK_GUARD_CLIENT_ID_NONE, see <xref target="sec-chunk_guard_none"/>),
cr_guard is set to the all-zeros pair (cg_gen_id = 0 and
cg_client_id = CHUNK_GUARD_CLIENT_ID_NONE), and
cr_checksum is the checksum of the synthetic zero-filled
payload.  This lets a client reconstruct holes without a
special-casing path.</t>
          <t>The data server <bcp14>MAY</bcp14> signal end-of-file by setting crr_eof
to TRUE.  If the CHUNK_READ ended at the last chunk that
exists on this data server (the read returned chunks up to
and including the data server's last chunk) or extended
beyond it, crr_eof <bcp14>MUST</bcp14> be TRUE.  Otherwise crr_eof is
FALSE.  A successful CHUNK_READ of an empty file always
returns crr_eof as TRUE with crr_chunks empty.  Note that
crr_eof reflects the state at the data server only; in a
multi-data-server erasure-coded layout the file's logical
size is reconstructed at the client from the chunk-index
positions at which surviving shards hold non-EMPTY chunks
(observed via successive CHUNK_READs at known offsets),
not from any single data server's crr_eof.  Because co_id
is opaque per <xref target="sec-chunk_owner4"/>, the reconstructing
client <bcp14>MUST NOT</bcp14> derive positional information from the
chunk_owner4 values themselves.</t>
          <t>Except when special stateids are used, the cra_stateid
value represents a layout stateid returned by a prior
LAYOUTGET against the metadata server (see <xref section="18.43" sectionFormat="of" target="RFC8881"/>).  The data server uses cra_stateid to verify that the
client holds a valid layout that authorizes reading this file.  Under
trusted stateid tight coupling (<xref target="sec-TRUST_STATEID"/>), the data
server additionally checks that the metadata server has registered the
stateid via TRUST_STATEID; an unregistered stateid (other than a
special stateid) returns NFS4ERR_BAD_STATEID.</t>
          <t>For a CHUNK_READ with a cra_stateid value of all bits
equal to zero, the data server <bcp14>MAY</bcp14> allow the CHUNK_READ
to be serviced subject to the chunk-lock state recorded in
cr_locked.  For a CHUNK_READ with a cra_stateid value of
all bits equal to one, the data server <bcp14>MAY</bcp14> allow CHUNK_READ
to bypass lock-state reporting at the data server.  These
special-stateid behaviors mirror the corresponding READ
semantics in <xref target="RFC8881"/> adapted to the chunk-locking
model (<xref target="sec-CHUNK_LOCK"/>) rather than the byte range
locking model of <xref section="12." sectionFormat="of" target="RFC8881"/></t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
          <t><xref target="fig-example-CHUNK_READ4args"/> shows a client requesting
4 chunks starting at chunk index 2.  Data Server 2
responds as in <xref target="fig-example-CHUNK_READ4resok"/>: there is
valid data for chunks 2 and 4, a synthetic zero-filled
hole at chunk 3, and no data for chunk 5 (the data server's
last chunk is chunk 4, so crr_eof is TRUE).  The data
server calculates a valid cr_checksum for chunk 3 based on the
synthetic zero-filled payload.</t>
          <figure anchor="fig-example-CHUNK_READ4args">
            <name>Example: CHUNK_READ4args parameters</name>
            <artwork><![CDATA[
        Data Server 2
  +--------------------------------+
  | CHUNK_READ4args                |
  +--------------------------------+
  | cra_stateid: 0                 |
  | cra_offset: 2                  |
  | cra_count: 4                   |
  +--------------------------------+
]]></artwork>
          </figure>
          <figure anchor="fig-example-CHUNK_READ4resok">
            <name>Example: Resulting CHUNK_READ4resok reply</name>
            <sourcecode type="art"><![CDATA[
        Data Server 2
  +--------------------------------+
  | CHUNK_READ4resok               |
  +--------------------------------+
  | crr_eof: true                  |
  | crr_chunks[0]:                 |
  |     cr_checksum: 0x3faddace    |
  |     cr_owner:                  |
  |         co_cohort_id: 0x2a     |
  |         co_client_id: 6        |
  |         co_id: 2               |
  |     cr_payload_id: 1           |
  |     cr_chunk: ....             |
  | crr_chunks[1]:                 |
  |     cr_checksum: 0xdeade4e5    |
  |     cr_owner:                  |
  |         co_cohort_id: 0x0      |
  |         co_client_id: 0        |
  |         co_id: 0               |
  |     cr_payload_id: 1           |
  |     cr_chunk: 0000...00000     |
  | crr_chunks[2]:                 |
  |     cr_checksum: 0x7778abcd    |
  |     cr_owner:                  |
  |         co_cohort_id: 0x2a     |
  |         co_client_id: 6        |
  |         co_id: 4               |
  |     cr_payload_id: 1           |
  |     cr_chunk: ....             |
  +--------------------------------+
]]></sourcecode>
          </figure>
        </section>
        <section anchor="response-codes-5">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the requested chunks have been returned.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the layout stateid or credentials are not
permitted to read this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>no active layout stateid for this file (or, in trusted stateid
tight coupling, the stateid is not in the trust table).  See
<xref target="sec-new-ops"/>.</t>
            </dd>
            <dt>NFS4ERR_DELAY:</dt>
            <dd>
              <t>the data server is temporarily unable to process
the request.</t>
            </dd>
            <dt>NFS4ERR_FHEXPIRED:</dt>
            <dd>
              <t>the current filehandle has expired.</t>
            </dd>
            <dt>NFS4ERR_IO:</dt>
            <dd>
              <t>an I/O error occurred while reading the chunks.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement CHUNK_READ.</t>
            </dd>
            <dt>NFS4ERR_PAYLOAD_NOT_ATOMIC:</dt>
            <dd>
              <t>one or more chunks failed their
persisted guard or CRC check.  See <xref target="sec-NFS4ERR_PAYLOAD_NOT_ATOMIC"/>.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
            <dt>NFS4ERR_STALE:</dt>
            <dd>
              <t>the current filehandle no longer identifies a
valid file.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_REPAIRED">
        <name>Operation 84: CHUNK_REPAIRED - Confirm Repair of Errored Chunk Data</name>
        <section anchor="arguments-6">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_REPAIRED4args">
            <name>XDR for CHUNK_REPAIRED4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_REPAIRED4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4        cra_stateid;
   ///     offset4         cra_offset;
   ///     count4          cra_count;
   ///     chunk_owner4    cra_owner;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-6">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_REPAIRED4res">
            <name>XDR for CHUNK_REPAIRED4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_REPAIRED4res switch (nfsstat4 crr_status) {
   ///     case NFS4_OK:
   ///         void;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-6">
          <name>DESCRIPTION</name>
          <t>CHUNK_REPAIRED signals that chunks previously marked as
errored (via CHUNK_ERROR, see <xref target="sec-CHUNK_ERROR"/>) have been
repaired and the errored state can be cleared.  The repair
client writes replacement data via CHUNK_WRITE_REPAIR, advances the new chunks
through CHUNK_FINALIZE and
CHUNK_COMMIT, and only then issues
CHUNK_REPAIRED to make the repaired chunks visible to
normal CHUNK_READ traffic again.</t>
          <t>CHUNK_REPAIRED has no direct analog in <xref target="RFC8881"/>; it is
the chunk-protocol equivalent of clearing a "needs scrub"
flag after a RAID controller has rewritten a parity stripe.
Together with CHUNK_ERROR it forms the data-server-side
state-bit pair that quarantines damaged chunks from
ordinary reads during the repair window.</t>
          <t>The client provides:</t>
          <dl>
            <dt>cra_stateid:</dt>
            <dd>
              <t>the layout stateid the metadata server granted to the
repair actor.  Under trusted stateid tight coupling
(<xref target="sec-TRUST_STATEID"/>), this stateid <bcp14>MUST</bcp14> be in the
data server's trust table; otherwise the data server
rejects the operation with NFS4ERR_BAD_STATEID.</t>
            </dd>
            <dt>cra_offset:</dt>
            <dd>
              <t>starting chunk index of the repaired range (not a byte
offset).</t>
            </dd>
            <dt>cra_count:</dt>
            <dd>
              <t>number of chunks the repaired range covers, starting
at cra_offset.  The cra_offset / cra_count range <bcp14>MUST</bcp14>
match the range named in the original CHUNK_ERROR that
marked these chunks errored; mismatched ranges are
rejected with NFS4ERR_INVAL.</t>
            </dd>
            <dt>cra_owner:</dt>
            <dd>
              <t>the chunk_owner4 (<xref target="fig-chunk_owner4"/>) identifying the
repair actor.  The data server uses this to record
which actor cleared the errored state.  The reserved
sentinels CHUNK_GUARD_CLIENT_ID_NONE and
CHUNK_GUARD_CLIENT_ID_MDS <bcp14>MUST NOT</bcp14> appear in cra_owner;
see <xref target="sec-chunk_guard_none"/> and <xref target="sec-chunk_guard_mds"/>.</t>
            </dd>
          </dl>
          <t>CHUNK_REPAIRED returns a single top-level status; there is
no per-chunk status array because the data server either
accepts the confirmation for the whole range or returns a
top-level error.</t>
          <t>The data server <bcp14>MUST</bcp14> verify before accepting the
confirmation that:</t>
          <ul spacing="normal">
            <li>
              <t>every chunk in [cra_offset, cra_offset + cra_count) is
currently in the errored state, and</t>
            </li>
            <li>
              <t>every chunk in the range has been advanced to COMMITTED
by a CHUNK_WRITE_REPAIR / CHUNK_FINALIZE / CHUNK_COMMIT
sequence since the CHUNK_ERROR that marked them errored.</t>
            </li>
          </ul>
          <t>If either precondition fails, the data server returns
NFS4ERR_INVAL and the errored state is left in place.  A
repair actor that sees NFS4ERR_INVAL <bcp14>SHOULD</bcp14> verify the
chunks via CHUNK_HEADER_READ
before retrying.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
        </section>
        <section anchor="response-codes-6">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the repair confirmation has been recorded.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the layout stateid or credentials are not
permitted to confirm repair on this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>no active layout stateid for this file (or, in trusted stateid
tight coupling, the stateid is not in the trust table).  See
<xref target="sec-new-ops"/>.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>the chunks named were not in an errored state,
or the repair did not match the recorded error.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
CHUNK_REPAIRED.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_ROLLBACK">
        <name>Operation 85: CHUNK_ROLLBACK - Rollback Changes on Cached Chunk Data</name>
        <section anchor="arguments-7">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_ROLLBACK4args">
            <name>XDR for CHUNK_ROLLBACK4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_ROLLBACK4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4        cra_stateid;
   ///     offset4         cra_offset;
   ///     count4          cra_count;
   ///     chunk_owner4    cra_chunks<>;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-7">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_ROLLBACK4resok">
            <name>XDR for CHUNK_ROLLBACK4resok</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_ROLLBACK4resok {
   ///     verifier4       crr_writeverf;
   ///     nfsstat4        crr_chunk_status<>;
   /// };
]]></sourcecode>
          </figure>
          <figure anchor="fig-CHUNK_ROLLBACK4res">
            <name>XDR for CHUNK_ROLLBACK4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_ROLLBACK4res switch (nfsstat4 crr_status) {
   ///     case NFS4_OK:
   ///         CHUNK_ROLLBACK4resok   crr_resok4;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-7">
          <name>DESCRIPTION</name>
          <t>CHUNK_ROLLBACK reverts chunks from the PENDING or
FINALIZED state to their previous state, effectively
undoing a CHUNK_WRITE that has not
yet reached COMMITTED via CHUNK_COMMIT.  The reversion target is the
prior COMMITTED generation, if one exists for the
affected chunk; otherwise the chunk returns to the EMPTY
state (<xref target="fig-chunk-state-machine"/>).  CHUNK_ROLLBACK
against a chunk already in the COMMITTED state is
permitted only on the repair path; see "Rollback of
COMMITTED Chunks" below.</t>
          <t>CHUNK_ROLLBACK has no direct analog in <xref target="RFC8881"/>: NFS
WRITE has no separate finalization or commit step that a
client could undo without contacting other components.
CHUNK_ROLLBACK exists because the chunk state machine
exposes the PENDING and FINALIZED states explicitly, and
the writer needs a way to abandon a non-committed
generation without committing it.</t>
          <t>The client provides cra_offset and cra_count to bound the
chunk range, and cra_chunks to name the specific
(chunk_owner4) generations within that range to roll back:</t>
          <dl>
            <dt>cra_offset:</dt>
            <dd>
              <t>starting chunk index in the file (not a byte offset).</t>
            </dd>
            <dt>cra_count:</dt>
            <dd>
              <t>number of chunks the range covers, starting at
cra_offset.</t>
            </dd>
            <dt>cra_chunks:</dt>
            <dd>
              <t>an array of chunk_owner4 entries
(<xref target="fig-chunk_owner4"/>) naming the specific generations to roll
back.  For each entry the data server looks up the
chunk index it associated with the complete
owner triple when the
client wrote it via CHUNK_WRITE or
CHUNK_WRITE_REPAIR.  That recorded chunk index <bcp14>MUST</bcp14>
lie in [cra_offset, cra_offset + cra_count); if the
triple does not match any recorded owner association
on this data server for this file, or the recorded
chunk index lies outside the requested range, the
entry is rejected with NFS4ERR_INVAL in the
corresponding crr_chunk_status slot.  The reserved
sentinels CHUNK_GUARD_CLIENT_ID_NONE and
CHUNK_GUARD_CLIENT_ID_MDS <bcp14>MUST NOT</bcp14> appear as the
co_client_id of any cra_chunks entry; see
<xref target="sec-chunk_guard_none"/> and <xref target="sec-chunk_guard_mds"/>.</t>
            </dd>
          </dl>
          <t>The CHUNK_ROLLBACK result returns:</t>
          <dl>
            <dt>crr_writeverf:</dt>
            <dd>
              <t>a verifier identifying the data server's incarnation.
Semantics match cwr_writeverf in CHUNK_WRITE.</t>
            </dd>
            <dt>crr_chunk_status:</dt>
            <dd>
              <t>per-chunk rollback status, one entry per cra_chunks
entry, co-indexed.  NFS4_OK indicates that the named
generation was reverted (either to a retained
predecessor COMMITTED or FINALIZED generation, or to
EMPTY when no predecessor exists).  NFS4ERR_INVAL
indicates the data server holds a concrete
invalidation context that identifies the presented
triple (structurally invalid, or released by an
explicit CHUNK_ROLLBACK delete case within the
session slot's replay-cache window), or the recorded
chunk index lies outside [cra_offset, cra_offset +
cra_count).  NFS4ERR_NO_PREDECESSOR indicates the
data server holds no association for the presented
triple and no concrete invalidation context -- the
release-scope split is defined normatively at
<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>.  Other per-entry
failures use the appropriate error code; the
top-level operation status is NFS4_OK as long as the
data server could evaluate each entry.</t>
            </dd>
          </dl>
          <t>CHUNK_ROLLBACK has two principal scenarios:</t>
          <ol spacing="normal" type="1"><li>
              <t>A writer in multiple-writer mode that observed
per-chunk failures in the CHUNK_WRITE response (e.g.,
NFS4ERR_CHUNK_GUARDED on a subset of chunks) needs to
abandon the partial write before issuing CHUNK_FINALIZE
on the chunks that did succeed.  CHUNK_ROLLBACK on the
abandoned chunks releases their PENDING generation
cleanly.</t>
            </li>
            <li>
              <t>A repair actor that wrote reconstructed data via
CHUNK_WRITE_REPAIR and
subsequently discovered the reconstruction was wrong
(for example, a CRC mismatch detected during
cross-mirror verification) needs to abandon the
repair before any client commits it.</t>
            </li>
          </ol>
          <t>The data server effects the rollback as follows:</t>
          <dl>
            <dt>Chunks in PENDING with a matching chunk_owner4:</dt>
            <dd>
              <t>the data server deletes the PENDING payload and restores
the chunk to its prior state (EMPTY, or the prior COMMITTED
generation if the rollback invariant in
<xref target="sec-system-model-consistency"/> required retention).</t>
            </dd>
            <dt>Chunks in FINALIZED with a matching chunk_owner4:</dt>
            <dd>
              <t>the data server deletes the FINALIZED payload and the
persisted finalization metadata, restoring the chunk to its
prior state.</t>
            </dd>
            <dt>Chunks not in PENDING or FINALIZED at the named generation, or whose chunk_owner4 does not match:</dt>
            <dd>
              <t>the corresponding crr_chunk_status slot reports
NFS4ERR_INVAL or NFS4ERR_NO_PREDECESSOR per the
release-scope split at <xref target="sec-NFS4ERR_NO_PREDECESSOR"/>, and
the chunk is left unchanged.</t>
            </dd>
          </dl>
          <section anchor="deletion-atomicity-and-invalidated-triples">
            <name>Deletion Atomicity and Invalidated Triples</name>
            <t>CHUNK_ROLLBACK's delete case (successful rollback of a
PENDING or FINALIZED generation, or the abandonment sub-case
of the rollback of COMMITTED chunks below where a displaced
successor is discarded) removes BOTH the payload AND the
recorded owner-to-index association for that generation, in
one atomic step, per the payload/association biconditional
(<xref target="sec-system-model-payload-association-biconditional"/>).
The generation's owner triple
is then INVALIDATED at that chunk index: it names no
generation the data server holds, and no future CHUNK_WRITE
recreates an association under the same triple.</t>
            <t>A subsequent lifecycle operation (CHUNK_COMMIT, CHUNK_FINALIZE, CHUNK_ROLLBACK) that names an
invalidated triple <bcp14>MUST NOT</bcp14> be treated as resurrecting
the deleted generation; the data server <bcp14>MUST NOT</bcp14> attempt
to match the triple against any other record.  The error
returned in the corresponding per-chunk slot depends on
the release scope observable to the caller:</t>
            <ul spacing="normal">
              <li>
                <t>Within the session slot's replay-cache window of the
CHUNK_ROLLBACK that performed the delete case (or an
equivalent slotted retransmission of it), the slot
reports NFS4ERR_INVAL -- the caller could have observed
the specific invalidating operation.</t>
              </li>
              <li>
                <t>After that replay-cache window has elapsed, or for
release under any other terminal transition (lease
expiry, storage-pressure release, retention-scope
release of an already-invalidated triple), the slot
reports NFS4ERR_NO_PREDECESSOR -- the data server holds
no association for the presented triple and cannot
distinguish it from any other released generation.</t>
              </li>
            </ul>
            <t>Both errors carry the same non-resurrection guarantee
above; they differ only in what the caller can observe
about how the association was released (see
<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>).</t>
            <t>The invalidation is on the FULL owner triple, not on any
sub-part.  A client that legitimately reuses the same
co_id value under a different co_cohort_id (or against a
different co_client_id) creates a distinct triple and
therefore a distinct generation identity; that new triple
is unaffected by the earlier deletion.  This is what
allows a writer that abandoned a generation via
CHUNK_ROLLBACK to retry with a fresh co_cohort_id -- the
retry is a new generation, not a resurrection of the
deleted one.</t>
            <t>The uncertain-replay carve-out
(the CHUNK_ROLLBACK "Idempotence and Uncertain-Replay
Carve-Out" text below) is a narrow exception:
an EXACT reissue of the same CHUNK_ROLLBACK op whose
prior completion was uncertain <bcp14>MAY</bcp14> be treated as
postcondition-equivalent success when the client
independently verifies the deletion postcondition
holds.  This is separate from -- and does NOT resurrect --
the invalidated triple; it merely acknowledges that the
prior op already achieved the deletion the caller
requested.</t>
          </section>
          <section anchor="rollback-of-committed-chunks">
            <name>Rollback of COMMITTED Chunks</name>
            <t>CHUNK_ROLLBACK against a COMMITTED chunk is permitted
ONLY on the repair path, when a repair actor is
restoring a prior COMMITTED generation that another
client incorrectly advanced.  Two cases separate by
whether the predecessor generation the caller wants to
restore is still present on the data server:</t>
            <section anchor="case-a-retained-predecessor">
              <name>Case (a) -- Retained Predecessor</name>
              <t>The predecessor generation named in the cra_chunks entry is
still held by the data server (typically the prior COMMITTED
retained under the rollback invariant
(<xref target="sec-system-model-retention-scope"/>) alongside the displaced
successor, and <bcp14>MUST</bcp14> have survived with its payload+association
pair intact per the biconditional
(<xref target="sec-system-model-payload-association-biconditional"/>)).  The
data server:</t>
              <ul spacing="normal">
                <li>
                  <t>restores the retained predecessor as the current COMMITTED
generation UNDER ITS ORIGINAL owner triple (the owner triple
the predecessor was written with) -- its owner-to-index
association is preserved, so the restored generation <bcp14>MUST</bcp14>
remain recognizable to subsequent lifecycle operations by
the same triple; AND</t>
                </li>
                <li>
                  <t>atomically invalidates the displaced successor's triple via
the delete case above ("Deletion Atomicity and Invalidated
Triples") -- the displaced successor's payload+association
pair is released as one unit; a subsequent lifecycle op
naming the displaced triple returns NFS4ERR_INVAL within the
session slot's replay-cache window of this CHUNK_ROLLBACK,
and NFS4ERR_NO_PREDECESSOR after that window has elapsed,
per the release-scope split at
<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>.</t>
                </li>
              </ul>
              <t>The restore is atomic with the delete: no intermediate state
exposes both generations as current, and no intermediate state
exposes neither.</t>
            </section>
            <section anchor="case-b-predecessor-no-longer-retained">
              <name>Case (b) -- Predecessor No Longer Retained</name>
              <t>If the predecessor generation named in the cra_chunks entry is
NOT held by the data server -- its payload+association pair
was released some time earlier under the retention scope rule
(lease expiry, an earlier CHUNK_ROLLBACK delete case, or any
other terminal transition) -- the CHUNK_ROLLBACK CANNOT
restore it.  The deleted association is not recreated by any
operation defined in this document.</t>
              <t>The corresponding crr_chunk_status slot reports:</t>
              <dl>
                <dt>NFS4ERR_INVAL:</dt>
                <dd>
                  <t>when the caller has named a triple released by an explicit
CHUNK_ROLLBACK delete case within the current session slot's
replay-cache window.</t>
                </dd>
                <dt>NFS4ERR_NO_PREDECESSOR:</dt>
                <dd>
                  <t>in the ordinary case -- release under the retention scope
rule, or eventual release of an already-invalidated triple
after the delete case's replay-cache window has elapsed.
See <xref target="sec-NFS4ERR_NO_PREDECESSOR"/> for the choice between
the two codes.</t>
                </dd>
              </dl>
              <t>The caller then consults whatever fallback the deployment
provides.  A repair actor <bcp14>MAY</bcp14> reconstruct authoritative bytes
from surviving shards and issue CHUNK_WRITE_REPAIR to write a
new generation carrying those bytes under a new owner triple.
That new generation is a distinct generation for lifecycle
purposes; it is not the deleted predecessor resurrected.</t>
              <t>A client that requires the restored generation to retain the
predecessor's original owner triple, in cases where the
retention scope (<xref target="sec-system-model-retention-scope"/>) would
otherwise permit release, <bcp14>MUST</bcp14> use the metadata-server escrow
control plane (<xref target="sec-CHUNK_ESCROW_INSTALL"/> through
<xref target="sec-CHUNK_ESCROW_TAKEOVER"/>).  Escrow pins the predecessor's
payload and its owner-to-index association jointly against
that release rule for as long as the escrow-lock or a
client-owned lock adopted from it remains in continuous
custody (see <xref target="sec-composed-rollback"/>).</t>
              <t>A non-repair CHUNK_ROLLBACK against a COMMITTED chunk is
rejected with NFS4ERR_INVAL regardless of case.</t>
            </section>
          </section>
          <section anchor="stateid-and-authorization">
            <name>Stateid and Authorization</name>
            <t>Like CHUNK_COMMIT, CHUNK_ROLLBACK
carries an explicit layout stateid in cra_stateid.  The
data server authorizes CHUNK_ROLLBACK by validating
cra_stateid against the file identified by the current
filehandle: cra_stateid <bcp14>MUST</bcp14> be the layout stateid the
metadata server issued to the caller for the current
filehandle, or the special anonymous stateid (see below).
Under trusted stateid tight coupling
(<xref target="sec-TRUST_STATEID"/>), the data server rejects
CHUNK_ROLLBACK with NFS4ERR_BAD_STATEID unless
cra_stateid is present in the data server's trust table
for the current filehandle.  The explicit field ensures
that a CHUNK_ROLLBACK in its own standalone compound
(typical for retry after a failed CHUNK_WRITE cohort)
carries the authorization the data server needs.
Passing the special anonymous stateid is permitted only
when the underlying security regime authorizes an
unattributed writer.</t>
            <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
          </section>
          <section anchor="idempotence-and-uncertain-replay-carve-out">
            <name>Idempotence and Uncertain-Replay Carve-Out</name>
            <t>CHUNK_ROLLBACK is idempotent on its target: a second
CHUNK_ROLLBACK naming the same generations after the
first has succeeded finds those generations already in
the state the first produced.  Under the ordinary
per-entry rules the second call returns NFS4ERR_INVAL in
each crr_chunk_status slot within the session slot's
replay-cache window of the first call (the first call's
delete case invalidated the triples per "Deletion
Atomicity and Invalidated Triples" above, or the
retained-predecessor restore invalidated the displaced
successor's triple per "Rollback of COMMITTED Chunks"
above); after that window has elapsed the second call
returns NFS4ERR_NO_PREDECESSOR per the release-scope
split at <xref target="sec-NFS4ERR_NO_PREDECESSOR"/>.</t>
            <dl>
              <dt>Uncertain-replay carve-out:</dt>
              <dd>
                <t>When the first
CHUNK_ROLLBACK completed at the data server but its
response was lost (network error, dropped connection,
data server restart before the reply was received), the
client cannot distinguish "the op did not run" from
"the op ran and its reply was lost."  A client that
issues an EXACT REISSUE of the same CHUNK_ROLLBACK op
under these conditions <bcp14>MAY</bcp14> treat the resulting
per-chunk NFS4ERR_INVAL (within the replay-cache
window) or NFS4ERR_NO_PREDECESSOR (after the window has
elapsed) as POSTCONDITION-EQUIVALENT SUCCESS on a
slot-by-slot basis, PROVIDED all of the following hold
for that slot:</t>
              </dd>
            </dl>
            <ul spacing="normal">
              <li>
                <t>the reissue is byte-identical to the original op
(same cra_offset, same cra_count, same cra_chunks
array entry) -- a fresh op with an accidentally-matching
triple does NOT qualify;</t>
              </li>
              <li>
                <t>the prior completion is genuinely uncertain (the
client never observed a per-entry response for that
slot); AND</t>
              </li>
              <li>
                <t>the client INDEPENDENTLY verifies that the target
postcondition holds.  For the delete case, this
means observing that the named generation is absent
at the target chunk index (via CHUNK_HEADER_READ or CHUNK_READ with the retention-scope rules
understood).  For the retained-predecessor restore
case, this means observing that the predecessor's
original triple is now the current COMMITTED
generation.</t>
              </li>
            </ul>
            <t>The carve-out is narrow by construction: a fresh op
receiving NFS4ERR_INVAL or NFS4ERR_NO_PREDECESSOR never
qualifies, and a reissue that cannot verify the
postcondition also does not qualify -- the client <bcp14>MUST</bcp14>
treat the error as a terminal per-entry failure in
either case.  This prevents the carve-out from being
conflated with the underlying non-resurrection
guarantee, which is unconditional and prohibits the
data server from resurrecting any deleted generation
("Deletion Atomicity and Invalidated Triples" above).
Similar reasoning applies
to exact uncertain reissues of CHUNK_COMMIT and CHUNK_FINALIZE, which are also idempotent on
their targets under the same three predicates.</t>
          </section>
        </section>
        <section anchor="response-codes-7">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the named chunks have been rolled back.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the layout stateid or credentials are not
permitted to roll back chunks on this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>no active layout stateid for this file (or, in trusted stateid
tight coupling, the stateid is not in the trust table).  See
<xref target="sec-new-ops"/>.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>arguments named chunks not eligible for rollback
or outside the file's mirror set.</t>
            </dd>
            <dt>NFS4ERR_NO_PREDECESSOR:</dt>
            <dd>
              <t>the named predecessor has no recorded owner-to-index
association on the data server (retention scope
released it, or the delete case's replay-cache window
has elapsed).  See <xref target="sec-NFS4ERR_NO_PREDECESSOR"/> for
the split against NFS4ERR_INVAL.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
CHUNK_ROLLBACK.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_UNLOCK">
        <name>Operation 86: CHUNK_UNLOCK - Unlock Cached Chunk Data</name>
        <section anchor="arguments-8">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_UNLOCK4args">
            <name>XDR for CHUNK_UNLOCK4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_UNLOCK4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4        cua_stateid;
   ///     offset4         cua_offset;
   ///     count4          cua_count;
   ///     chunk_owner4    cua_owner;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-8">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_UNLOCK4res">
            <name>XDR for CHUNK_UNLOCK4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_UNLOCK4res switch (nfsstat4 cur_status) {
   ///     case NFS4_OK:
   ///         void;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-8">
          <name>DESCRIPTION</name>
          <t>CHUNK_UNLOCK releases the exclusive chunk-range lock
previously acquired by CHUNK_LOCK.
CHUNK_UNLOCK is loosely analogous to LOCKU (<xref section="18.12" sectionFormat="of" target="RFC8881"/>) in that it releases an exclusive guard, but it operates on
chunk-range coordinates and is matched against the chunk_owner4 that
acquired the lock rather than against an open / lock stateid.</t>
          <t>The client provides:</t>
          <dl>
            <dt>cua_stateid:</dt>
            <dd>
              <t>the layout stateid the metadata server granted for
this file.  Under trusted stateid tight coupling
(<xref target="sec-TRUST_STATEID"/>), this stateid <bcp14>MUST</bcp14> be in the
data server's trust table; otherwise the data server
rejects the operation with NFS4ERR_BAD_STATEID.</t>
            </dd>
            <dt>cua_offset:</dt>
            <dd>
              <t>starting chunk index of the range to unlock (not a
byte offset).</t>
            </dd>
            <dt>cua_count:</dt>
            <dd>
              <t>number of chunks the unlock range covers, starting at
cua_offset.  The range <bcp14>MUST</bcp14> match exactly the range
of an outstanding CHUNK_LOCK held by cua_owner;
partial-range unlock is not supported.</t>
            </dd>
            <dt>cua_owner:</dt>
            <dd>
              <t>the chunk_owner4 (<xref target="fig-chunk_owner4"/>) that holds
the lock.  The co_client_id <bcp14>MUST</bcp14> match the
chunk_owner4 that was supplied on the CHUNK_LOCK that
acquired the lock (including the case of a lock
transferred via CHUNK_LOCK_FLAGS_ADOPT, in which the
adopter's chunk_owner4 is the current holder).  The
reserved sentinel values CHUNK_GUARD_CLIENT_ID_NONE and
CHUNK_GUARD_CLIENT_ID_MDS <bcp14>MUST NOT</bcp14> appear as the
co_client_id of cua_owner; see
<xref target="sec-chunk_guard_none"/> and <xref target="sec-chunk_guard_mds"/>.
In particular, a repair actor releasing a lock it
adopted from the metadata-server escrow owner uses its own
co_client_id in cua_owner, not
CHUNK_GUARD_CLIENT_ID_MDS.</t>
            </dd>
          </dl>
          <t>The CHUNK_UNLOCK result returns a single top-level
status; there is no per-chunk status array because the
unlock either succeeds for the whole range or returns a
top-level error.</t>
          <t>CHUNK_UNLOCK is idempotent in the sense that releasing
chunks that are not currently locked returns NFS4_OK
without effect.  Releasing chunks that are locked by a
different cua_owner returns NFS4ERR_INVAL and leaves the
lock in place.</t>
          <t>A client <bcp14>SHOULD</bcp14> issue CHUNK_UNLOCK promptly after
completing the write, write-repair, or commit sequence
that the lock guarded.  Locks not explicitly released
are released implicitly when the holder's lease expires;
if the metadata server has revoked the holder's stateid
via REVOKE_STATEID before the
lease lapses, the lock transitions to the metadata-server escrow
owner per the lock-continuity invariant in
<xref target="sec-system-model-consistency"/> rather than being
released outright.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
        </section>
        <section anchor="response-codes-8">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the named chunks have been unlocked, or no lock was
held (idempotent).</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the layout stateid or credentials are not
permitted to unlock chunks on this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>no active layout stateid for this file (or, in trusted stateid
tight coupling, the stateid is not in the trust table).  See
<xref target="sec-new-ops"/>.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>arguments named chunks not in a locked state
owned by this caller.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
CHUNK_UNLOCK.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_WRITE">
        <name>Operation 87: CHUNK_WRITE - Write Chunks to File</name>
        <section anchor="arguments-9">
          <name>ARGUMENTS</name>
          <figure anchor="fig-write_chunk_guard4">
            <name>XDR for write_chunk_guard4</name>
            <sourcecode type="xdr"><![CDATA[
   /// union write_chunk_guard4 switch (bool cwg_check) {
   ///     case TRUE:
   ///         chunk_guard4   cwg_guard;
   ///     case FALSE:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
          <figure anchor="fig-CHUNK_WRITE4args">
            <name>XDR for CHUNK_WRITE4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// const CHUNK_WRITE_FLAGS_ACTIVATE_IF_EMPTY = 0x00000001;
   ///
   /// struct CHUNK_WRITE4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4           cwa_stateid;
   ///     offset4            cwa_offset;
   ///     stable_how4        cwa_stable;
   ///     chunk_cohort_id4   cwa_cohort_id;
   ///     uint32_t           cwa_client_id;
   ///     uint32_t           cwa_co_ids<>;
   ///     uint32_t           cwa_payload_id;
   ///     uint32_t           cwa_flags;
   ///     write_chunk_guard4 cwa_guard;
   ///     uint32_t           cwa_chunk_size;
   ///     checksum4          cwa_checksums<>;
   ///     opaque             cwa_chunks<>;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-9">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_WRITE4resok">
            <name>XDR for CHUNK_WRITE4resok</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_WRITE4resok {
   ///     count4          cwr_count;
   ///     stable_how4     cwr_committed;
   ///     verifier4       cwr_writeverf;
   ///     nfsstat4        cwr_block_status<>;
   ///     bool            cwr_block_activated<>;
   ///     chunk_owner4    cwr_owners<>;
   /// };
]]></sourcecode>
          </figure>
          <figure anchor="fig-CHUNK_WRITE4res">
            <name>XDR for CHUNK_WRITE4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_WRITE4res switch (nfsstat4 cwr_status) {
   ///     case NFS4_OK:
   ///         CHUNK_WRITE4resok    cwr_resok4;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-9">
          <name>DESCRIPTION</name>
          <t>The CHUNK_WRITE operation is based upon the NFSv4.1 WRITE
operation (see <xref section="18.32" sectionFormat="of" target="RFC8881"/>) and similarly
writes data to the regular file identified by the current
filehandle, with the difference that CHUNK_WRITE operates
on the chunk coordinate system used by Flexible File
Version 2 layouts rather than on the byte coordinate
system.  Successful chunk writes initially enter the
PENDING state in the chunk state machine
(<xref target="fig-chunk-state-machine"/>); a subsequent CHUNK_FINALIZE and CHUNK_COMMIT (or the activation shortcut
described below) progress them to COMMITTED.</t>
          <t>The client provides a cwa_offset of where the CHUNK_WRITE
is to start and a payload consisting of one or more chunks
packed into the cwa_chunks opaque field.  cwa_offset is
the starting chunk index in the file (not a byte offset);
each chunk occupies cwa_chunk_size bytes within cwa_chunks
except the last, which <bcp14>MAY</bcp14> be shorter when the file size
is not chunk-aligned or when the payload encodes a
variable-size Mojette parity shard
(<xref target="sec-mojette-encoding"/>).  The number of chunks in the
payload is ceil(len(cwa_chunks) / cwa_chunk_size).</t>
          <t>The writer supplies the cohort identity of the payload in
compact form: cwa_cohort_id carries the shared
chunk_cohort_id4 for every chunk in the batch, cwa_client_id
carries the writer's layout-granted identity, and cwa_co_ids
is an array of writer-chosen opaque per-chunk co_id values,
one per chunk in the payload (see <xref target="sec-chunk_owner4"/>).
The full cohort triple recorded on the data server for the
chunk at zero-based position i within the payload is
<tt>(cwa_cohort_id, cwa_client_id, cwa_co_ids[i])</tt>.</t>
          <t><tt>cwa_client_id</tt> identifies the writer.  It is
client-presented, metadata-server-assigned: the client presents the
32-bit layout-granted identity that the metadata server
established in ffv2m_client_id (see <xref target="sec-ffv2-mirror4"/>) at
layout-grant time; the client <bcp14>MUST NOT</bcp14> substitute any other
value.  Because encodings that use CHUNK operations require tight coupling
(<xref target="sec-ff_device_addr4"/>), the data server always has an
authoritative binding for this identity: the metadata server
registers it via tsa_client_id in TRUST_STATEID alongside the layout stateid.  The
data server <bcp14>MUST</bcp14> compare cwa_client_id against the
tsa_client_id recorded in its trust table for the presented
layout stateid, and <bcp14>MUST</bcp14> reject a mismatch with
NFS4ERR_BAD_STATEID: a client that presents a cwa_client_id
different from its layout's ffv2m_client_id is spoofing
another writer's identity.  <tt>cwa_client_id</tt> <bcp14>MUST NOT</bcp14> be the
reserved sentinels CHUNK_GUARD_CLIENT_ID_NONE or
CHUNK_GUARD_CLIENT_ID_MDS (see <xref target="sec-chunk_guard_none"/> and
<xref target="sec-chunk_guard_mds"/>); those sentinels are reserved for
data-server-observed cg_client_id values in chunk_guard4
CAS state, not for use as a writer's own identity.
<tt>cwa_cohort_id</tt> is the writer's opaque per-transaction
identifier, shared by every chunk in the payload; the
writer chooses a new <tt>cwa_cohort_id</tt> per distinct write
transaction so that lifecycle operations can distinguish
transactions across all data files (see the discussion of
chunk_cohort_id4 in <xref target="sec-chunk_guard4"/>).  The
per-chunk CAS state (chunk_guard4) is carried separately
via cwa_guard.cwg_guard when compare-and-swap is required
(<xref target="sec-multi-writer"/>).</t>
          <t><tt>cwa_co_ids&lt;&gt;</tt> contains exactly one entry per chunk in the
payload (i.e., <tt>cwa_co_ids_len</tt> <bcp14>MUST</bcp14> equal
<tt>ceil(len(cwa_chunks) / cwa_chunk_size)</tt>); the data server
rejects any other length with NFS4ERR_INVAL.  Within a
single <tt>(cwa_cohort_id, cwa_client_id)</tt>, the <tt>cwa_co_ids</tt>
values in this request <bcp14>MUST</bcp14> be distinct so that lifecycle
operations (CHUNK_FINALIZE, CHUNK_COMMIT, CHUNK_ROLLBACK)
can name individual chunks unambiguously by full triple.  The data
server treats each <tt>cwa_co_ids[i]</tt> as opaque; it does NOT
interpret the value beyond equality comparison, and it <bcp14>MUST
NOT</bcp14> require <tt>cwa_co_ids[i]</tt> to equal <tt>cwa_offset + i</tt> or
any other derived index.  A writer that finds it convenient
to use monotonic per-writer serials or file-index-derived
values <bcp14>MAY</bcp14> do so, but the wire semantics do not privilege
that choice.</t>
          <t>cwa_payload_id is a writer-chosen identifier that lets a
repair coordinator correlate chunks of the same logical
write across data servers.</t>
          <t>cwa_checksums, when non-empty, <bcp14>MUST</bcp14> contain one checksum
entry per chunk in the payload.  Each entry's cs_algorithm
<bcp14>MUST</bcp14> match ffv2m_checksum_algorithm of the mirror named in
the layout (see <xref target="sec-ffv2-mirror4"/>); a mismatch is rejected
with NFS4ERR_INVAL.  The data server validates each chunk's
checksum at CHUNK_WRITE time and rejects mismatched chunks
with NFS4ERR_IO in the corresponding cwr_block_status slot.
An empty cwa_checksums array (cwa_checksums_len = 0)
indicates the client did not supply per-chunk checksums; the
data server still computes and persists per-chunk checksums
from the payload bytes for later integrity verification but
cannot detect transport corruption at CHUNK_WRITE time
without the client's
reference values.</t>
          <t>cwa_flags carries CHUNK_WRITE_FLAGS_ACTIVATE_IF_EMPTY (see
"Stability and Activation" below).</t>
          <t>cwa_guard (<xref target="fig-write_chunk_guard4"/>) controls the chunk-guard
CAS check (see "Guarding the Write" below).</t>
          <t>A cwa_offset of zero starts writing at the first chunk of
the file.  Unlike READ in <xref target="RFC8881"/>, a CHUNK_WRITE whose
cwa_offset extends beyond the current end of the file is
not an error: the data server extends the file's chunk
store to cover the new chunks, with intervening offsets
remaining EMPTY (<xref target="sec-system-model-chunk-state"/>) until
they too are written.  If the cwa_chunks payload is empty
(zero bytes), the CHUNK_WRITE succeeds and writes zero
chunks (cwr_count = 0).</t>
          <t>In all situations the data server <bcp14>MAY</bcp14> choose to write
fewer chunks than the client requested; the client must be
prepared to handle a short write and reissue CHUNK_WRITE
for the remaining chunks.</t>
          <t>The CHUNK_WRITE result includes per-chunk outcomes in
cwr_block_status, cwr_block_activated, and cwr_owners, all
co-indexed and one entry per chunk in the payload:</t>
          <dl>
            <dt>cwr_count:</dt>
            <dd>
              <t>the number of chunks the data server successfully
accepted.  Chunks that failed their guard check, checksum
check, or any other local precondition do not
contribute to cwr_count.</t>
            </dd>
            <dt>cwr_committed:</dt>
            <dd>
              <t>the stable_how4 level the data server actually applied
for accepted chunks.  This <bcp14>MUST</bcp14> be at least as durable
as cwa_stable; see "Stability and Activation" below.</t>
            </dd>
            <dt>cwr_writeverf:</dt>
            <dd>
              <t>a verifier identifying the data server's incarnation.
A client uses cwr_writeverf to detect a data server
restart that lost UNSTABLE4 writes: if the client's
subsequent CHUNK_COMMIT returns a different writeverf
than was returned by an UNSTABLE4 CHUNK_WRITE earlier,
the chunks may have been lost and the client <bcp14>SHOULD</bcp14>
re-issue CHUNK_WRITE.  cwr_writeverf changes on every
data server restart that loses uncommitted state.</t>
            </dd>
            <dt>cwr_block_status:</dt>
            <dd>
              <t>per-chunk acceptance status; see "Per-Block Acceptance
Semantics" below.</t>
            </dd>
            <dt>cwr_block_activated:</dt>
            <dd>
              <t>per-chunk activation flag.  TRUE indicates that the
chunk is COMMITTED on return from CHUNK_WRITE -- the
activation shortcut described under "Stability and
Activation" below.  FALSE indicates that the chunk is
in the PENDING state and requires a subsequent
CHUNK_FINALIZE and CHUNK_COMMIT to become COMMITTED.</t>
            </dd>
            <dt>cwr_owners:</dt>
            <dd>
              <t>per-chunk chunk_owner4 the data server recorded, one
entry per chunk in the payload (co-indexed with
cwa_co_ids and cwr_block_status).  Each entry is the
complete cohort triple <tt>(cwa_cohort_id, cwa_client_id,
cwa_co_ids[i])</tt> that the data server recorded (or, for
a rejected slot, the requested triple echoed for
positional correlation with the failure status in
<tt>cwr_block_status[i]</tt>).  The data server does NOT
synthesize per-chunk identity by modifying the writer's
cohort; the returned triple is the value the client
supplied, so a client that lost track of its own
transmitted co_ids array can recover the data server's
view.  Under the compact carrier the cohort pair
(cwa_cohort_id, cwa_client_id) is shared across every
returned entry -- the per-chunk distinction is carried
entirely by the co_id.</t>
            </dd>
          </dl>
          <t>Except when special stateids are used, cwa_stateid
represents a layout stateid returned by a prior LAYOUTGET
against the metadata server (see <xref section="18.43" sectionFormat="of" target="RFC8881"/>) that
authorizes write access to this file. Under trusted stateid tight
coupling (<xref target="sec-TRUST_STATEID"/>), the data server additionally checks
that the metadata server has registered the stateid via TRUST_STATEID;
an unregistered stateid (other than a special stateid) returns
NFS4ERR_BAD_STATEID.</t>
          <t>For a CHUNK_WRITE with a cwa_stateid value of all bits
equal to zero, the data server <bcp14>MAY</bcp14> allow the CHUNK_WRITE
to be serviced subject to any CHUNK_LOCK currently held
on the target chunks.  For a CHUNK_WRITE with a
cwa_stateid value of all bits equal to one, the data
server <bcp14>MAY</bcp14> allow CHUNK_WRITE to bypass lock-state
checking at the data server.  These special-stateid
behaviors mirror the corresponding WRITE semantics in
<xref target="RFC8881"/> adapted to the chunk-locking model
(<xref target="sec-CHUNK_LOCK"/>) rather than the byte range locking
model of <xref section="12." sectionFormat="of" target="RFC8881"/></t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
          <section anchor="stability-and-activation">
            <name>Stability and Activation</name>
            <t>The cwa_stable field controls the durability level the
data server guarantees before returning.  The durability
floor for each level covers BOTH the chunk payload AND
its owner-to-index association, so a subsequent
lifecycle operation naming the full owner triple can
locate the recorded chunk index; see
<xref target="sec-system-model-owner-persistence"/> for the normative
coupling rule and the "<bcp14>MUST NOT</bcp14> retain payload without
association" invariant.</t>
            <dl>
              <dt>FILE_SYNC4:</dt>
              <dd>
                <t>The data server <bcp14>MUST</bcp14> commit all written chunks plus
all chunk-store metadata to stable storage before
returning.</t>
              </dd>
              <dt>DATA_SYNC4:</dt>
              <dd>
                <t>The data server <bcp14>MUST</bcp14> commit all written chunk payloads
to stable storage and enough of the chunk-store
metadata to retrieve the data before returning.  An
implementation <bcp14>MAY</bcp14> treat DATA_SYNC4 identically to
FILE_SYNC4 at a possible performance cost.</t>
              </dd>
              <dt>UNSTABLE4:</dt>
              <dd>
                <t>The data server is free to commit any portion of the
chunk payload and metadata to stable storage before
returning, including all or none.  The data server
makes only two guarantees: it will not destroy any
chunk payload it accepted without changing
cwr_writeverf, and the durability level it ultimately
applies will not be less than that requested.</t>
              </dd>
            </dl>
            <t>The CHUNK_WRITE_FLAGS_ACTIVATE_IF_EMPTY flag in cwa_flags
requests an activation shortcut for first-time writes: a
chunk that was EMPTY before the CHUNK_WRITE and whose
write reaches FILE_SYNC4 or DATA_SYNC4 durability <bcp14>MAY</bcp14> be
transitioned directly to COMMITTED by the data server,
with the corresponding cwr_block_activated entry set to
TRUE in the response.
Without the flag, or for chunks that were not EMPTY
before the write, or for writes at UNSTABLE4 durability,
the chunk enters the PENDING state and reaches COMMITTED
only after a subsequent CHUNK_FINALIZE and CHUNK_COMMIT.</t>
            <t>The activation shortcut interacts with concurrent writers
and unstable writes in subtle ways:</t>
            <ul spacing="normal">
              <li>
                <t>A chunk written with cwa_stable = UNSTABLE4 cannot be
activated by CHUNK_WRITE_FLAGS_ACTIVATE_IF_EMPTY
because the payload has not been committed to stable
storage; the chunk enters the PENDING state regardless
of the flag.</t>
              </li>
              <li>
                <t>In the multi-writer mode (<xref target="sec-multi-writer"/>) a
client <bcp14>MUST NOT</bcp14> set CHUNK_WRITE_FLAGS_ACTIVATE_IF_EMPTY
on any CHUNK_WRITE.  The activation shortcut bypasses
CHUNK_FINALIZE, so a chunk that reached COMMITTED via
the shortcut cannot be reverted by the loser's
CHUNK_ROLLBACK flow described in
<xref target="sec-chunk_guard4"/>; two racing writers whose EMPTY
activations landed on disjoint subsets of the mirror set
would leave the stripe permanently non-atomic with no
protocol path to recovery.  A data server that receives
a multi-writer-mode CHUNK_WRITE with
CHUNK_WRITE_FLAGS_ACTIVATE_IF_EMPTY set <bcp14>MUST</bcp14> reject the
request with NFS4ERR_INVAL in the corresponding
cwr_block_status slot; the client <bcp14>MUST</bcp14> re-issue without
the flag, allowing the chunk to enter PENDING and
proceed through the standard CHUNK_FINALIZE +
CHUNK_COMMIT path.  The shortcut remains available in
single writer mode where CAS contention cannot arise.</t>
              </li>
              <li>
                <t>A client that issues an UNSTABLE4 CHUNK_WRITE and
observes a FALSE entry in cwr_block_activated for a
chunk <bcp14>MAY</bcp14> still find that chunk COMMITTED on a
subsequent CHUNK_READ -- another client could have
activated it via the shortcut after this one's
response was sent.  cwr_block_activated reflects the
state at the moment the CHUNK_WRITE result was
constructed, not a commitment to that state's
persistence.</t>
              </li>
            </ul>
          </section>
          <section anchor="guarding-the-write">
            <name>Guarding the Write</name>
            <t>A guarded CHUNK_WRITE is when the writing of a block <bcp14>MUST</bcp14> fail if
cwa_guard.cwg_check is TRUE and the target chunk does not have the
same cg_gen_id as cwa_guard.cwg_guard.cg_gen_id.  This is
useful in read-update-write scenarios.  The client reads a block,
updates it, and is prepared to write it back.  It guards the write
such that if another writer has modified the block, the data server
will reject the modification.</t>
            <t>As the chunk_guard4 (see <xref target="fig-chunk_guard4"/>) does not have a
chunk_id and the CHUNK_WRITE applies to all blocks in the range of
cwa_offset to the length of cwa_data, then each of the target blocks
<bcp14>MUST</bcp14> have the same cg_gen_id and cg_client_id.  The client <bcp14>SHOULD</bcp14>
present the smallest set of blocks as possible to meet this
requirement.</t>
          </section>
          <section anchor="per-block-acceptance-semantics">
            <name>Per-Block Acceptance Semantics</name>
            <t>A CHUNK_WRITE targets a contiguous range of blocks on a single
data server.  The data server evaluates each block independently
and reports the outcome per block in cwr_block_status (see
<xref target="fig-CHUNK_WRITE4resok"/>):</t>
            <ul spacing="normal">
              <li>
                <t>Each block is subjected to the guard check (when
cwa_guard.cwg_check is TRUE), the cg_client_id validation
(see <xref target="sec-chunk_guard4"/>), and any other local preconditions
(storage-space limits, tight coupling trust-table state,
etc.).</t>
              </li>
              <li>
                <t>Blocks that pass their preconditions are written and their
cwr_block_status entry is NFS4_OK.  Blocks that fail produce
the appropriate error code
(NFS4ERR_CHUNK_GUARDED, NFS4ERR_NOSPC, etc.) in the
corresponding cwr_block_status slot, and their data is
NOT persisted.</t>
              </li>
              <li>
                <t>cwr_count reflects only the blocks that were written
successfully; failed blocks do not contribute.</t>
              </li>
              <li>
                <t>The top-level cwr_status is NFS4_OK when the call itself was
structurally valid and the data server could evaluate each
block.  Per-block failures are reported in cwr_block_status,
not by failing the whole operation.  The data server returns
a top-level error only if it could not evaluate the request
at all.</t>
              </li>
            </ul>
            <t>This is the "continue and report" discipline.  It is
intentionally not all-or-none: atomicity is already per-chunk
(see <xref target="sec-system-model-consistency"/>), so there is no
file-level correctness reason to reject the entire compound
because of a single chunk guard failure.  Per-block reporting
gives the client the information it needs to construct a
targeted CHUNK_ROLLBACK or CHUNK_WRITE retry that covers only
the blocks that failed.</t>
            <t>The data server does not hold a file-wide lock across the
per-block evaluation.  The chunk_guard4 CAS is evaluated
atomically per chunk at the point the data server updates that
chunk's state, so an interleaving CHUNK_WRITE from a different
client that arrives mid-compound will either win its own CAS
race (and the losing client sees NFS4ERR_CHUNK_GUARDED for the
contested block) or be rejected itself, without introducing
data-server-level locking beyond the per-chunk scope.</t>
          </section>
        </section>
        <section anchor="response-codes-9">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the chunks have been written and are in the PENDING
state.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the layout stateid or credentials are not
permitted to write to this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>no active layout stateid for this file (or, in trusted stateid
tight coupling, the stateid is not in the trust table).  See
<xref target="sec-new-ops"/>.</t>
            </dd>
            <dt>NFS4ERR_CHUNK_GUARDED:</dt>
            <dd>
              <t>the chunk_guard4 condition supplied by
the client did not match the persisted state.</t>
            </dd>
            <dt>NFS4ERR_CHUNK_LOCKED:</dt>
            <dd>
              <t>one or more chunks in the requested
range are locked by another writer.</t>
            </dd>
            <dt>NFS4ERR_DELAY:</dt>
            <dd>
              <t>the data server is temporarily unable to process
the request.</t>
            </dd>
            <dt>NFS4ERR_FHEXPIRED:</dt>
            <dd>
              <t>the current filehandle has expired.</t>
            </dd>
            <dt>NFS4ERR_IO:</dt>
            <dd>
              <t>an I/O error occurred while persisting the chunks.</t>
            </dd>
            <dt>NFS4ERR_NOSPC:</dt>
            <dd>
              <t>there is insufficient space at the data server.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement CHUNK_WRITE.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
            <dt>NFS4ERR_STALE:</dt>
            <dd>
              <t>the current filehandle no longer identifies a
valid file.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_WRITE_REPAIR">
        <name>Operation 88: CHUNK_WRITE_REPAIR - Write Repaired Cached Chunk Data</name>
        <section anchor="arguments-10">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_WRITE_REPAIR4args">
            <name>XDR for CHUNK_WRITE_REPAIR4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_WRITE_REPAIR4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4           cwra_stateid;
   ///     offset4            cwra_offset;
   ///     stable_how4        cwra_stable;
   ///     chunk_cohort_id4   cwra_cohort_id;
   ///     uint32_t           cwra_client_id;
   ///     uint32_t           cwra_co_ids<>;
   ///     uint32_t           cwra_payload_id;
   ///     uint32_t           cwra_chunk_size;
   ///     checksum4          cwra_checksums<>;
   ///     opaque             cwra_chunks<>;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-10">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_WRITE_REPAIR4resok">
            <name>XDR for CHUNK_WRITE_REPAIR4resok</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_WRITE_REPAIR4resok {
   ///     count4          cwrr_count;
   ///     stable_how4     cwrr_committed;
   ///     verifier4       cwrr_writeverf;
   ///     nfsstat4        cwrr_block_status<>;
   ///     chunk_owner4    cwrr_owners<>;
   /// };
]]></sourcecode>
          </figure>
          <figure anchor="fig-CHUNK_WRITE_REPAIR4res">
            <name>XDR for CHUNK_WRITE_REPAIR4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_WRITE_REPAIR4res switch (nfsstat4 cwrr_status) {
   ///     case NFS4_OK:
   ///         CHUNK_WRITE_REPAIR4resok   cwrr_resok4;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-10">
          <name>DESCRIPTION</name>
          <t>CHUNK_WRITE_REPAIR is the repair-path variant of CHUNK_WRITE.  It writes reconstructed chunk data
to a data server whose chunks have been reported errored
(via CHUNK_ERROR, see <xref target="sec-CHUNK_ERROR"/>) or to a
replacement data server selected during whole-file repair.
The data server applies repair-specific policies to the
write that are not appropriate for normal client writes:
the chunk_guard4 CAS check is bypassed (the repair actor
is writing a reconstructed value rather than competing in
a multiple-writer race), and the data server <bcp14>MAY</bcp14> log the
repair separately for operator audit.</t>
          <t>CHUNK_WRITE_REPAIR has no direct analog in <xref target="RFC8881"/>; it
is the chunk-protocol equivalent of writing reconstructed
data into a RAID stripe whose other members are known
healthy.  The reconstructed data is produced by the repair
client from surviving shards via the erasure-coding
algorithm of the file's layout.</t>
          <t>The repair workflow that invokes CHUNK_WRITE_REPAIR is:</t>
          <ol spacing="normal" type="1"><li>
              <t>The repair actor (selected per
<xref target="sec-repair-selection"/>) reads surviving chunks from
the remaining data servers via CHUNK_READ.</t>
            </li>
            <li>
              <t>The repair actor reconstructs the missing chunks
using the erasure-coding algorithm of the file's
layout.</t>
            </li>
            <li>
              <t>The repair actor acquires a CHUNK_LOCK on the target data server to
prevent concurrent writes during repair.  For repair
that adopts a metadata-server escrow lock, the CHUNK_LOCK
carries CHUNK_LOCK_FLAGS_ADOPT
(<xref target="sec-chunk_guard_mds"/>).</t>
            </li>
            <li>
              <t>The repair actor writes the reconstructed data via
CHUNK_WRITE_REPAIR.</t>
            </li>
            <li>
              <t>The repair actor issues CHUNK_FINALIZE and CHUNK_COMMIT to persist the repair.</t>
            </li>
            <li>
              <t>The repair actor issues CHUNK_REPAIRED to clear the errored state.</t>
            </li>
            <li>
              <t>The repair actor releases the lock via CHUNK_UNLOCK.</t>
            </li>
          </ol>
          <t>CHUNK_WRITE_REPAIR is also the fallback path used by a
client that received NFS4ERR_NO_PREDECESSOR
(<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>) from CHUNK_ROLLBACK's
restore case (<xref target="sec-CHUNK_ROLLBACK"/> "Rollback of
COMMITTED Chunks", case (b)) -- the named predecessor was
released under the retention scope
(<xref target="sec-system-model-retention-scope"/>) and CHUNK_ROLLBACK
cannot restore it.  Under this fallback the client
reconstructs authoritative bytes from surviving shards
(or from any other authoritative source it holds) and
writes them via CHUNK_WRITE_REPAIR under a new owner
triple of its own choosing.  The result is a distinct
generation for lifecycle purposes: it carries the
repair actor's own owner triple,
NOT the released predecessor's triple.  The released
predecessor is not resurrected by any operation defined
in this document, including this fallback; a subsequent
lifecycle operation naming the released predecessor's
triple returns NFS4ERR_NO_PREDECESSOR under the release-scope
split at <xref target="sec-NFS4ERR_NO_PREDECESSOR"/> -- the
predecessor was released under the retention scope, not
by an explicit CHUNK_ROLLBACK delete case within a live
replay-cache window.  A client that requires the
restored generation to carry the released predecessor's
original triple <bcp14>MUST</bcp14> use a guaranteed-pinning mechanism
as noted in <xref target="sec-NFS4ERR_NO_PREDECESSOR"/>, since
CHUNK_WRITE_REPAIR's semantics only produce a new
generation.  When no authoritative source exists for
reconstruction, the fallback itself may terminate at
NFS4ERR_PAYLOAD_LOST (<xref target="sec-NFS4ERR_PAYLOAD_LOST"/>)
via CB_CHUNK_REPAIR.</t>
          <t>The arguments mirror CHUNK_WRITE except that
CHUNK_WRITE_REPAIR has no cwa_flags field (the
activation-shortcut behavior is not offered on the repair
path) and no cwa_guard field (the guard CAS is bypassed
by construction):</t>
          <dl>
            <dt>cwra_stateid:</dt>
            <dd>
              <t>the layout stateid the metadata server granted to the
repair actor.  Under trusted stateid tight coupling
(<xref target="sec-TRUST_STATEID"/>), this stateid <bcp14>MUST</bcp14> be in the
data server's trust table; otherwise the data server
rejects the operation with NFS4ERR_BAD_STATEID.</t>
            </dd>
            <dt>cwra_offset:</dt>
            <dd>
              <t>starting chunk index in the file (not a byte offset).</t>
            </dd>
            <dt>cwra_stable:</dt>
            <dd>
              <t>the stable_how4 durability level the data server <bcp14>MUST</bcp14>
apply before returning.  Semantics match cwa_stable in
CHUNK_WRITE (see <xref target="sec-CHUNK_WRITE"/> "Stability and
Activation").</t>
            </dd>
            <dt>cwra_cohort_id / cwra_client_id / cwra_co_ids:</dt>
            <dd>
              <t>the compact cohort-identity carrier the repair actor
uses for the reconstructed payload, mirroring
CHUNK_WRITE's cwa_cohort_id + cwa_client_id + cwa_co_ids
per <xref target="sec-CHUNK_WRITE"/>.  cwra_cohort_id carries the
shared chunk_cohort_id4 for every reconstructed chunk
in the batch; cwra_client_id is the repair actor's
layout-granted identity; cwra_co_ids is a co-indexed
array of writer-chosen opaque co_id values, one per
chunk in cwra_chunks (exactly <tt>ceil(len(cwra_chunks) /
cwra_chunk_size)</tt> entries; a length mismatch is
rejected with NFS4ERR_INVAL).  The full cohort triple
for reconstructed chunk position i is
<tt>(cwra_cohort_id, cwra_client_id, cwra_co_ids[i])</tt>.
cwra_client_id <bcp14>MUST</bcp14> be the repair actor's own
ffv2m_client_id (not CHUNK_GUARD_CLIENT_ID_MDS); the
cwra_cohort_id is the repair actor's locally chosen
per-transaction opaque identifier.  The reserved
sentinels CHUNK_GUARD_CLIENT_ID_NONE and
CHUNK_GUARD_CLIENT_ID_MDS <bcp14>MUST NOT</bcp14> appear in
cwra_client_id; see <xref target="sec-chunk_guard_none"/> and
<xref target="sec-chunk_guard_mds"/>.  Within a single
(cwra_cohort_id, cwra_client_id), the cwra_co_ids
values <bcp14>MUST</bcp14> be distinct so that lifecycle operations
can name individual reconstructed chunks unambiguously
by full triple.</t>
            </dd>
            <dt>cwra_payload_id:</dt>
            <dd>
              <t>the payload-id the repair actor associates with the
reconstructed payload, used by the repair coordinator
to correlate this repair across mirrors.</t>
            </dd>
            <dt>cwra_chunk_size:</dt>
            <dd>
              <t>the nominal chunk size of the reconstructed payload,
in bytes.</t>
            </dd>
            <dt>cwra_checksums:</dt>
            <dd>
              <t>per-chunk checksum4 (<xref target="sec-checksum4"/>) array.  Semantics
match cwa_checksums in CHUNK_WRITE: each entry's
cs_algorithm <bcp14>MUST</bcp14> match ffv2m_checksum_algorithm of the
mirror named in the layout
(<xref target="sec-ffv2-mirror4"/>), with NFS4ERR_INVAL on mismatch.</t>
            </dd>
            <dt>cwra_chunks:</dt>
            <dd>
              <t>the reconstructed chunk payload as an opaque blob,
packed identically to cwa_chunks in CHUNK_WRITE.</t>
            </dd>
          </dl>
          <t>The CHUNK_WRITE_REPAIR result reports per-chunk outcomes:</t>
          <dl>
            <dt>cwrr_count:</dt>
            <dd>
              <t>the number of chunks the data server successfully
accepted.</t>
            </dd>
            <dt>cwrr_committed:</dt>
            <dd>
              <t>the stable_how4 level the data server actually applied.
<bcp14>MUST</bcp14> be at least as durable as cwra_stable.</t>
            </dd>
            <dt>cwrr_writeverf:</dt>
            <dd>
              <t>a verifier identifying the data server's incarnation.
Semantics match cwr_writeverf in CHUNK_WRITE.</t>
            </dd>
            <dt>cwrr_block_status:</dt>
            <dd>
              <t>per-chunk acceptance status, one entry per chunk in
the payload, co-indexed with cwra_co_ids and
cwrr_owners.  The top-level CHUNK_WRITE_REPAIR status
is NFS4_OK as long as the data server could evaluate
each chunk; per-chunk failures are reported in
cwrr_block_status rather than by failing the whole
operation.</t>
            </dd>
            <dt>cwrr_owners:</dt>
            <dd>
              <t>per-chunk chunk_owner4 the data server recorded, one
entry per chunk in the payload (co-indexed with
cwra_co_ids and cwrr_block_status).  Each entry is
the complete cohort triple
<tt>(cwra_cohort_id, cwra_client_id, cwra_co_ids[i])</tt>
that the data server recorded (or, for a rejected
slot, the requested triple echoed for positional
correlation with the failure status in
<tt>cwrr_block_status[i]</tt>).  The data server does NOT
synthesize per-chunk identity by modifying the
repair actor's cohort.</t>
            </dd>
          </dl>
          <t>The target chunks <bcp14>SHOULD</bcp14> be in the errored state (set by
a prior CHUNK_ERROR) or EMPTY.  If a target chunk is
COMMITTED with valid data, the data server <bcp14>MAY</bcp14> reject the
repair-write with NFS4ERR_INVAL in the corresponding
cwrr_block_status slot to prevent overwriting good data;
the repair actor <bcp14>SHOULD</bcp14> re-verify the chunk before
attempting another repair-write on the same range.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
        </section>
        <section anchor="response-codes-10">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the repair-write succeeded.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the layout stateid or credentials are not
permitted to write repair data to this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>no active layout stateid for this file (or, in trusted stateid
tight coupling, the stateid is not in the trust table).  See
<xref target="sec-new-ops"/>.</t>
            </dd>
            <dt>NFS4ERR_DELAY:</dt>
            <dd>
              <t>the data server is temporarily unable to process
the request.</t>
            </dd>
            <dt>NFS4ERR_FHEXPIRED:</dt>
            <dd>
              <t>the current filehandle has expired.</t>
            </dd>
            <dt>NFS4ERR_IO:</dt>
            <dd>
              <t>an I/O error occurred while persisting the repair
data.</t>
            </dd>
            <dt>NFS4ERR_NOSPC:</dt>
            <dd>
              <t>there is insufficient space at the data server.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
CHUNK_WRITE_REPAIR.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
            <dt>NFS4ERR_STALE:</dt>
            <dd>
              <t>the current filehandle no longer identifies a
valid file.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-TRUST_STATEID">
        <name>Operation 89: TRUST_STATEID - Register Layout Stateid on Data Server</name>
        <section anchor="arguments-11">
          <name>ARGUMENTS</name>
          <figure anchor="fig-TRUST_STATEID4args">
            <name>XDR for TRUST_STATEID4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct TRUST_STATEID4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4        tsa_layout_stateid;
   ///     uint32_t        tsa_client_id;
   ///     layoutiomode4   tsa_iomode;
   ///     nfstime4        tsa_expire;
   ///     utf8str_cs      tsa_principal;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-11">
          <name>RESULTS</name>
          <figure anchor="fig-TRUST_STATEID4res">
            <name>XDR for TRUST_STATEID4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union TRUST_STATEID4res switch (nfsstat4 tsr_status) {
   ///     case NFS4_OK:
   ///         void;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-11">
          <name>DESCRIPTION</name>
          <t>TRUST_STATEID registers a layout stateid with the data
server so that subsequent CHUNK operations presenting that
stateid can be validated against the data server's per-file
trust table.  The registration also binds the stateid to the
ffv2m_client_id (tsa_client_id) the metadata server assigned
to the client at LAYOUTGET time; the data server uses that
binding to authorize the writer identity carried in
cwa_client_id on CHUNK_WRITE and in cg_client_id in any
chunk_guard4 CAS (<xref target="sec-chunk_guard4"/>).  TRUST_STATEID is
the mechanism by which tight coupling (see
<xref target="sec-tight-coupling-control"/>) is established between the
metadata server and the data server for a particular layout.</t>
          <t>TRUST_STATEID has no analog in <xref target="RFC8881"/>: pNFS layouts in
<xref target="RFC8881"/> do not register the layout stateid with data
servers; data servers in the loose coupling model trust the
synthetic uid/gid the metadata server inserts on each I/O
(<xref target="sec-Fencing-Clients"/>).  TRUST_STATEID is the new
metadata-server-to-data-server control-plane operation
that replaces synthetic-uid
fencing with per-client stateid-table validation for
deployments that opt into tight coupling.</t>
          <t>TRUST_STATEID is a metadata-server-to-data-server operation;
pNFS clients <bcp14>MUST NOT</bcp14> send it.  The data server rejects any
TRUST_STATEID received on a session whose owning client did
not present EXCHGID4_FLAG_USE_PNFS_MDS at EXCHANGE_ID with
NFS4ERR_PERM.  The flag is self-declared, so this wire-level
check is a hint, not authentication; the deployment-level
requirement -- that only entities considered legitimate
metadata servers can establish such a session -- is stated in
<xref target="sec-tight-coupling-control-session"/>.  TRUST_STATEID
operates on the current filehandle; a PUTFH naming the data
server's file <bcp14>MUST</bcp14> precede it in the same compound (except in
the capability probe case, where the current filehandle is
the root).</t>
          <t>The metadata server provides:</t>
          <dl>
            <dt>tsa_layout_stateid:</dt>
            <dd>
              <t>the stateid the metadata server issued in the
LAYOUTGET that produced this layout.  <bcp14>MUST NOT</bcp14> be a
special stateid (anonymous, invalid, read-bypass, or
current).  The sole exception is the capability probe
described in <xref target="sec-tight-coupling-probe"/>: when the
metadata server sends TRUST_STATEID with
tsa_layout_stateid set to the anonymous stateid
against the root filehandle, the data server <bcp14>MUST</bcp14>
reject the request with NFS4ERR_INVAL -- that
rejection is the positive response to the probe.</t>
            </dd>
            <dt>tsa_client_id:</dt>
            <dd>
              <t>the ffv2m_client_id (<xref target="sec-ffv2-mirror4"/>) the
metadata server assigned to the client in the
layout that produced tsa_layout_stateid.  The data
server records tsa_client_id alongside
tsa_layout_stateid in the trust-table entry and
uses it as the authoritative writer identity for
subsequent CHUNK operations: cwa_client_id on
CHUNK_WRITE <bcp14>MUST</bcp14> equal the
trust-table's tsa_client_id, and cg_client_id in
any chunk_guard4 CAS submitted with the same
stateid <bcp14>MUST</bcp14> also match.  A mismatch <bcp14>MUST</bcp14> be
rejected with NFS4ERR_BAD_STATEID.  In the
capability probe the metadata server <bcp14>SHOULD</bcp14> set
tsa_client_id to zero (which is the reserved
CHUNK_GUARD_CLIENT_ID_NONE, see
<xref target="sec-chunk_guard_none"/>); the data server's
NFS4ERR_INVAL response to the probe is unaffected
by the field's value.</t>
            </dd>
            <dt>tsa_iomode:</dt>
            <dd>
              <t>the iomode of the layout (LAYOUTIOMODE4_READ or
LAYOUTIOMODE4_RW).  The data server <bcp14>MAY</bcp14> enforce this
against the CHUNK operation presented later: a
READ-iomode trust entry does not authorize
CHUNK_WRITE.</t>
            </dd>
            <dt>tsa_expire:</dt>
            <dd>
              <t>the absolute time at which the trust entry becomes
invalid if not renewed; see
<xref target="sec-tight-coupling-lease"/> for the clock-synchronization
assumption and lease-computation rule.  The data server
<bcp14>MUST</bcp14> reject a TRUST_STATEID whose tsa_expire has
tv_nseconds &gt;= 10^9 with NFS4ERR_INVAL.</t>
            </dd>
            <dt>tsa_principal:</dt>
            <dd>
              <t>the client's authenticated identity as verified by
the metadata server at LAYOUTGET time.  For
RPCSEC_GSS clients this is the GSS display name
(e.g., "alice@REALM").  For AUTH_SYS and TLS
clients, tsa_principal <bcp14>MUST</bcp14> be the empty string,
indicating that no principal binding is enforced on
subsequent CHUNK operations.  See
<xref target="sec-tight-coupling-principal"/>.</t>
            </dd>
          </dl>
          <t>If a trust entry already exists for the same
tsa_layout_stateid on the same current filehandle,
TRUST_STATEID atomically updates tsa_expire and
tsa_principal; this is the renewal path (see
<xref target="sec-tight-coupling-lease"/>).</t>
          <t>At registration time the data server tags the new trust
entry with the identity of the metadata server, derived
from the clientid of the owning client of the control
session on which TRUST_STATEID arrived.  This tag is
consulted by REVOKE_STATEID and
BULK_REVOKE_STATEID so that
revocation only affects entries registered by the same
metadata server.  In a multi-metadata-server deployment
sharing a single data server, each metadata server
registers and revokes only its own entries; the tag is
opaque to pNFS clients and is not carried on the wire.</t>
          <t>TRUST_STATEID returns only a top-level status; there is
no result body beyond the nfsstat4 discriminant.</t>
          <t>If the current filehandle is not an ordinary file
(except in the capability-probe case, where the current
filehandle is the root and the operation is expected to
be rejected with NFS4ERR_INVAL), an error <bcp14>MUST</bcp14> be
returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
        </section>
        <section anchor="response-codes-11">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the trust entry is registered (or updated).</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>tsa_layout_stateid was a special stateid
other than the anonymous stateid on the root filehandle.</t>
            </dd>
            <dt>NFS4ERR_DELAY:</dt>
            <dd>
              <t>the data server is temporarily unable to process
the request; the metadata server <bcp14>SHOULD</bcp14> retry.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>tsa_layout_stateid was the anonymous stateid
and the current filehandle is not the root filehandle;
tsa_expire is malformed; or the current filehandle is a
directory (except in the capability-probe case).</t>
            </dd>
            <dt>NFS4ERR_NOFILEHANDLE:</dt>
            <dd>
              <t>no current filehandle is set.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
TRUST_STATEID.  This is the capability-probe response (see
<xref target="sec-tight-coupling-probe"/>).</t>
            </dd>
            <dt>NFS4ERR_PERM:</dt>
            <dd>
              <t>the request arrived on a session whose owning
client did not present EXCHGID4_FLAG_USE_PNFS_MDS.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-REVOKE_STATEID">
        <name>Operation 90: REVOKE_STATEID - Revoke Registered Stateid on Data Server</name>
        <section anchor="arguments-12">
          <name>ARGUMENTS</name>
          <figure anchor="fig-REVOKE_STATEID4args">
            <name>XDR for REVOKE_STATEID4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct REVOKE_STATEID4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4        rsa_layout_stateid;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-12">
          <name>RESULTS</name>
          <figure anchor="fig-REVOKE_STATEID4res">
            <name>XDR for REVOKE_STATEID4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union REVOKE_STATEID4res switch (nfsstat4 rsr_status) {
   ///     case NFS4_OK:
   ///         void;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-12">
          <name>DESCRIPTION</name>
          <t>REVOKE_STATEID invalidates a single trust entry on the
data server.  Subsequent CHUNK operations that present
the revoked stateid <bcp14>MUST</bcp14> fail with NFS4ERR_BAD_STATEID.
REVOKE_STATEID is the per-file revoke counterpart to
TRUST_STATEID -- registration and
revocation form the matched pair that drives the per-file
trust table for a tightly coupled deployment.</t>
          <t>REVOKE_STATEID has no analog in <xref target="RFC8881"/>.  <xref target="RFC8881"/>
revokes pNFS layouts via LAYOUTRETURN with a special
all-files marker or via implicit lease expiry;
REVOKE_STATEID is the new metadata-server-to-data-server operation
that lets the metadata server force per-client invalidation at the
data
server without waiting for tsa_expire and without
unsetting other clients' trust entries.</t>
          <t>REVOKE_STATEID is a metadata-server-to-data-server operation;
pNFS clients <bcp14>MUST NOT</bcp14> send it.  The data server rejects any
REVOKE_STATEID received on a session whose owning client did
not present EXCHGID4_FLAG_USE_PNFS_MDS at EXCHANGE_ID with
NFS4ERR_PERM.  The flag is self-declared, so this wire-level
check is a hint, not authentication; the deployment-level
requirement is stated in
<xref target="sec-tight-coupling-control-session"/>.  REVOKE_STATEID
operates on the current filehandle; a PUTFH naming the data
server's file <bcp14>MUST</bcp14> precede it in the same compound.</t>
          <t>The metadata server provides:</t>
          <dl>
            <dt>rsa_layout_stateid:</dt>
            <dd>
              <t>the stateid to revoke.  Together with the current
filehandle this identifies the trust entry to remove.
<bcp14>MUST NOT</bcp14> be a special stateid; the anonymous stateid
is rejected with NFS4ERR_INVAL and other special
stateids with NFS4ERR_BAD_STATEID.</t>
            </dd>
          </dl>
          <t>The metadata server calls REVOKE_STATEID in any of the
following situations:</t>
          <dl>
            <dt>CB_LAYOUTRECALL timeout:</dt>
            <dd>
              <t>the client did not return the layout within the recall
timeout.  REVOKE_STATEID terminates the client's ability
to issue further I/O to the data server without waiting
for tsa_expire.</t>
            </dd>
            <dt>LAYOUTERROR with NFS4ERR_ACCESS or NFS4ERR_PERM:</dt>
            <dd>
              <t>the data server rejected the client's I/O; the trust entry
is stale and must be removed.  This mirrors the fencing
case in the loose-coupled model (<xref target="sec-Fencing-Clients"/>).</t>
            </dd>
            <dt>Explicit LAYOUTRETURN:</dt>
            <dd>
              <t>the client returned the layout cleanly.  The metadata
server <bcp14>MAY</bcp14> issue REVOKE_STATEID at this time or <bcp14>MAY</bcp14> rely
on tsa_expire; either is correct.</t>
            </dd>
          </dl>
          <t>In-flight CHUNK operations that arrived before
REVOKE_STATEID completes <bcp14>MAY</bcp14> be allowed to finish.  The
data server <bcp14>MUST NOT</bcp14> process new CHUNK operations
presenting rsa_layout_stateid after REVOKE_STATEID
returns.</t>
          <t>Lock state (see <xref target="sec-CHUNK_LOCK"/>) held by the revoked
stateid is NOT released as part of REVOKE_STATEID; the
data server <bcp14>MUST</bcp14> transfer each held lock to the
metadata-server escrow owner (see <xref target="sec-chunk_guard_mds"/>).
Dropping a chunk lock during revocation would permit a
write hole and is prohibited; the repair coordination
sequence in <xref target="sec-repair-selection"/> assumes that locks
held by a revoked writer remain held until a repair
client adopts them via CHUNK_LOCK with
CHUNK_LOCK_FLAGS_ADOPT.</t>
          <t>REVOKE_STATEID is scoped to the issuing metadata
server's entries (see the tagging rule in
<xref target="sec-TRUST_STATEID"/>).  The data server <bcp14>MUST NOT</bcp14>
remove an entry that was registered by a different
metadata server, even if rsa_layout_stateid happens to
match.  In a multi-metadata-server deployment, one
metadata server therefore cannot revoke another
metadata server's entries.</t>
          <t>REVOKE_STATEID is idempotent: revoking a stateid that
has no matching trust entry (either no entry exists, or
the entry was registered by a different metadata
server) returns NFS4_OK.  The metadata server therefore
does not need to track precisely which entries are
currently live on which data server in order to revoke
safely.</t>
          <t>REVOKE_STATEID returns only a top-level status; there
is no result body beyond the nfsstat4 discriminant.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned (NFS4ERR_ISDIR / NFS4ERR_SYMLINK /
NFS4ERR_WRONG_TYPE for non-regular; NFS4ERR_NOTSUPP if
the file is a regular file but not a chunked data file,
per <xref target="sec-ops-client"/>).</t>
        </section>
        <section anchor="response-codes-12">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the trust entry was removed, or no matching entry
existed (idempotent).</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_BAD_STATEID:</dt>
            <dd>
              <t>rsa_layout_stateid was a special stateid.</t>
            </dd>
            <dt>NFS4ERR_DELAY:</dt>
            <dd>
              <t>the data server is temporarily unable to process
the request.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>rsa_layout_stateid was the anonymous stateid.</t>
            </dd>
            <dt>NFS4ERR_NOFILEHANDLE:</dt>
            <dd>
              <t>no current filehandle is set.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
REVOKE_STATEID.</t>
            </dd>
            <dt>NFS4ERR_PERM:</dt>
            <dd>
              <t>the request arrived on a session whose owning
client did not present EXCHGID4_FLAG_USE_PNFS_MDS.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-BULK_REVOKE_STATEID">
        <name>Operation 91: BULK_REVOKE_STATEID - Revoke All Stateids for a Client</name>
        <section anchor="arguments-13">
          <name>ARGUMENTS</name>
          <figure anchor="fig-BULK_REVOKE_STATEID4args">
            <name>XDR for BULK_REVOKE_STATEID4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct BULK_REVOKE_STATEID4args {
   ///     clientid4       brsa_clientid;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-13">
          <name>RESULTS</name>
          <figure anchor="fig-BULK_REVOKE_STATEID4res">
            <name>XDR for BULK_REVOKE_STATEID4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union BULK_REVOKE_STATEID4res switch (nfsstat4 brsr_status) {
   ///     case NFS4_OK:
   ///         void;
   ///     default:
   ///         void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-13">
          <name>DESCRIPTION</name>
          <t>BULK_REVOKE_STATEID removes every trust entry on the data
server that was registered on behalf of a single named
client.  Unlike REVOKE_STATEID,
which removes one entry identified by a (filehandle,
stateid) pair, BULK_REVOKE_STATEID does not target a
specific filehandle or stateid; it instructs the data
server to scan its trust table and remove every entry
whose owning pNFS client matches brsa_clientid (and whose
issuing metadata server matches the calling metadata server).</t>
          <t>BULK_REVOKE_STATEID has no analog in <xref target="RFC8881"/>.  <xref target="RFC8881"/>
recall-all is expressed at the layout layer
(CB_LAYOUTRECALL with LAYOUTRECALL4_ALL); the per-client
trust-table sweep introduced here is the data-server-side
complement, replacing the N per-file REVOKE_STATEID
compounds that per-entry revocation would require with a
single round-trip.</t>
          <t>BULK_REVOKE_STATEID is a metadata-server-to-data-server
operation; pNFS clients <bcp14>MUST NOT</bcp14> send it.  The data server
rejects any BULK_REVOKE_STATEID received on a session whose
owning client did not present EXCHGID4_FLAG_USE_PNFS_MDS at
EXCHANGE_ID with NFS4ERR_PERM.  The flag is self-declared, so
this wire-level check is a hint, not authentication; the
deployment-level requirement is stated in
<xref target="sec-tight-coupling-control-session"/>.  BULK_REVOKE_STATEID
does not operate on the current filehandle; no PUTFH is
required in the compound.</t>
          <t>The metadata server provides:</t>
          <dl>
            <dt>brsa_clientid:</dt>
            <dd>
              <t>the clientid of the pNFS client whose trust entries
are to be removed.  The special all-zeros value means
"remove every trust entry owned by the calling
metadata server, regardless of which pNFS client
registered it"; the data server <bcp14>MUST</bcp14> interpret this
value as a sweep of its own entries only, NOT as the
pNFS client whose clientid happens to be zero and NOT
as a global cross-metadata-server table clear.</t>
            </dd>
          </dl>
          <t>The metadata server calls BULK_REVOKE_STATEID in any of
the following situations:</t>
          <dl>
            <dt>Client lease expiry:</dt>
            <dd>
              <t>when a client's lease on the metadata server expires, the
metadata server revokes all of that client's layouts.  A
single BULK_REVOKE_STATEID with brsa_clientid set to the
expired client's clientid sweeps every per-file trust entry
the metadata server had registered for that client.</t>
            </dd>
            <dt>CB_LAYOUTRECALL with LAYOUTRECALL4_ALL:</dt>
            <dd>
              <t>the metadata server is recalling all layouts for a client.
BULK_REVOKE_STATEID is the data-server-side complement.</t>
            </dd>
            <dt>Metadata server restart cleanup:</dt>
            <dd>
              <t>after the metadata server reconnects to a data server, it
<bcp14>MAY</bcp14> issue BULK_REVOKE_STATEID with brsa_clientid set to
all-zeros to clear the prior trust table before re-issuing
TRUST_STATEID as clients reclaim.  See
<xref target="sec-tight-coupling-mds-crash"/>.</t>
            </dd>
          </dl>
          <t>BULK_REVOKE_STATEID is scoped to the issuing metadata
server's entries (see the tagging rule in
<xref target="sec-TRUST_STATEID"/>).  The data server <bcp14>MUST NOT</bcp14> affect
entries registered by a different metadata server.
Consequently, in a multi-metadata-server deployment
sharing a single data server, one metadata server cannot
clear another metadata server's entries via
BULK_REVOKE_STATEID.</t>
          <t>Like REVOKE_STATEID, BULK_REVOKE_STATEID is idempotent
(no error is returned if there are no matching entries)
and preserves chunk locks held under any revoked stateid
by transferring them to the metadata-server escrow owner (see
<xref target="sec-chunk_guard_mds"/>), rather than dropping them.
Subsequent CHUNK operations from the revoked client
fail with NFS4ERR_BAD_STATEID; locks held under those
revoked stateids remain until adopted by a repair
client via CHUNK_LOCK with CHUNK_LOCK_FLAGS_ADOPT
(<xref target="sec-CHUNK_LOCK"/>).</t>
          <t>BULK_REVOKE_STATEID returns only a top-level status;
there is no result body beyond the nfsstat4 discriminant.</t>
        </section>
        <section anchor="response-codes-13">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the matching entries were removed, or there were
none (idempotent).</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_DELAY:</dt>
            <dd>
              <t>the data server is temporarily unable to process
the request.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
BULK_REVOKE_STATEID.</t>
            </dd>
            <dt>NFS4ERR_PERM:</dt>
            <dd>
              <t>the request arrived on a session whose owning
client did not present EXCHGID4_FLAG_USE_PNFS_MDS.</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing
the request.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_ESCROW_INSTALL">
        <name>Operation 92: CHUNK_ESCROW_INSTALL - Install a metadata-server escrow lock</name>
        <section anchor="arguments-14">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_ESCROW_INSTALL4args">
            <name>XDR for CHUNK_ESCROW_INSTALL4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_ESCROW_INSTALL4args {
   ///     /* CURRENT_FH: file */
   ///     uint64_t        ceia_mds_epoch;
   ///     offset4         ceia_offset;
   ///     count4          ceia_count;
   ///     escrow_id4      ceia_escrow_id;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-14">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_ESCROW_INSTALL4res">
            <name>XDR for CHUNK_ESCROW_INSTALL4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_ESCROW_INSTALL4res
   ///     switch (nfsstat4 ceir_status) {
   /// case NFS4_OK:
   ///     escrow_id4      ceir_escrow_id;
   /// default:
   ///     void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-14">
          <name>DESCRIPTION</name>
          <t>CHUNK_ESCROW_INSTALL is sent by the metadata server
to a data server on the metadata-server-to-data-server control session to
install a metadata-server escrow lock (<xref target="sec-chunk_guard_mds"/>)
over the chunk range [ceia_offset,
ceia_offset+ceia_count) on the file selected by
CURRENT_FH.  The lock is created with the specified
ceia_escrow_id, which the metadata server will later
present to reference this specific installation on
CHUNK_ESCROW_RELEASE,
in CB_CHUNK_REPAIR, and in
the corresponding CHUNK_LOCK adoption
(<xref target="sec-CHUNK_LOCK"/>).</t>
          <t>ceia_mds_epoch is the metadata server's current
epoch on this data server; the data server rejects
the operation with NFS4ERR_STALE_MDS_EPOCH
(<xref target="sec-NFS4ERR_STALE_MDS_EPOCH"/>) if the epoch does
not match its recorded value or if the current
epoch's expires_at has passed.</t>
          <t>The install is all-or-nothing across the range: if
any chunk in [ceia_offset, ceia_offset+ceia_count)
carries an incompatible existing lock, the operation
fails with the corresponding per-chunk error at the
operation level (typically NFS4ERR_CHUNK_LOCKED).</t>
          <t>On success, ceir_escrow_id echoes ceia_escrow_id
to confirm the identity the data server recorded.
The metadata server <bcp14>MUST</bcp14> retain this identity in
its durable escrow-tuple set before issuing the
call and <bcp14>MUST NOT</bcp14> reuse an escrow_id4 whose
lifecycle is not provably complete
(<xref target="sec-escrow_id4"/>).</t>
        </section>
        <section anchor="response-codes-14">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the metadata-server escrow lock has been installed
over the requested range with the specified escrow_id4.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the metadata server is not authorized to install
escrows on this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_CHUNK_LOCKED:</dt>
            <dd>
              <t>a chunk in [ceia_offset, ceia_offset + ceia_count)
carries an incompatible existing lock; the install
is all-or-nothing across the range.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>ceia_offset or ceia_count is malformed, or
ceia_escrow_id is the reserved all-zeros value.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
CHUNK_ESCROW_INSTALL.</t>
            </dd>
            <dt>NFS4ERR_PERM:</dt>
            <dd>
              <t>the request arrived on a session whose owning
client did not present EXCHGID4_FLAG_USE_PNFS_MDS
(see <xref target="sec-tight-coupling-control-session"/>).</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing the
request.</t>
            </dd>
            <dt>NFS4ERR_STALE_MDS_EPOCH:</dt>
            <dd>
              <t>ceia_mds_epoch does not match the data server's
recorded value, or the current epoch's
epoch_expires_at has passed.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_ESCROW_RELEASE">
        <name>Operation 93: CHUNK_ESCROW_RELEASE - Release a metadata-server escrow lock</name>
        <section anchor="arguments-15">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_ESCROW_RELEASE4args">
            <name>XDR for CHUNK_ESCROW_RELEASE4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_ESCROW_RELEASE4args {
   ///     /* CURRENT_FH: file */
   ///     uint64_t        cera_mds_epoch;
   ///     offset4         cera_offset;
   ///     count4          cera_count;
   ///     escrow_id4      cera_escrow_id;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-15">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_ESCROW_RELEASE4res">
            <name>XDR for CHUNK_ESCROW_RELEASE4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_ESCROW_RELEASE4res
   ///     switch (nfsstat4 cerr_status) {
   /// case NFS4_OK:
   ///     void;
   /// default:
   ///     void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-15">
          <name>DESCRIPTION</name>
          <t>CHUNK_ESCROW_RELEASE is sent by the metadata server
to release a metadata-server escrow lock it previously
installed with CHUNK_ESCROW_INSTALL.  The release is
compare-and-release: the operation succeeds only
when an escrow lock covering the requested range
exists on the data server AND its escrow_id4
matches cera_escrow_id.  If no escrow covers the
range, or the covering escrow's identity differs,
the data server returns NFS4ERR_STALE_ESCROW
(<xref target="sec-NFS4ERR_STALE_ESCROW"/>) and <bcp14>MUST NOT</bcp14> alter
any current lock or escrow state as a side effect.</t>
          <t>The compare-and-release rule ensures that a
metadata server which has been superseded by a
newer incarnation cannot release an escrow the
newer incarnation has since re-installed under a
different identity.</t>
          <t>cera_mds_epoch is treated as in
<xref target="sec-CHUNK_ESCROW_INSTALL"/>; a stale epoch returns
NFS4ERR_STALE_MDS_EPOCH.</t>
          <t>Interaction with adopted locks (see
<xref target="sec-chunk_guard_mds"/>): if a repair actor has
already adopted this escrow via CHUNK_LOCK with
CHUNK_LOCK_FLAGS_ADOPT (<xref target="sec-CHUNK_LOCK"/>), the
escrow no longer exists on the data server as a
distinct lock (the adoption consumes it and
transfers ownership to the client); a subsequent
CHUNK_ESCROW_RELEASE naming that identity returns
NFS4ERR_STALE_ESCROW and <bcp14>MUST NOT</bcp14> affect the
client-owned adopted lock.  The metadata server
interprets NFS4ERR_STALE_ESCROW after possible
adoption as "the escrow was consumed by ADOPT;
wait for the CB_CHUNK_REPAIR response or a
subsequent revocation-transfer signal before
removing durable escrow-tuple bookkeeping."</t>
        </section>
        <section anchor="response-codes-15">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the metadata-server escrow lock matching
cera_escrow_id has been released.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the metadata server is not authorized to release
escrows on this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>cera_offset or cera_count is malformed.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
CHUNK_ESCROW_RELEASE.</t>
            </dd>
            <dt>NFS4ERR_PERM:</dt>
            <dd>
              <t>the request arrived on a session whose owning
client did not present EXCHGID4_FLAG_USE_PNFS_MDS
(see <xref target="sec-tight-coupling-control-session"/>).</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing the
request.</t>
            </dd>
            <dt>NFS4ERR_STALE_ESCROW:</dt>
            <dd>
              <t>no escrow covers the requested range, or the
covering escrow's identity differs from
cera_escrow_id (which may indicate the escrow
was consumed by CHUNK_LOCK adoption); the data
server <bcp14>MUST NOT</bcp14> alter any current lock or
escrow state as a side effect.</t>
            </dd>
            <dt>NFS4ERR_STALE_MDS_EPOCH:</dt>
            <dd>
              <t>cera_mds_epoch does not match the data server's
recorded value, or the current epoch's
epoch_expires_at has passed.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_ESCROW_ENUMERATE">
        <name>Operation 94: CHUNK_ESCROW_ENUMERATE - Enumerate metadata-server escrow locks on a file</name>
        <section anchor="arguments-16">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_ESCROW_ENUMERATE4args">
            <name>XDR for CHUNK_ESCROW_ENUMERATE4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// /* Upper bound on the ENUMERATE pagination
   ///  * cookie length, applied to both the request
   ///  * ceea_cookie and the response ceer_cookie.
   ///  */
   /// const CHUNK_ESCROW_ENUMERATE_COOKIE_MAX4 = 256;
   ///
   /// struct CHUNK_ESCROW_ENUMERATE4args {
   ///     /* CURRENT_FH: file */
   ///     uint64_t        ceea_mds_epoch;
   ///     offset4         ceea_offset;
   ///     count4          ceea_count;
   ///     uint32_t        ceea_maxcount;
   ///     opaque
   ///         ceea_cookie<CHUNK_ESCROW_ENUMERATE_COOKIE_MAX4>;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-16">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_ESCROW_ENUMERATE4res">
            <name>XDR for CHUNK_ESCROW_ENUMERATE4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// /* Upper bound on the number of escrow_enum_entry4
   ///  * values returned in a single ENUMERATE call.
   ///  * Bounds ceer_entries; the caller may still page
   ///  * via ceer_cookie for larger snapshots.
   ///  */
   /// const CHUNK_ESCROW_ENUMERATE_MAX4 = 256;
   ///
   /// struct escrow_enum_entry4 {
   ///     offset4         eee_offset;
   ///     count4          eee_count;
   ///     escrow_id4      eee_escrow_id;
   /// };
   ///
   /// struct CHUNK_ESCROW_ENUMERATE4resok {
   ///     bool                 ceer_eof;
   ///     opaque
   ///         ceer_cookie<CHUNK_ESCROW_ENUMERATE_COOKIE_MAX4>;
   ///     escrow_enum_entry4
   ///         ceer_entries<CHUNK_ESCROW_ENUMERATE_MAX4>;
   /// };
   ///
   /// union CHUNK_ESCROW_ENUMERATE4res
   ///     switch (nfsstat4 ceer_status) {
   /// case NFS4_OK:
   ///     CHUNK_ESCROW_ENUMERATE4resok ceer_resok4;
   /// default:
   ///     void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-16">
          <name>DESCRIPTION</name>
          <t>CHUNK_ESCROW_ENUMERATE is sent by the metadata
server to discover which metadata-server escrow locks the
data server currently holds on the file selected
by CURRENT_FH.  Each returned entry names an
installed escrow's range and identity.</t>
          <t>ceea_offset and ceea_count bound the inspection
range; ceea_maxcount is the maximum number of
entries the caller is willing to receive
(ceea_maxcount = 0 is legal and is the
op-family capability probe: the data server <bcp14>MUST</bcp14>
return NFS4_OK with an empty ceer_entries array
and ceer_eof = TRUE when it implements the
operation, regardless of any escrows present.
A data server that does not implement the
operation returns NFS4ERR_OP_ILLEGAL at COMPOUND
decode time per <xref section="16.2" sectionFormat="of" target="RFC8881"/>, which is
distinct from NFS4ERR_NOTSUPP).</t>
          <t>Pagination uses ceea_cookie: on the first call the
caller supplies an empty cookie; the data server
returns a snapshot verifier-plus-cursor in
ceer_cookie that the caller supplies on the next
call to continue enumeration.  The data server
<bcp14>MUST</bcp14> return a verifier-consistent snapshot: no
escrow installed after the first call in a
pagination sequence appears in subsequent calls,
and no escrow released after the first call
disappears from subsequent calls (implementations
may achieve this by snapshotting the escrow set
at first-call time and streaming from the
snapshot).  ceer_eof = TRUE signals the end of
the enumeration.</t>
          <t>Non-mutating: the operation observes but does not
modify escrow state.</t>
          <t>ceea_mds_epoch is treated as in the sibling
operations; a stale epoch returns
NFS4ERR_STALE_MDS_EPOCH.</t>
        </section>
        <section anchor="response-codes-16">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the requested escrow enumeration entries have
been returned; ceer_eof indicates whether more
remain.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>the metadata server is not authorized to
enumerate escrows on this file.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded, or ceea_cookie
is malformed.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>ceea_offset, ceea_count, or ceea_maxcount is
malformed, or ceea_cookie references a snapshot
the data server no longer holds.</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
CHUNK_ESCROW_ENUMERATE.  See the
ceea_maxcount = 0 op-family capability probe in
the description for the distinction from
NFS4ERR_OP_ILLEGAL at COMPOUND decode time.</t>
            </dd>
            <dt>NFS4ERR_PERM:</dt>
            <dd>
              <t>the request arrived on a session whose owning
client did not present EXCHGID4_FLAG_USE_PNFS_MDS
(see <xref target="sec-tight-coupling-control-session"/>).</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing the
request.</t>
            </dd>
            <dt>NFS4ERR_STALE_MDS_EPOCH:</dt>
            <dd>
              <t>ceea_mds_epoch does not match the data server's
recorded value, or the current epoch's
epoch_expires_at has passed.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="sec-CHUNK_ESCROW_TAKEOVER">
        <name>Operation 95: CHUNK_ESCROW_TAKEOVER - Advance metadata-server epoch after incarnation change</name>
        <section anchor="arguments-17">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CHUNK_ESCROW_TAKEOVER4args">
            <name>XDR for CHUNK_ESCROW_TAKEOVER4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CHUNK_ESCROW_TAKEOVER4args {
   ///     /* CURRENT_FH: file (implementation-defined;
   ///      * the operation is per-data-server, not
   ///      * per-file; CURRENT_FH is provided per
   ///      * NFSv4.2 COMPOUND convention). */
   ///     uint64_t             ceta_expected_prior_epoch;
   ///     uint64_t             ceta_new_epoch;
   ///     proof_profile_id4    ceta_proof_profile;
   ///     opaque
   ///         ceta_proof_data<CETA_INCARNATION_PROOF_MAX4>;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-17">
          <name>RESULTS</name>
          <figure anchor="fig-CHUNK_ESCROW_TAKEOVER4res">
            <name>XDR for CHUNK_ESCROW_TAKEOVER4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// union CHUNK_ESCROW_TAKEOVER4res
   ///     switch (nfsstat4 cetar_status) {
   /// case NFS4_OK:
   ///     void;
   /// default:
   ///     void;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-17">
          <name>DESCRIPTION</name>
          <t>CHUNK_ESCROW_TAKEOVER is the recovery path a
metadata server uses to assume the escrow-control
role on a data server after an incarnation change
(a failover, a restart, or an operator-mediated
recovery).  It carries an incarnation-lease proof
issued by an authority external to the metadata
server (see <xref target="sec-proof-profile"/>) which the data
server verifies before advancing its recorded
metadata-server epoch.</t>
          <t>The operation is a compare-and-advance:</t>
          <ul spacing="normal">
            <li>
              <t>ceta_expected_prior_epoch <bcp14>MUST</bcp14> equal the data
server's currently-recorded metadata-server
epoch;</t>
            </li>
            <li>
              <t>ceta_new_epoch <bcp14>MUST</bcp14> either exceed the prior
epoch (ordinary takeover / advance) or equal the
prior epoch when the caller is renewing the
lease under the same incarnation (renewal
form; both values equal the data server's
current epoch, and only the epoch_expires_at
field is refreshed);</t>
            </li>
            <li>
              <t>ceta_proof_profile <bcp14>MUST</bcp14> name a profile the data
server supports; and</t>
            </li>
            <li>
              <t>ceta_proof_data <bcp14>MUST</bcp14> verify under that profile
per <xref target="sec-proof-profile"/>.</t>
            </li>
          </ul>
          <t>All four conditions are evaluated atomically; on
success the data server updates its recorded
epoch and epoch_expires_at values in a single
step, and subsequent CHUNK_ESCROW_INSTALL,
CHUNK_ESCROW_RELEASE, and CHUNK_ESCROW_ENUMERATE
operations from the new epoch are accepted.
Concurrent takeovers serialize: exactly one
same-expected-prior request wins, and any other
sees NFS4ERR_STALE_MDS_EPOCH on its second
attempt because the prior has advanced.</t>
          <t>The strict evaluation order per
<xref target="sec-proof-profile"/> is followed:
session-replay-cache lookup first, then
presenter authorization (NFS4ERR_ACCESS on
failure), then profile support (NFS4ERR_NOTSUPP
on unknown profile), then proof verification
(NFS4ERR_ACCESS on failure), then epoch
compare-and-advance (NFS4ERR_STALE_MDS_EPOCH on
mismatch).  This ordering ensures unauthenticated
callers learn nothing about supported profiles
or current epoch state.</t>
          <t>Unlike the other CHUNK_ESCROW operations,
CHUNK_ESCROW_TAKEOVER is EXEMPT from the
ongoing epoch_expires_at check applied to
INSTALL, RELEASE, and ENUMERATE: TAKEOVER is
itself the recovery path out of an expired
epoch and carries its own compare-and-advance +
proof-verification semantics.  A metadata server
that has been fenced by a superseding takeover
cannot recover by presenting another
CHUNK_ESCROW_TAKEOVER unless it obtains a valid
fresh incarnation-lease proof from the
authority.</t>
          <t>Older escrow state is NOT invalidated by an
epoch advance: escrows installed under the prior
epoch survive; the new incarnation reconciles
them via CHUNK_ESCROW_ENUMERATE and adopts,
releases, or reissues each per its durable
recovery state.  Fencing applies to control
traffic on old epochs, not to the state those
epochs installed.</t>
        </section>
        <section anchor="response-codes-17">
          <name>RESPONSE CODES</name>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>the metadata server epoch has been advanced to
ceta_new_epoch, or refreshed under the renewal
form.</t>
            </dd>
            <dt>NFS4ERR_ACCESS:</dt>
            <dd>
              <t>presenter authorization or incarnation-lease
proof verification failed.  Per
<xref target="sec-proof-profile"/>, this outcome is returned
both for authorization failure and for proof
failure so that unauthenticated callers learn
nothing about supported profiles or current
epoch state.</t>
            </dd>
            <dt>NFS4ERR_BADXDR:</dt>
            <dd>
              <t>arguments could not be decoded, or ceta_proof_data
is structurally malformed.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>ceta_expected_prior_epoch or ceta_new_epoch is
malformed (for example, ceta_new_epoch precedes
ceta_expected_prior_epoch and does not equal it
under the renewal form).</t>
            </dd>
            <dt>NFS4ERR_NOTSUPP:</dt>
            <dd>
              <t>the data server does not implement
CHUNK_ESCROW_TAKEOVER, or the presented
ceta_proof_profile is unknown to the data
server.</t>
            </dd>
            <dt>NFS4ERR_PERM:</dt>
            <dd>
              <t>the request arrived on a session whose owning
client did not present EXCHGID4_FLAG_USE_PNFS_MDS
(see <xref target="sec-tight-coupling-control-session"/>).</t>
            </dd>
            <dt>NFS4ERR_SERVERFAULT:</dt>
            <dd>
              <t>the data server failed while processing the
request.</t>
            </dd>
            <dt>NFS4ERR_STALE_MDS_EPOCH:</dt>
            <dd>
              <t>ceta_expected_prior_epoch does not match the
data server's recorded value; a concurrent
TAKEOVER has already advanced past it, or the
caller has been fenced by a superseding
takeover.</t>
            </dd>
          </dl>
        </section>
      </section>
    </section>
    <section anchor="new-nfsv42-callback-operations">
      <name>New NFSv4.2 Callback Operations</name>
      <figure anchor="fig-cb-ops-xdr">
        <name>Callback Operations XDR</name>
        <sourcecode type="xdr"><![CDATA[
   ///
   /// /* New callback operations for Erasure Coding start here */
   ///
   ///  OP_CB_CHUNK_REPAIR     = 16,
   ///
]]></sourcecode>
      </figure>
      <t>The following amendment blocks extend the nfs_cb_argop4 and
nfs_cb_resop4 dispatch unions defined in <xref target="RFC7863"/> with arms
for the new callback operation defined in this document.</t>
      <figure anchor="fig-nfs_cb_argop4-amend">
        <name>nfs_cb_argop4 amendment block</name>
        <sourcecode type="xdr"><![CDATA[
   /// /* nfs_cb_argop4 amendment block */
   ///
   /// case OP_CB_CHUNK_REPAIR: CB_CHUNK_REPAIR4args opcbchunkrepair;
]]></sourcecode>
      </figure>
      <figure anchor="fig-nfs_cb_resop4-amend">
        <name>nfs_cb_resop4 amendment block</name>
        <sourcecode type="xdr"><![CDATA[
   /// /* nfs_cb_resop4 amendment block */
   ///
   /// case OP_CB_CHUNK_REPAIR: CB_CHUNK_REPAIR4res opcbchunkrepair;
]]></sourcecode>
      </figure>
      <section anchor="sec-CB_CHUNK_REPAIR">
        <name>Callback Operation 16: CB_CHUNK_REPAIR - Request Repair of Inconsistent Chunk Ranges</name>
        <section anchor="arguments-18">
          <name>ARGUMENTS</name>
          <figure anchor="fig-CB_CHUNK_REPAIR4args">
            <name>XDR for CB_CHUNK_REPAIR4args</name>
            <sourcecode type="xdr"><![CDATA[
   /// enum cb_chunk_repair_reason4 {
   ///     CB_REPAIR_REASON_RACE  = 1,
   ///     CB_REPAIR_REASON_SCRUB = 2
   /// };
   ///
   /// struct cb_chunk_range4 {
   ///     offset4         ccr_offset;
   ///     count4          ccr_count;
   ///     nfsstat4        ccr_error;
   /// };
   ///
   /// /* Upper bound on the number of ranges named in a
   ///  * single CB_CHUNK_REPAIR (bounds both ccra_ranges
   ///  * and its co-indexed ccrr_range_status).  A repair
   ///  * batch that exceeds this bound is split across
   ///  * multiple callbacks.
   ///  */
   /// const CB_CHUNK_REPAIR_MAX_RANGES4 = 64;
   ///
   /// struct CB_CHUNK_REPAIR4args {
   ///     nfs_fh4                     ccra_fh;
   ///     stateid4                    ccra_layout_stateid;
   ///     nfstime4                    ccra_deadline;
   ///     cb_chunk_repair_reason4     ccra_reason;
   ///     escrow_id4                  ccra_escrow_id;
   ///     cb_chunk_range4
   ///         ccra_ranges<CB_CHUNK_REPAIR_MAX_RANGES4>;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-18">
          <name>RESULTS</name>
          <figure anchor="fig-CB_CHUNK_REPAIR4res">
            <name>XDR for CB_CHUNK_REPAIR4res</name>
            <sourcecode type="xdr"><![CDATA[
   /// struct CB_CHUNK_REPAIR4res {
   ///     nfsstat4        ccrr_status;
   ///     nfsstat4
   ///         ccrr_range_status<CB_CHUNK_REPAIR_MAX_RANGES4>;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-18">
          <name>DESCRIPTION</name>
          <t>CB_CHUNK_REPAIR is the back-channel by which the metadata
server delivers a repair work item to a repair actor it has
selected per <xref target="sec-repair-selection"/>.  The work item names
one or more non-atomic chunk ranges on the file's data
servers for the repair actor to reconstruct or roll back.
The selection rules in <xref target="sec-repair-selection"/> are
normative for how a client <bcp14>MUST</bcp14> respond on receipt of this
callback.</t>
          <t>CB_CHUNK_REPAIR has no analog in <xref target="RFC8881"/>.  <xref target="RFC8881"/>
back-channel callbacks operate at the layout layer
(CB_LAYOUTRECALL) or the file-state layer (CB_RECALL,
CB_NOTIFY); CB_CHUNK_REPAIR is the new chunk-layer
callback that drives reconstruction or rollback of
non-atomic chunks without requiring a full layout return.</t>
          <t>The metadata server provides:</t>
          <dl>
            <dt>ccra_fh:</dt>
            <dd>
              <t>the filehandle of the file whose chunks are non-atomic.
The callback compound carries the filehandle directly;
there is no preceding PUTFH in callback compounds.</t>
            </dd>
            <dt>ccra_layout_stateid:</dt>
            <dd>
              <t>the recipient client's current layout stateid for the
file if one is held.  A client that does not hold a
layout on ccra_fh <bcp14>MUST</bcp14> ignore ccra_layout_stateid (it
will be the anonymous stateid in that case) and <bcp14>MUST</bcp14>
acquire one via LAYOUTGET before issuing any CHUNK
operation on the ranges.</t>
            </dd>
            <dt>ccra_deadline:</dt>
            <dd>
              <t>an absolute nfstime4 (seconds and nanoseconds since
the epoch, as defined in <xref section="3.3.1" sectionFormat="of" target="RFC8881"/>)
by which the client is expected to have driven every
range to completion (CHUNK_REPAIRED on the
reconstruction path, or CHUNK_UNLOCK on the rollback
path).  As with <tt>tsa_expire</tt>
(<xref target="sec-tight-coupling-lease"/>), the wall-clock
representation assumes the metadata server and the
repair actor maintain clock synchronization within one
metadata-server lease period (see the clock-sync
paragraph in <xref target="sec-tight-coupling-lease"/> for the
deployment options when this cannot be guaranteed);
under skew, missing the deadline is not
safety-critical because state cannot be corrupted, but
spurious deadline expiry <bcp14>SHOULD</bcp14> be avoided by setting
<tt>ccra_deadline</tt> to at least (current-wall-clock +
deadline-budget + expected-skew).
Missing the deadline does not corrupt state -- the
metadata server <bcp14>MAY</bcp14> re-select another repair actor
after the deadline elapses -- but a client that has
missed the deadline <bcp14>MUST</bcp14> re-verify its layout and the
chunk lock state before continuing any repair-related
CHUNK operation.</t>
            </dd>
            <dt>ccra_reason:</dt>
            <dd>
              <t>distinguishes the two flows that cause the metadata
server to issue a repair callback:
</t>
              <dl>
                <dt>CB_REPAIR_REASON_RACE:</dt>
                <dd>
                  <t>A live-race repair.  A client (not necessarily the
recipient of this callback) detected a chunk-level
non-atomicity at write or read time and reported it
via LAYOUTERROR.  The metadata server is driving
repair synchronously because the affected chunk is
on the critical path of some I/O.  The recipient
<bcp14>SHOULD</bcp14> prioritize the callback over background
work.</t>
                </dd>
                <dt>CB_REPAIR_REASON_SCRUB:</dt>
                <dd>
                  <t>A background scrub.  The metadata server has
detected stale or non-atomic payloads during a
scheduled integrity sweep and is opportunistically
driving repair.  No client is currently blocked on
these ranges.  The recipient <bcp14>MAY</bcp14> schedule the
callback at lower priority than
CB_REPAIR_REASON_RACE, and <bcp14>MAY</bcp14> return NFS4ERR_DELAY
to defer repair to a more convenient time; the
metadata server will retry.</t>
                </dd>
              </dl>
              <t>The two reasons share all other semantics: the same
ccra_ranges encoding, the same response codes, the same
deadline contract.  Only the priority and retry
behavior differs.</t>
            </dd>
            <dt>ccra_escrow_id:</dt>
            <dd>
              <t>the escrow_id4 (<xref target="sec-escrow_id4"/>) of the metadata-server escrow
lock the metadata server installed to cover every
range in this callback.  The client presents this
same escrow_id4 in the cla_adopt discriminant of the
CHUNK_LOCK request that adopts the escrow (see
<xref target="sec-CHUNK_LOCK"/> "Lock Transfer via
CHUNK_LOCK_FLAGS_ADOPT"); the data server matches on
full identity, so a callback ranges over a single
escrow identity.  If the repair spans ranges the
metadata server installed under distinct escrow
identities (for example, when a multi-data-server
repair needs its own escrow per data server), the
metadata server <bcp14>MUST</bcp14> issue one CB_CHUNK_REPAIR per
escrow identity rather than mixing them into a
single callback.</t>
            </dd>
            <dt>ccra_ranges:</dt>
            <dd>
              <t>the list of every chunk range the metadata server
requests the client to repair.  Each entry carries its
own ccr_error describing the failure mode the client
is being asked to remedy.  The repair strategy depends
on the error code; see <xref target="sec-repair-selection"/> for
the normative and guidance split.  The array is
bounded by CB_CHUNK_REPAIR_MAX_RANGES4; if a repair
set exceeds that bound, the metadata server splits
it across multiple callbacks.</t>
            </dd>
          </dl>
          <t>The metadata server <bcp14>SHOULD</bcp14> keep each CB_CHUNK_REPAIR
compound within the back-channel maximum
(ca_maxrequestsize) negotiated in CREATE_SESSION (see
<xref section="18.36.3" sectionFormat="of" target="RFC8881"/>).  If the set of affected
ranges would exceed that maximum, the metadata server <bcp14>MAY</bcp14>
issue multiple CB_CHUNK_REPAIR callbacks to the same
client.  Each callback is independent; the client drives
each to completion before the deadline on that callback's
ranges.</t>
          <t>The metadata server <bcp14>MUST NOT</bcp14> name a range in ccra_ranges
unless the data server holds a chunk lock on that range at
the time the callback is issued (the failure occurred in
or around a PENDING or FINALIZED state that established
the lock).  The repair actor <bcp14>MUST</bcp14> use CHUNK_LOCK with
CHUNK_LOCK_FLAGS_ADOPT (<xref target="sec-CHUNK_LOCK"/>) to take
ownership of the lock before issuing CHUNK_WRITE_REPAIR,
CHUNK_ROLLBACK, or CHUNK_WRITE on any chunk in a requested
range.  Because callback delivery and lock state can race,
a repair actor that receives NFS4ERR_NO_ADOPTABLE_LOCK on
the adoption <bcp14>MUST</bcp14> report the mismatch via
ccrr_range_status per
<xref target="sec-NFS4ERR_NO_ADOPTABLE_LOCK"/> rather than attempt
recovery.</t>
          <t>CB_CHUNK_REPAIR returns a top-level ccrr_status plus a
co-indexed per-range status array ccrr_range_status.</t>
          <t>When the entire callback fails at once -- decode failure,
authorization failure, session-stale, and other conditions
that fail every range -- the operation-wide error is placed
in ccrr_status and ccrr_range_status <bcp14>MUST</bcp14> be empty (zero
entries).</t>
          <t>When the callback is well-formed and evaluated per range,
ccrr_range_status carries exactly one nfsstat4 per entry in
ccra_ranges, co-indexed, and ccrr_status is one of:</t>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>every range reached CHUNK_REPAIRED or CHUNK_UNLOCK per
the completion contract; every ccrr_range_status entry is
NFS4_OK.</t>
            </dd>
            <dt>NFS4ERR_PARTIAL (<xref target="sec-NFS4ERR_PARTIAL"/>):</dt>
            <dd>
              <t>at least one range did not reach the completion state.
The metadata server <bcp14>MUST</bcp14> consume the ccrr_range_status
array to determine per-range outcome; the array is
authoritative.  An NFS4ERR_PARTIAL response with an empty
array is malformed and <bcp14>MUST</bcp14> be rejected.</t>
            </dd>
          </dl>
          <t>A non-empty ccrr_range_status pairs only with NFS4_OK or
NFS4ERR_PARTIAL at the top level; every other top-level
nfsstat4 carries an empty ccrr_range_status.</t>
          <t>See "RESPONSE CODES" below for the normative
meanings the metadata server attaches to each
returned top-level nfsstat4.</t>
        </section>
        <section anchor="response-codes-18">
          <name>RESPONSE CODES</name>
          <t>The ccrr_status value returned by the client has the following
normative meanings to the metadata server:</t>
          <dl>
            <dt>NFS4_OK:</dt>
            <dd>
              <t>The client has accepted the request and driven every range in
this callback to completion (CHUNK_REPAIRED or CHUNK_UNLOCK on
every affected chunk).  The metadata server clears the repair
queue entry.</t>
            </dd>
            <dt>NFS4ERR_DELAY:</dt>
            <dd>
              <t>The client has accepted the request but requires more time.
The metadata server <bcp14>MAY</bcp14> extend the deadline by issuing a new
CB_CHUNK_REPAIR with a later ccra_deadline, or <bcp14>MAY</bcp14> re-select
another client.  The client continues to hold any locks it has
adopted until the original or extended deadline.</t>
            </dd>
            <dt>NFS4ERR_ENCODING_NOT_SUPPORTED:</dt>
            <dd>
              <t>The client does not implement the encoding type of the layout
and cannot reconstruct.  The metadata server <bcp14>MUST NOT</bcp14> retry with
the same client and <bcp14>SHOULD</bcp14> select a different client.</t>
            </dd>
            <dt>NFS4ERR_PAYLOAD_LOST:</dt>
            <dd>
              <t>The client has concluded that the identified ranges cannot
be repaired -- there are not enough surviving shards to
reconstruct and rollback is also impossible.  The metadata
server <bcp14>MUST NOT</bcp14> retry the repair and transitions the affected
ranges into an implementation-defined damaged state.  See
<xref target="sec-NFS4ERR_PAYLOAD_LOST"/>.</t>
            </dd>
            <dt>NFS4ERR_PARTIAL:</dt>
            <dd>
              <t>At least one range in the callback did not reach the
completion contract.  The metadata server <bcp14>MUST</bcp14> consume the
co-indexed ccrr_range_status array to determine the per-range
outcome; NFS4ERR_PARTIAL is not a whole-callback retriable
error and <bcp14>MUST NOT</bcp14> be treated as one.  The array is
authoritative: each ccrr_range_status entry maps directly to
the co-indexed entry in ccra_ranges and is evaluated on its
own terms (NFS4_OK, NFS4ERR_DELAY, NFS4ERR_ENCODING_NOT_SUPPORTED,
NFS4ERR_PAYLOAD_LOST, or another per-range disposition) per
the result contract above.  An NFS4ERR_PARTIAL response with an
empty ccrr_range_status array is malformed and the metadata
server <bcp14>MUST</bcp14> reject the callback response.  See
<xref target="sec-NFS4ERR_PARTIAL"/>.</t>
            </dd>
          </dl>
          <t>All other error codes listed in <xref target="tbl-cb-ops-and-errors"/> are
treated by the metadata server as retriable: the metadata server
<bcp14>MAY</bcp14> issue a subsequent CB_CHUNK_REPAIR to the same or a
different client.  If the client becomes unreachable (no
response within the deadline), the metadata server re-selects
per <xref target="sec-repair-selection"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="sec-composed-rollback">
      <name>Composed Rollback Guarantee and Error Decision Tree</name>
      <t>The flexible file v2 layout chunk protocol combines three
related mechanisms -- writer-supplied opaque owner identity
(<xref target="sec-chunk_owner4"/>), best-effort predecessor
discovery (<xref target="sec-CHUNK_HEADER_READ"/> /
<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>), and metadata-server escrow
control-plane pinning (<xref target="sec-CHUNK_ESCROW_INSTALL"/> /
<xref target="sec-CHUNK_ESCROW_RELEASE"/> /
<xref target="sec-CHUNK_ESCROW_ENUMERATE"/> /
<xref target="sec-CHUNK_ESCROW_TAKEOVER"/>,
<xref target="sec-chunk_guard_mds"/>) -- that together deliver a
CONDITIONAL rollback guarantee.  This section states the
guarantee scope precisely and specifies the client-side
decision tree over the composed error set.</t>
      <section anchor="sec-composed-rollback-scope">
        <name>Guarantee Scope</name>
        <t>The composed guarantee is against protocol-level
garbage collection and owner-association release only,
NOT against storage or integrity failures.  It applies
only when three conditions all hold at the moment a
CHUNK_ROLLBACK is issued
against the named predecessor:</t>
        <ol spacing="normal" type="1"><li>
            <t>Present at acquisition.  The predecessor
generation must have existed on the data server at
the time the qualifying CHUNK_LOCK or metadata-server escrow
was acquired.  Predecessors that had already been
released under the retention scope
(<xref target="sec-system-model-retention-scope"/>) before any
qualifying lock or escrow was acquired are not
covered.</t>
          </li>
          <li>
            <t>Continuous custody.  The lock or escrow
custody chain must have remained uninterrupted
through the rollback decision window.  Custody
handoffs are permitted (a client-owned lock
adopted from a metadata-server escrow lock preserves the
escrow_id4 per <xref target="sec-chunk_guard_mds"/>, and a
subsequent revocation-transfer re-emits the same
escrow_id4 to a new metadata-server escrow lock, keeping the
custody chain continuous), but any interval in
which the predecessor was covered by neither a
qualifying lock nor a metadata-server escrow lock breaks
continuity.</t>
          </li>
          <li>
            <t>Payload remains AVAILABLE.  The predecessor's
payload <bcp14>MUST</bcp14> be in the AVAILABLE read-time state
(<xref target="sec-system-model-read-time-status"/>).  A
predecessor whose payload has become ERRORED
through media loss, unrecoverable corruption,
loss of all redundant data servers, or non-conforming
data-server behavior is not covered
-- an ERRORED predecessor follows the best-effort
reconstruction path
(<xref target="sec-CHUNK_WRITE_REPAIR"/>) and <bcp14>MAY</bcp14> terminate
at NFS4ERR_PAYLOAD_LOST via CB_CHUNK_REPAIR.</t>
          </li>
        </ol>
        <t>When all three conditions hold, a CHUNK_ROLLBACK
that names the predecessor's original owner triple
is guaranteed to restore the predecessor as the
current COMMITTED generation with its original
triple intact
(<xref target="sec-CHUNK_ROLLBACK"/> "Rollback of COMMITTED
Chunks", case (a)).  When any condition fails, the
call may return NFS4ERR_NO_PREDECESSOR
(<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>) or NFS4ERR_INVAL
and the caller falls back to best-effort
reconstruction as described in
<xref target="sec-CHUNK_WRITE_REPAIR"/> -- best-effort
reconstruction into a NEW generation under a NEW
owner triple, or terminal NFS4ERR_PAYLOAD_LOST
when no authoritative source exists.</t>
        <t>The guarantee is a protocol-level protection against
premature release: flexible file v2 layout implementations
<bcp14>MUST NOT</bcp14> release the payload or owner-to-index association of
a predecessor covered by an active qualifying lock or
metadata-server escrow lock, per the payload/association
biconditional
(<xref target="sec-system-model-payload-association-biconditional"/>)
and the retention scope
(<xref target="sec-system-model-retention-scope"/>) as extended
by the escrow-pin mechanism.  It is not a
guarantee against exogenous failures of the
storage substrate.</t>
      </section>
      <section anchor="sec-composed-rollback-tree">
        <name>Client-Side Error Decision Tree</name>
        <t>A client operating over the composed error set
distinguishes control-plane failures (which the
metadata server must resolve) from data-plane
failures (which the client can address via
fallback).  Ordering matters: control-plane
failures must be resolved before data-plane
recovery is attempted.</t>
        <dl>
          <dt>CHUNK_LOCK with CHUNK_LOCK_FLAGS_ADOPT -&gt; NFS4ERR_NO_ADOPTABLE_LOCK (<xref target="sec-NFS4ERR_NO_ADOPTABLE_LOCK"/>):</dt>
          <dd>
            <t>custody / control-plane failure BEFORE any usable lock is
in hand.  The four state causes (no escrow / identity
mismatch / reconciliation hold / already-adopted) are all
conditions the metadata server is best placed to resolve.
The client <bcp14>MUST</bcp14> report the outcome via the
ccrr_range_status array (<xref target="sec-CB_CHUNK_REPAIR"/>) and <bcp14>MUST
NOT</bcp14> unilaterally retry the adoption or begin the
CHUNK_WRITE_REPAIR fallback path
(<xref target="sec-CHUNK_WRITE_REPAIR"/>); that fallback assumes a
usable lock, and no lock exists here to fall back under.</t>
          </dd>
          <dt>CHUNK_LOCK -&gt; NFS4ERR_ACCESS:</dt>
          <dd>
            <t>presenter authorization failure.  Report to the metadata
server; do not retry.</t>
          </dd>
          <dt>After successful CHUNK_LOCK / ADOPT -&gt; CHUNK_HEADER_READ:</dt>
          <dd>
            <t>read the primary owner and chrr_predecessors array.  If the
intended predecessor's triple appears in the list, proceed
to CHUNK_ROLLBACK.  If absent, the CHUNK_WRITE_REPAIR
fallback path may begin directly (do not issue
CHUNK_ROLLBACK against a predecessor known-absent).</t>
          </dd>
          <dt>CHUNK_ROLLBACK -&gt; NFS4ERR_NO_PREDECESSOR (<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>):</dt>
          <dd>
            <t>data-plane result AFTER a usable lock is in hand.  The
actor has the lock; there is simply no restorable
predecessor.  The client <bcp14>MAY</bcp14> invoke best-effort
reconstruction via CHUNK_WRITE_REPAIR under a new owner
triple (<xref target="sec-CHUNK_WRITE_REPAIR"/>); fallback <bcp14>MAY</bcp14> terminate
at NFS4ERR_PAYLOAD_LOST (<xref target="sec-NFS4ERR_PAYLOAD_LOST"/>) if
no authoritative source exists.</t>
          </dd>
          <dt>CHUNK_ROLLBACK -&gt; NFS4ERR_INVAL or NFS4ERR_NO_PREDECESSOR for a fresh op naming a released triple:</dt>
          <dd>
            <t>terminal per-entry failure.  Caller holds a stale
reference; no operation defined in this document
resurrects the deleted generation.  The data server
returns NFS4ERR_INVAL within the delete case's
session-slot replay-cache window and NFS4ERR_NO_PREDECESSOR
after the window has elapsed or for any other terminal
release (per the release-scope split at
<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>).  Compare either code to
the uncertain-replay carve-out (<xref target="sec-CHUNK_ROLLBACK"/>
"Idempotence and Uncertain-Replay Carve-Out") which
permits an EXACT reissue after uncertain prior completion
to treat NFS4ERR_INVAL or NFS4ERR_NO_PREDECESSOR as
postcondition-equivalent success, but ONLY when the caller
independently verifies the postcondition holds.</t>
          </dd>
          <dt>Any CHUNK_ESCROW operation -&gt; NFS4ERR_STALE_ESCROW (<xref target="sec-NFS4ERR_STALE_ESCROW"/>):</dt>
          <dd>
            <t>control-plane identity mismatch or no covering escrow on
the metadata server's own CHUNK_ESCROW_RELEASE.  The
response never authorizes tuple removal by itself when
adoption may have consumed the escrow (see
<xref target="sec-CHUNK_ESCROW_RELEASE"/>).</t>
          </dd>
          <dt>Any CHUNK_ESCROW operation -&gt; NFS4ERR_STALE_MDS_EPOCH (<xref target="sec-NFS4ERR_STALE_MDS_EPOCH"/>):</dt>
          <dd>
            <t>the metadata server has been fenced by a superseding
CHUNK_ESCROW_TAKEOVER.  The metadata server <bcp14>MUST</bcp14> obtain a
fresh incarnation-lease token and reissue via
CHUNK_ESCROW_TAKEOVER;
TAKEOVER is exempt from this rejection.</t>
          </dd>
          <dt>CB_CHUNK_REPAIR response -&gt; NFS4ERR_PARTIAL (<xref target="sec-NFS4ERR_PARTIAL"/>):</dt>
          <dd>
            <t>at least one named range did not reach completion; the
metadata server <bcp14>MUST</bcp14> consume the per-range
ccrr_range_status array (<xref target="sec-CB_CHUNK_REPAIR"/>) to
determine per-range outcome.</t>
          </dd>
        </dl>
        <t>The essential distinction is that
NFS4ERR_NO_ADOPTABLE_LOCK and
NFS4ERR_NO_PREDECESSOR both prevent the direct
rollback path, but at different lifecycle stages
and with different recovery authorities:
NFS4ERR_NO_ADOPTABLE_LOCK is a custody / control-plane
failure BEFORE the actor obtains usable
custody (unrecoverable unilaterally), while
NFS4ERR_NO_PREDECESSOR is a data-plane result
AFTER successful adoption where the actor
already holds the lock but finds no restorable
predecessor data (the actor <bcp14>MAY</bcp14> invoke
best-effort reconstruction via
CHUNK_WRITE_REPAIR).  A client that receives one <bcp14>MUST NOT</bcp14>
treat it as the other.</t>
      </section>
      <section anchor="sec-composed-rollback-trace">
        <name>Worked Example: Composed Rollback and Fallback</name>
        <t>The following worked example exercises the three
composed conditions.  A single file has chunk index
5 previously written by client 7 with co_cohort_id
41 and co_id 100 (owner triple (41, 7, 100)) and then
overwritten by client 7 with co_cohort_id 42 and co_id
101 (owner triple (42, 7, 101)), which reached the
COMMITTED state.  The metadata server determines
that the (42, 7, 101) commit was incorrect and
initiates rollback.  The trace shows the happy
path, the lost-callback branch, and the fallback
contrast.</t>
        <t>Note that the owner triple is (co_cohort_id,
co_client_id, co_id) throughout, per
<xref target="sec-chunk_owner4"/>; per-chunk CAS state
(cg_gen_id, cg_client_id) is data-server-managed and is
distinct from these owner-identity numbers.</t>
        <section anchor="sec-composed-rollback-happy">
          <name>Happy Path (all three conditions hold)</name>
          <ol spacing="normal" type="1"><li>
              <t>The metadata server proactively installs an
metadata-server escrow lock over chunk index 5 by sending
CHUNK_ESCROW_INSTALL with escrow_id4 E1 while
the (41, 7, 100) predecessor is still
AVAILABLE on the data server.  The data server
accepts and echoes E1 in ceir_escrow_id.  Per
<xref target="sec-composed-rollback-scope"/> conditions 1
and 3, the predecessor is now under continuous
metadata-server escrow custody and remains AVAILABLE.</t>
            </li>
            <li>
              <t>The metadata server sends CB_CHUNK_REPAIR to a
selected repair actor with ccra_escrow_id =
E1 and a range naming chunk index 5.</t>
            </li>
            <li>
              <t>The repair actor issues CHUNK_LOCK with
CHUNK_LOCK_FLAGS_ADOPT and cla_adopt = { TRUE,
cla_escrow_id = E1 }.  The data server
validates identity and atomically transfers
custody: E1 dissolves as a metadata-server escrow lock,
the client owns the lock, the predecessor's
payload and owner association survive intact,
and E1 is retained as durable custody metadata
on the client-owned lock (per
<xref target="sec-chunk_guard_mds"/>).  Condition 2
(continuous custody) is preserved through the
adoption.</t>
            </li>
            <li>
              <t>The repair actor issues CHUNK_HEADER_READ over
chunk index 5.  The response shows chrr_owners
as the (42, 7, 101) current generation and
<tt>chrr_predecessors[0]</tt> as the (41, 7, 100)
retained predecessor
(<xref target="sec-CHUNK_HEADER_READ"/>).</t>
            </li>
            <li>
              <t>The repair actor issues CHUNK_ROLLBACK naming
the predecessor's triple (41, 7, 100).  The
data server executes "Rollback of COMMITTED
Chunks" case (a)
(<xref target="sec-CHUNK_ROLLBACK"/>): the retained
predecessor is restored as the current
COMMITTED generation under its original triple
(41, 7, 100), and the displaced successor's
triple (42, 7, 101) is atomically invalidated
("Deletion Atomicity and Invalidated
Triples").</t>
            </li>
            <li>
              <t>The repair actor issues CHUNK_UNLOCK.  The
client-owned lock is released; the preserved
escrow_id4 custody metadata is cleared.</t>
            </li>
            <li>
              <t>The repair actor returns NFS4_OK on the
CB_CHUNK_REPAIR response with a co-indexed
NFS4_OK in ccrr_range_status.  The metadata
server issues CHUNK_ESCROW_RELEASE with
cera_escrow_id = E1.  Because E1 was consumed
by the adoption in step 3, the data server
returns NFS4ERR_STALE_ESCROW; the metadata
server interprets this as "the escrow was
consumed by ADOPT and the callback response
confirms completion," and clears its
durable escrow-tuple record for (file, E1,
{this data server}).</t>
            </li>
          </ol>
        </section>
        <section anchor="sec-composed-rollback-lost">
          <name>Lost-Callback Branch</name>
          <t>Steps 1-6 proceed as above but the CB_CHUNK_REPAIR
response is lost in transit (data server restart or
network failure before the metadata server receives the
reply).  The metadata server never observes step-7
confirmation.  The repair actor's lock lease eventually
expires without an explicit release, and the data server
transitions the lock through the revocation-transfer path
(see <xref target="sec-chunk_guard_mds"/>): a new metadata-server escrow
lock is installed on the same range with the same
preserved escrow_id4 = E1.  On the next
CHUNK_ESCROW_ENUMERATE the metadata server observes the
reappeared E1 and reissues repair under it.</t>
        </section>
        <section anchor="sec-composed-rollback-fallback">
          <name>Fallback Contrast (condition 1 fails)</name>
          <t>Under an alternative setup where the metadata server did
NOT install a metadata-server escrow before the retention
scope (<xref target="sec-system-model-retention-scope"/>) released the
(41, 7, 100) predecessor, condition 1 fails.  By the time
repair is initiated the predecessor is ABSENT on the data
server, and the escrow the metadata server installs pins
only what still exists (there is no predecessor to pin).
The repair actor's CHUNK_LOCK / CHUNK_HEADER_READ sequence
discovers no retained predecessor for index 5.  A
subsequent CHUNK_ROLLBACK against the (41, 7, 100) triple
returns NFS4ERR_NO_PREDECESSOR
(<xref target="sec-NFS4ERR_NO_PREDECESSOR"/>).  The client falls back
to CHUNK_WRITE_REPAIR, reconstructing authoritative bytes
from surviving data-server shards and writing them under
a new owner triple of its own choosing -- for example
(43, 7, 102).  The resulting COMMITTED generation carries
the new triple, NOT the released (41, 7, 100).</t>
          <t>Any subsequent lifecycle operation that names the
released (41, 7, 100) triple returns NFS4ERR_NO_PREDECESSOR
-- the (41, 7, 100) association was released under the
retention scope, not by an explicit CHUNK_ROLLBACK delete
case within a live replay-cache window, so the
release-scope split at <xref target="sec-NFS4ERR_NO_PREDECESSOR"/>
routes to the NO_PREDECESSOR arm consistent with the
previous CHUNK_ROLLBACK outcome in this trace: the
fallback creates a new generation, it does not resurrect
the released predecessor.  When no authoritative source
exists for reconstruction, the fallback itself terminates
at NFS4ERR_PAYLOAD_LOST (<xref target="sec-NFS4ERR_PAYLOAD_LOST"/>)
via CB_CHUNK_REPAIR.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The combination of components in a pNFS system is required to
preserve the security properties of NFSv4.1+ with respect to an
entity accessing data via a client.  The pNFS feature partitions
the NFSv4.1+ file system protocol into two parts: the control
protocol and the data protocol.  As the control protocol in this
document is NFS, the security properties are equivalent to the
version of NFS being used.  The flexible file v2 layout further divides
the data protocol into metadata and data paths.  The security
properties of the metadata path are equivalent to those of NFSv4.1x
(see Sections 1.7.1 and 2.2.1 of <xref target="RFC8881"/>).  And the security
properties of the data path are equivalent to those of the version
of NFS used to access the storage device, with the provision that
the metadata server is responsible for authenticating client access
to the data file.  The metadata server provides appropriate credentials
to the client to access data files on the storage device.  It is
also responsible for revoking access for a client to the storage
device.</t>
      <t>The metadata server enforces the file access control policy at
LAYOUTGET time.  The client <bcp14>MUST</bcp14> use RPC authorization credentials
for getting the layout for the requested iomode (LAYOUTIOMODE4_READ
or LAYOUTIOMODE4_RW), and the server verifies the permissions and
ACL for these credentials, possibly returning NFS4ERR_ACCESS if the
client is not allowed the requested iomode.  If the LAYOUTGET
operation succeeds, the client receives, as part of the layout, a
set of credentials allowing it I/O access to the specified data
files corresponding to the requested iomode.  When the client acts
on I/O operations on behalf of its local users, it <bcp14>MUST</bcp14> authenticate
and authorize the user by issuing respective OPEN and ACCESS calls
to the metadata server, similar to having NFSv4 data delegations.</t>
      <t>Under loose coupling, the combination of filehandle,
synthetic uid, and gid in the layout is the way that the
metadata server enforces access control to the data server.
The client only has access to filehandles of file objects
and not directory objects.  Thus, given a filehandle in a
layout, it is not possible to guess the parent directory
filehandle.  Further, as the data file permissions only
allow the given synthetic uid read/write permission and
the given synthetic gid read permission, knowing the
synthetic ids of one file does not necessarily allow
access to any other data file on the storage device.</t>
      <t>Under loose coupling, the metadata server can also deny
access at any time by fencing the data file, which means
changing the synthetic ids.  In turn, that forces the
client to return its current layout and get a new layout
if it wants to continue I/O to the data file.</t>
      <t>Under tight coupling
(<xref target="sec-tight-coupling-control-session"/>), the metadata
server does not rely on synthetic uid and gid values to
enforce access at the data server.  Instead, the metadata
server injects a per-stateid trust entry into the data
server via TRUST_STATEID (<xref target="sec-TRUST_STATEID"/>); the data
server validates each CHUNK operation against the
registered trust entry and rejects operations that do not
present a registered stateid.  The metadata server rescinds
that authorization via REVOKE_STATEID
(<xref target="sec-REVOKE_STATEID"/>) for a single stateid or
BULK_REVOKE_STATEID (<xref target="sec-BULK_REVOKE_STATEID"/>) for
every stateid a client currently holds; both are the
tight-coupling equivalent of a synthetic-id change and
achieve the same effect (the client <bcp14>MUST</bcp14> return its
current layout and obtain a new one to continue I/O to
the data file).  The security implications of the
trust-stateid channel are covered in
<xref target="sec-security-trust-stateid"/>.</t>
      <t>If access is allowed, the client uses the corresponding (read-only
or read/write) credentials to perform the I/O operations at the
data file's storage devices.  When the metadata server receives a
request to change a file's permissions or ACL, it <bcp14>SHOULD</bcp14> recall all
layouts for that file and then <bcp14>MUST</bcp14> fence off any clients still
holding outstanding layouts for the respective files by implicitly
invalidating the previously distributed credential on all data file
comprising the file in question.  It is <bcp14>REQUIRED</bcp14> that this be done
before committing to the new permissions and/or ACL.  By requesting
new layouts, the clients will reauthorize access against the modified
access control metadata.  Recalling the layouts in this case is
intended to prevent clients from getting an error on I/Os done after
the client was fenced off.</t>
      <section anchor="sec-security-checksum-scope">
        <name>Checksum Integrity Scope</name>
        <t>The checksum values carried in CHUNK_WRITE and returned from
CHUNK_READ defend against accidental data corruption during
storage or transmission -- bit flips on storage media, network
errors, software bugs in the erasure transform.  The threat
model an individual deployment achieves depends on which
checksum_algorithm4 (<xref target="sec-checksum4"/>) the metadata server
selects for the file's mirrors via ffv2m_checksum_algorithm
(<xref target="sec-ffv2-mirror4"/>):</t>
        <dl>
          <dt>Bit-flip-class algorithms (CRC32, CRC32C, Fletcher4):</dt>
          <dd>
            <t>Detect accidental bit-level corruption with high
probability.  Do NOT defend against an adversary who can
modify the payload and recompute a valid checksum, because
these algorithms are not cryptographic and the algorithm
identifier and parameters are public.  Suitable when the
threat model excludes adversaries on the wire and at rest.</t>
          </dd>
          <dt>Cryptographic-strength algorithms (SHA-256, SHA-512, BLAKE3):</dt>
          <dd>
            <t>Detect accidental corruption with cryptographic-strength
collision resistance.  These are UNKEYED hashes carried
alongside the payload on the wire, so they do NOT by
themselves defend against an adversary who can modify a
chunk and recompute a valid hash: the attacker knows the
algorithm and can substitute a matching digest.  Content
authentication against active adversaries requires a keyed
MAC or signature scheme (e.g., RPCSEC_GSS_KRB5I,
RPC-over-TLS with mutual authentication, or an
application-layer signed manifest) applied at the trust
boundary; the checksum mechanism defined here provides
corruption detection, not content authentication.
Suitable when chunks may be at rest on storage the
deployment does not fully control and the deployment
layers cryptographic transport or storage integrity on
top of the checksum for adversarial protection.</t>
          </dd>
          <dt>CHECKSUM_ALG_NONE:</dt>
          <dd>
            <t>No protocol-level integrity check.  The deployment is
relying on transport-layer integrity (RPC-over-TLS
<xref target="RFC9289"/>, RPCSEC_GSS_KRB5I) or storage-layer integrity
(filesystem checksums on the data server, RAID-level
integrity) instead.  Suitable when those other layers are
reliably present end-to-end and the per-chunk wire
protection would be redundant.</t>
          </dd>
        </dl>
        <t>Deployments requiring protection against active attackers
<bcp14>SHOULD</bcp14> select one of the cryptographic algorithms, OR use
CHECKSUM_ALG_NONE in conjunction with RPC-over-TLS
(<xref target="sec-tls"/>) or RPCSEC_GSS, whichever fits the deployment's
existing security architecture.</t>
        <t>An authenticated client is in the "active attacker" role with
respect to its own chunks, in a restricted sense.  The data
server validates the checksum against the bytes the client
provided, so an authenticated client that chooses to send
semantically-invalid bytes with a correctly computed checksum will
have those bytes accepted.  The residual risk differs per
authentication model:</t>
        <ul spacing="normal">
          <li>
            <t>Under AUTH_SYS with loose coupling, the residual risk is
essentially the pre-existing attack surface of NFSv3 writes:
any host that can reach the data server with a valid uid can
write nonsense to chunks that uid owns.  This is the Flex
Files v1 authorization model, which flexible file v2 layout inherits
without modification for this path.</t>
          </li>
          <li>
            <t>Under RPCSEC_GSS or TLS with mutual authentication, the
residual risk reduces to: only the authenticated client
can write nonsense into chunks it owns.  Cross-client
corruption is prevented because the data server verifies the
principal before accepting the write.  The remaining
exposure is at the client's own integrity: any deployment
that relies on data integrity above the wire <bcp14>MUST</bcp14> apply
application-level content validation.</t>
          </li>
        </ul>
        <t>Flexible file v2 layout does not attempt to defend against this
authenticated-but-malicious case.  The checksum mechanism is a
transport-integrity check, not a content-integrity check; the
system trust model assumes that an authenticated principal is
entitled to destroy the content of chunks it owns.</t>
      </section>
      <section anchor="chunk-lock-and-lease-expiry">
        <name>Chunk Lock and Lease Expiry</name>
        <t>When a client holds a chunk lock (acquired via CHUNK_LOCK) and its
lease expires or the client crashes, the lock is released implicitly
by the data server.  This opens a window in which another client
may write to the previously locked range before the original client's
repair is complete.  Implementations <bcp14>SHOULD</bcp14> ensure that the lease
period for chunk locks is sufficient to complete repair operations,
and <bcp14>SHOULD</bcp14> implement CHUNK_UNLOCK explicitly on abort paths.  The
metadata server's LAYOUTERROR and LAYOUTRETURN mechanisms provide
the coordination point for detecting and resolving such races.</t>
      </section>
      <section anchor="error-code-information-disclosure">
        <name>Error Code Information Disclosure</name>
        <t>The new error codes NFS4ERR_CHUNK_LOCKED (10099) and
NFS4ERR_PAYLOAD_NOT_ATOMIC (10098) convey information about
chunk state to the caller.  Both of these errors <bcp14>MAY</bcp14> be returned
to callers whose credentials have not been verified by the data
server (e.g., when the AUTH_SYS uid presented does not match the
synthetic uid on the data file).  The information they reveal --
that a chunk is locked, or that a CRC mismatch occurred -- does
not directly disclose file contents but may indicate concurrent
write activity.  Implementations that are concerned about this
level of disclosure <bcp14>SHOULD</bcp14> require that CHUNK operations
only succeed after credential verification and return
NFS4ERR_ACCESS for unverified callers rather than the more
specific error codes.</t>
        <t>This document adds NFS4ERR_NO_PREDECESSOR (10103),
NFS4ERR_NO_ADOPTABLE_LOCK (10104), NFS4ERR_STALE_ESCROW (10105),
NFS4ERR_STALE_MDS_EPOCH (10106), and NFS4ERR_PARTIAL (10107).
All five reveal control-plane or discovery state that a
compromised or curious caller could aggregate into a picture of
which files are under repair, which are pinned, and which epoch
is current.  A data server <bcp14>SHOULD</bcp14> enforce presenter
authorization before returning any of these codes so that an
unauthorized caller receives NFS4ERR_ACCESS rather than the
specific state indicator.  In particular, NFS4ERR_STALE_MDS_EPOCH
and unknown-profile NFS4ERR_NOTSUPP on CHUNK_ESCROW_TAKEOVER are
gated behind presenter authorization by the strict evaluation
order in <xref target="sec-proof-profile"/>; that ordering is a security
requirement, not merely a diagnostic preference.</t>
      </section>
      <section anchor="sec-security-escrow">
        <name>Escrow Control Plane and Incarnation Proofs</name>
        <t>This document's escrow control plane introduces four operations
(CHUNK_ESCROW_INSTALL, CHUNK_ESCROW_RELEASE,
CHUNK_ESCROW_ENUMERATE, CHUNK_ESCROW_TAKEOVER --
<xref target="sec-CHUNK_ESCROW_INSTALL"/> through
<xref target="sec-CHUNK_ESCROW_TAKEOVER"/>) and one proof envelope
(<xref target="sec-proof-profile"/>) whose security properties merit
dedicated treatment.</t>
        <section anchor="authorization-scope">
          <name>Authorization scope</name>
          <t>CHUNK_ESCROW_INSTALL, CHUNK_ESCROW_RELEASE, and
CHUNK_ESCROW_ENUMERATE <bcp14>MUST</bcp14> be invoked only by the metadata
server currently holding the incarnation lease.  A data server
<bcp14>MUST</bcp14> authenticate the presenter via RPCSEC_GSS
(<xref target="RFC7861"/>) and verify the presenter's principal against
the deployment-configured metadata-server principal(s) for
the file's device before accepting any escrow-family
operation; presenter authorization failure returns
NFS4ERR_ACCESS with no side effect on escrow state.  This
authorization is orthogonal to the ordinary client-facing
NFSv4 access controls: an authenticated pNFS client's
credentials <bcp14>MUST NOT</bcp14> authorize an escrow-family operation
even if the client is otherwise permitted to read or write
the file.  A data server that receives any escrow-family
operation on a session belonging to a non-metadata-server
principal <bcp14>MUST</bcp14> reject with NFS4ERR_ACCESS or NFS4ERR_PERM
per the ordinary NFSv4 rules.</t>
        </section>
        <section anchor="trust-anchor-lifecycle">
          <name>Trust anchor lifecycle</name>
          <t>The proof profile depends on a deployment-provisioned trust
anchor at each data server (<xref target="sec-proof-profile"/> "Trust
Anchor Provisioning").  Anchor compromise permits an
adversary to forge incarnation-lease tokens and stage
takeovers of the escrow control plane; anchor
unavailability blocks legitimate takeovers and inhibits
recovery from an incarnation failure.  Deployments <bcp14>SHOULD</bcp14>:</t>
          <ul spacing="normal">
            <li>
              <t>provision separate anchors per proof profile so revocation
of one profile does not require replacing keys for others;</t>
            </li>
            <li>
              <t>rotate anchors on a schedule consistent with the
authority's own key-management posture (this specification
does not mandate a rotation interval); and</t>
            </li>
            <li>
              <t>retain the ability to revoke an anchor out-of-band without
requiring a wire-level protocol message, because a
compromised anchor's tokens will otherwise satisfy the
data server's strict-ordering checks by construction.</t>
            </li>
          </ul>
          <t>An incarnation-lease authority <bcp14>MUST NOT</bcp14> delegate signing to
any component the metadata server can spoof; the security of
the proof mechanism rests on the assumption that the
authority is a distinct entity from any metadata server and
can independently attest current single writer ownership.</t>
        </section>
        <section anchor="replay-cache-exhaustion-and-durability">
          <name>Replay-cache exhaustion and durability</name>
          <t>The token_id replay cache at the data server
(<xref target="sec-proof-profile"/> "Presentation and Verification") is a
finite resource.  A hostile presenter that can obtain many
valid tokens for the same profile <bcp14>MAY</bcp14> attempt to grow the
cache without bound.  A data server <bcp14>SHOULD</bcp14> bound the cache
size and expire entries no later than their token's
expires_at; entries older than the longest admissible
issued_at-to-expires_at window <bcp14>MAY</bcp14> be evicted.  Eviction
does not sacrifice lost-response recovery: the byte-identical
uncertain-completion recovery path
(<xref target="sec-CHUNK_ESCROW_TAKEOVER-uncertain-completion"/>)
recognizes both the cache-hit and the cache-miss form of
the same reissue, so a token whose replay entry has aged
out still resolves to NFS4_OK when its ceta_new_epoch
equals the data server's currently-recorded epoch and its
ceta_expected_prior_epoch is strictly prior.  A hostile
presenter cannot exploit the cache-miss form to advance
the epoch: proof verification still gates on the token's
signature and principal, and once a subsequent successful
TAKEOVER advances past ceta_new_epoch the reissue no
longer satisfies the postcondition-equivalent predicates.</t>
          <t>Data servers that persist the token_id cache across restart
<bcp14>MUST</bcp14> persist and evict entries coherently with expires_at
values.  A data server that does not persist the cache
returns to the freshly-initialized state after restart;
lost-response reissues still resolve through the cache-miss
form of the uncertain-completion recovery path.</t>
        </section>
        <section anchor="discovery-information-disclosure">
          <name>Discovery information disclosure</name>
          <t>CHUNK_ESCROW_ENUMERATE and the CHUNK_HEADER_READ
predecessor arm (<xref target="sec-CHUNK_HEADER_READ"/>) disclose
control-plane and discovery information.
CHUNK_ESCROW_ENUMERATE is gated behind the escrow-role
authorization above; CHUNK_HEADER_READ's predecessor list is
available to any pNFS client holding a valid layout for the
file.  A deployment where predecessor identity is itself
sensitive (for example, because owner triples encode
information about the writer's identity that ordinary read
authorization does not disclose) <bcp14>SHOULD</bcp14> scope the layout so
that only appropriately-authorized clients can obtain it.
The specification does not require the data server to
suppress predecessor disclosure on a per-client basis; where
that is required, deploy at the layout-authorization layer.</t>
        </section>
        <section anchor="resource-exhaustion-via-long-lived-escrows">
          <name>Resource exhaustion via long-lived escrows</name>
          <t>A compromised or faulty metadata server can install an
arbitrary number of long-lived metadata-server escrow locks via
CHUNK_ESCROW_INSTALL, each of which forces retention of a
predecessor generation the data server would otherwise
release under the retention scope rule
(<xref target="sec-system-model-retention-scope"/>).  Sustained abuse
could exhaust data-server storage.  A data server <bcp14>MAY</bcp14> apply
implementation-defined admission control on the total number
of metadata-server escrow locks it holds concurrently, rejecting further
CHUNK_ESCROW_INSTALL with NFS4ERR_SERVERFAULT or a
resource-exhaustion error when the bound is reached; the
metadata server can then release older escrows or wait for
their natural completion before retrying.  This
specification does not prescribe a concrete bound; the
choice is deployment-local and interacts with the
data-server's storage-management policy.</t>
        </section>
        <section anchor="consequence-of-losing-durable-adopted-lock-escrow-identity">
          <name>Consequence of losing durable adopted-lock escrow identity</name>
          <t>The client-owned lock that adopted a metadata-server escrow retains the
adopted escrow_id4 as durable custody metadata per
<xref target="sec-chunk_guard_mds"/>; on data-server restart this
metadata must survive so a subsequent revocation-transfer
re-emits the same identity.  A data server that fails to
persist the adopted escrow_id4 (whether by implementation
defect or storage corruption) forces the metadata server's
tuple bookkeeping into an unresolvable state: the recovered
metadata-server escrow appears with a fresh identity that no durable
tuple matches, and the composed rollback guarantee
(<xref target="sec-composed-rollback"/>) is broken for repairs that
crossed the restart.  A deployment <bcp14>SHOULD</bcp14> monitor for
missing-adopted-id events and treat them as a data-server
failure requiring operator investigation.</t>
        </section>
      </section>
      <section anchor="sec-tls">
        <name>Transport Layer Security</name>
        <t>RPC-over-TLS <xref target="RFC9289"/> <bcp14>MAY</bcp14> be used to protect traffic between the
client and the metadata server and between the client and data servers.
When RPC-over-TLS is in use on the data server path, the synthetic
uid/gid credentials carried in AUTH_SYS remain the access control
mechanism; TLS provides confidentiality and integrity for the transport
but does not replace the fencing model described in <xref target="sec-Fencing-Clients"/>.
Servers that require transport security <bcp14>SHOULD</bcp14> advertise this via the
SECINFO mechanism rather than silently dropping connections.</t>
      </section>
      <section anchor="rpcsecgss-and-security-services">
        <name>RPCSEC_GSS and Security Services</name>
        <t>This document does not specify how RPCSEC_GSS <xref target="RFC7861"/> is
used between the client and a storage device in the loosely
coupled model, and the reasons differ between the two coupling
models.  Because the loosely coupled model uses synthetic
credentials that are managed by the metadata server rather than
shared with the storage device, a full RPCSEC_GSS integration
would require protocol work (RPCSEC_GSSv3 structured privilege
assertions, per <xref target="RFC7861"/>) on all three of the metadata
server, the storage device, and the client.  In the tightly
coupled model the principal used to access the data file is the
same as the one used to access the metadata file, so
RPCSEC_GSS applies unchanged.  The two subsections below treat
each model in turn.</t>
        <section anchor="loosely-coupled">
          <name>Loosely Coupled</name>
          <t>RPCSEC_GSS version 3 (RPCSEC_GSSv3) <xref target="RFC7861"/> contains facilities
that would allow it to be used to authorize the client to the storage
device on behalf of the metadata server.  Doing so would require
that each of the metadata server, storage device, and client would
need to implement RPCSEC_GSSv3 using an RPC-application-defined
structured privilege assertion in a manner described in <xref section="4.9.1" sectionFormat="of" target="RFC7862"/>.  The specifics necessary to do so are not
described in this document.  This is principally because any such
specification would require extensive implementation work on a wide
range of storage devices, which would be unlikely to result in a
widely usable specification for a considerable time.</t>
          <t>As a result, the layout type described in this document will not
provide support for use of RPCSEC_GSS together with the loosely
coupled model.  However, future layout types could be specified,
which would allow such support, either through the use of RPCSEC_GSSv3
or in other ways.</t>
        </section>
        <section anchor="tightly-coupled">
          <name>Tightly Coupled</name>
          <t>With tight coupling, the principal used to access the metadata file
is exactly the same as used to access the data file.  The storage
device can use the control protocol to validate any RPC credentials.
As a result, there are no security issues related to using RPCSEC_GSS
with a tightly coupled system.  For example, if Kerberos V5 Generic
Security Service Application Program Interface (GSS-API) <xref target="RFC4121"/>
is used as the security mechanism, then the storage device could
use a control protocol to validate the RPC credentials to the
metadata server.</t>
        </section>
      </section>
      <section anchor="sec-security-trust-stateid">
        <name>Trusted Stateids</name>
        <t>The TRUST_STATEID, REVOKE_STATEID, and BULK_REVOKE_STATEID
operations (<xref target="sec-TRUST_STATEID"/>, <xref target="sec-REVOKE_STATEID"/>,
<xref target="sec-BULK_REVOKE_STATEID"/>) introduce a per-stateid
authorization channel between the metadata server and the
data server.  The security implications of that channel are
distinct from those of the loosely coupled synthetic-uid
model (<xref target="sec-Fencing-Clients"/>) and warrant their own
treatment.</t>
        <section anchor="interaction-with-kerberos-and-rpcsecgss">
          <name>Interaction with Kerberos and RPCSEC_GSS</name>
          <t>Trusted stateids decouple the credential the data server
uses to authorize I/O from the credential the client uses
to authenticate to the data server.  Under loose coupling
(<xref target="sec-Fencing-Clients"/>), the metadata server inserts a
synthetic uid/gid into the layout and the client presents
that synthetic credential on every data-server RPC; the
data server has no independent verification of the
client's identity, and a client that learns another
client's synthetic uid/gid can impersonate it on the data
path.  Tight coupling via TRUST_STATEID changes this in
three ways:</t>
          <ul spacing="normal">
            <li>
              <t>The metadata server records the client's authenticated
principal in the trust entry via tsa_principal at
TRUST_STATEID time (<xref target="sec-TRUST_STATEID"/>).  Under
RPCSEC_GSS (typically Kerberos V5 GSS-API per
<xref target="RFC4121"/>), tsa_principal is the GSS display name
(for example, "alice@REALM"); under AUTH_SYS and TLS,
tsa_principal is the empty string.</t>
            </li>
            <li>
              <t>The client presents its own RPCSEC_GSS context on each
CHUNK operation against the data server.  Under
tight coupling with GSS, the data server <bcp14>MUST</bcp14> verify
that the principal carried in the inbound RPC's
RPCSEC_GSS context matches the tsa_principal recorded
for the stateid in its trust table; a mismatch returns
NFS4ERR_ACCESS.  A client that learned another
client's layout stateid (from a log file, a packet
capture of cleartext RPC, or any other leak) cannot
use it because their own GSS principal would not
match.</t>
            </li>
            <li>
              <t>The data server does NOT need its own Kerberos keytab
to validate each client principal individually.  In a
loose coupling Kerberos deployment the data server
would have to be a service principal in every realm
it serves clients from; under tight coupling the data
server's keytab is only required for its session with
the metadata server (the control session,
<xref target="sec-tight-coupling-control"/>).  Operational
complexity of Kerberos deployment is meaningfully
reduced.</t>
            </li>
          </ul>
          <t>The mechanism does not authenticate the metadata server
to the client; it authenticates the client to the data
server using credentials the metadata server vouched for
at LAYOUTGET time.  Compromise of the metadata server
allows an attacker to register arbitrary trust entries;
the metadata server is the trust anchor for the layout
grant, unchanged from the existing pNFS layout-issuance
model.</t>
        </section>
        <section anchor="attack-surfaces-and-mitigations">
          <name>Attack Surfaces and Mitigations</name>
          <dl>
            <dt>Compromised metadata server:</dt>
            <dd>
              <t>An attacker controlling the metadata server can issue
TRUST_STATEID for any (layout stateid, principal)
pair.  This is the same trust assumption pNFS already
makes -- the metadata server grants layouts and the
data servers honor them.  Deployment defense is the
same: restrict administrative access to the metadata
server, require RPCSEC_GSS or RPC-over-TLS
(<xref target="RFC9289"/>) with mutual authentication on the
control session (<xref target="sec-tight-coupling-control"/>), and
monitor for anomalous TRUST_STATEID volume.</t>
            </dd>
            <dt>Compromised data server:</dt>
            <dd>
              <t>A compromised data server sees plaintext chunk
payloads at rest and on the wire (subject to whatever
the deployment uses for at-rest encryption and
transport security).  It can return arbitrary content
on CHUNK_READ with a correctly computed checksum; the
checksum protects against transport corruption, not
adversarial content (<xref target="sec-security-checksum-scope"/>).
This is the same as the RAID-stripe trust model:
each shard host can lie about its shard.  Deployment
defenses are encryption at rest, an integrity-protected
transport (RPCSEC_GSS_KRB5I or TLS), and
physical or logical isolation of data servers.</t>
            </dd>
            <dt>Stateid leak from client to attacker:</dt>
            <dd>
              <t>Under tight coupling with RPCSEC_GSS, a leaked
stateid is not exploitable: the attacker's own RPC
principal will not match tsa_principal in the trust
table, and the data server returns NFS4ERR_ACCESS.
Under tight coupling with AUTH_SYS over TLS (where
tsa_principal is empty), a leaked stateid is
exploitable by any attacker who can also forge the
source-address binding the data server's TLS session
expects; this is the standard AUTH_SYS-over-TLS
trust model, unchanged.</t>
            </dd>
            <dt>Replay of revoked stateid:</dt>
            <dd>
              <t>After REVOKE_STATEID or BULK_REVOKE_STATEID the data
server removes the trust entry and subsequent CHUNK
operations presenting the revoked stateid fail with
NFS4ERR_BAD_STATEID (<xref target="sec-REVOKE_STATEID"/>).  An
in-flight CHUNK operation that arrived before the
revoke completed <bcp14>MAY</bcp14> be allowed to finish; the
chunk_guard4 CAS (<xref target="sec-chunk_guard4"/>) bounds the
worst-case damage from such in-flight I/O to the
chunks already PENDING at revocation time, and the
lock-transfer-to-metadata-server escrow rule
(<xref target="sec-chunk_guard_mds"/>) prevents a write hole from
opening during revocation.</t>
            </dd>
            <dt>Compromised control session:</dt>
            <dd>
              <t>An attacker who controls the metadata-server-to-data-server
control session can register or revoke
arbitrary trust entries.  The control session is the
most security-sensitive element introduced by tight
coupling.  Deployment <bcp14>MUST</bcp14> protect it with RPCSEC_GSS
(<xref target="RFC7861"/>) using a service principal both sides
trust, or with RPC-over-TLS (<xref target="RFC9289"/>) using
mutual authentication and allowlisted certificates.
The data server enforces that TRUST_STATEID,
REVOKE_STATEID, and BULK_REVOKE_STATEID only arrive
on sessions whose owning client presented
EXCHGID4_FLAG_USE_PNFS_MDS at EXCHANGE_ID
(<xref target="sec-TRUST_STATEID"/>), but that flag alone does not
authenticate the metadata server.</t>
            </dd>
            <dt>Resource exhaustion via trust-table flood:</dt>
            <dd>
              <t>A misbehaving metadata server could register an
unbounded number of TRUST_STATEID entries to exhaust
the data server's trust-table memory.  The mechanism
defending against this is the tsa_expire lease on
each entry: trust entries that are not renewed
before expiry are reaped by the data server.  A data
server under memory pressure <bcp14>MAY</bcp14> also return
NFS4ERR_DELAY on new TRUST_STATEID requests, forcing
the metadata server to back off.</t>
            </dd>
            <dt>Cross-metadata-server isolation:</dt>
            <dd>
              <t>In a deployment where two metadata servers share a
single data server, the per-entry metadata-server
tag (derived from the control session's owning
client; see <xref target="sec-TRUST_STATEID"/>) ensures that
REVOKE_STATEID and BULK_REVOKE_STATEID from one
metadata server cannot remove entries registered by
the other.  A compromised metadata server can,
however, register entries against any filehandle the
data server exposes to it.  Deployments concerned
about cross-metadata-server isolation <bcp14>MUST</bcp14> partition
the data server's filesystem namespace into
per-metadata-server exports at the data server,
rather than rely on the trust table alone to enforce
file-level boundaries between metadata servers.</t>
            </dd>
          </dl>
          <t>A repair actor reconstructs and writes shards on behalf of other
clients via CHUNK_WRITE_REPAIR.  A malicious or buggy repair actor
is therefore a write path into data it did not originate; the
metadata server <bcp14>MUST</bcp14> validate repaired shards against the file's
registered checksum before accepting them, and integrity against a
malicious data server (as opposed to bit-flips) requires a
cryptographic checksum_algorithm together with transport security.
CHECKSUM_ALG_NONE and the CRC variants provide bit-flip detection
only.</t>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t><xref target="RFC8881"/> introduced the "pNFS Layout Types Registry"; new layout
type numbers in this registry need to be assigned by IANA.  This
document defines a new layout type number: LAYOUT4_FLEX_FILES_V2
(see <xref target="tbl_layout_types"/>).</t>
      <table anchor="tbl_layout_types">
        <name>Layout Type Assignments</name>
        <thead>
          <tr>
            <th align="left">Layout Type Name</th>
            <th align="left">Value</th>
            <th align="left">RFC</th>
            <th align="left">How</th>
            <th align="left">Minor Versions</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">LAYOUT4_FLEX_FILES_V2</td>
            <td align="left">0x6</td>
            <td align="left">RFCTBD10</td>
            <td align="left">L</td>
            <td align="left">1</td>
          </tr>
        </tbody>
      </table>
      <t><xref target="RFC8881"/> also introduced the "NFSv4 Recallable Object Types
Registry".  This document defines new recallable objects for
RCA4_TYPE_MASK_FF2_LAYOUT_MIN and RCA4_TYPE_MASK_FF2_LAYOUT_MAX
(see <xref target="tbl_recallables"/>).</t>
      <table anchor="tbl_recallables">
        <name>Recallable Object Type Assignments</name>
        <thead>
          <tr>
            <th align="left">Recallable Object Type Name</th>
            <th align="left">Value</th>
            <th align="left">RFC</th>
            <th align="left">How</th>
            <th align="left">Minor Versions</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">RCA4_TYPE_MASK_FF2_LAYOUT_MIN</td>
            <td align="left">20</td>
            <td align="left">RFCTBD10</td>
            <td align="left">L</td>
            <td align="left">1</td>
          </tr>
          <tr>
            <td align="left">RCA4_TYPE_MASK_FF2_LAYOUT_MAX</td>
            <td align="left">21</td>
            <td align="left">RFCTBD10</td>
            <td align="left">L</td>
            <td align="left">1</td>
          </tr>
        </tbody>
      </table>
      <t>This document also requests IANA to register a new bit in the
"EXCHGID4<em>FLAG</em>*" flag space for the ExchangeID operation from
<xref section="18.35.3." sectionFormat="of" target="RFC8881"/>  The requested value is
<tt>0x00100000</tt>, outside the existing MASK_PNFS block (0x00070000);
IANA <bcp14>MAY</bcp14> assign a different value at its discretion, in which
case the numeric value in <xref target="fig-EXCHGID4_FLAG_USE_ERASURE_DS"/>
and its uses throughout the document are updated to match the
assignment.</t>
      <table anchor="tbl_exchgid_flags">
        <name>EXCHGID4 Flag Assignments</name>
        <thead>
          <tr>
            <th align="left">Flag Name</th>
            <th align="left">Value</th>
            <th align="left">RFC</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">EXCHGID4_FLAG_USE_ERASURE_DS</td>
            <td align="left">0x00100000</td>
            <td align="left">RFCTBD10</td>
            <td align="left">
              <xref target="fig-EXCHGID4_FLAG_USE_ERASURE_DS"/>, this doc</td>
          </tr>
        </tbody>
      </table>
      <t>This document requests IANA to allocate two attribute numbers in
the NFSv4 attribute-number registry (see <xref section="20" sectionFormat="of" target="RFC8881"/>).</t>
      <table anchor="tbl_attribute_assignments">
        <name>NFSv4 Attribute Assignments</name>
        <thead>
          <tr>
            <th align="left">Attribute Number</th>
            <th align="left">Attribute Name</th>
            <th align="left">RFC</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">89</td>
            <td align="left">FATTR4_CODING_BLOCK_SIZE</td>
            <td align="left">RFCTBD10</td>
            <td align="left">
              <xref target="sec-fattr4_coding_block_size"/></td>
          </tr>
          <tr>
            <td align="left">90</td>
            <td align="left">FATTR4_CHUNKED_DATA_FILE</td>
            <td align="left">RFCTBD10</td>
            <td align="left">
              <xref target="sec-fattr4_chunked_data_file"/></td>
          </tr>
        </tbody>
      </table>
      <t>This document introduces the 'Flexible File Version 2 Layout Type
Erasure Encoding Type Registry'.  The registry uses a 32-bit value
space partitioned into ranges based on the intended scope of the
encoding type (see <xref target="tbl-coding-ranges"/>).</t>
      <table anchor="tbl-coding-ranges">
        <name>Erasure Encoding Type Value Ranges (32-bit space)</name>
        <thead>
          <tr>
            <th align="left">Range</th>
            <th align="left">Purpose</th>
            <th align="left">Allocation Policy</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">0x0000</td>
            <td align="left">Reserved (uninitialized)</td>
            <td align="left">--</td>
          </tr>
          <tr>
            <td align="left">0x0001-0x00FF</td>
            <td align="left">Standards Track</td>
            <td align="left">IETF Review</td>
          </tr>
          <tr>
            <td align="left">0x0100-0x0FFF</td>
            <td align="left">Experimental</td>
            <td align="left">Expert Review</td>
          </tr>
          <tr>
            <td align="left">0x1000-0x7FFF</td>
            <td align="left">Vendor (open)</td>
            <td align="left">First Come First Served</td>
          </tr>
          <tr>
            <td align="left">0x8000-0xFFFE</td>
            <td align="left">Private/proprietary</td>
            <td align="left">No registration required</td>
          </tr>
          <tr>
            <td align="left">0xFFFF</td>
            <td align="left">Reserved</td>
            <td align="left">--</td>
          </tr>
          <tr>
            <td align="left">0x00010000-0xFFFFFFFF</td>
            <td align="left">Reserved (upper range)</td>
            <td align="left">Reserved for future partition</td>
          </tr>
        </tbody>
      </table>
      <t>The upper 16 bits of the 32-bit value space (0x00010000 through
0xFFFFFFFF) are reserved for future range extensions.  A receiver
that observes an <tt>ffv2_encoding_type4</tt> value in the reserved
region <bcp14>MUST</bcp14> treat it as an unsupported encoding type
(NFS4ERR_ENCODING_NOT_SUPPORTED).  Value 0x0000 is reserved as the
uninitialized-field sentinel and <bcp14>MUST NOT</bcp14> be allocated to an
encoding.</t>
      <dl>
        <dt>Standards Track (0x0000-0x00FF):</dt>
        <dd>
          <t>Enencoding types intended for broad interoperability.  The
specification <bcp14>MUST</bcp14> include a complete mathematical description
sufficient for independent interoperable implementations (see
<xref target="encoding-type-interoperability"/>).  Allocated by IETF Review.</t>
        </dd>
        <dt>Experimental (0x0100-0x0FFF):</dt>
        <dd>
          <t>Enencoding types under development or evaluation.  An Internet-Draft
is sufficient for allocation.  The specification <bcp14>SHOULD</bcp14> include
enough detail for interoperability testing.  Allocated by Expert
Review.</t>
        </dd>
        <dt>Vendor (open) (0x1000-0x7FFF):</dt>
        <dd>
          <t>Enencoding types with a published specification or patent reference.
Interoperability is expected among implementations that license or
implement the specification.  The registration <bcp14>MUST</bcp14> include either a
math specification or a patent reference.  Allocated First Come
First Served.</t>
        </dd>
        <dt>Private/proprietary (0x8000-0xFFFE):</dt>
        <dd>
          <t>Enencoding types for use within a single vendor's ecosystem.
No IANA registration is required.  Interoperability with other
implementations is not expected; accidental codepoint collisions
between independent vendors are possible and are managed
operationally rather than by protocol mechanism.  The encoding
type name <bcp14>SHOULD</bcp14> include an organizational identifier (e.g.,
<tt>FFV2_ENCODING_ACME_FOOBAR</tt>).  A client that encounters a
value in this range from an unrecognized server <bcp14>SHOULD</bcp14> treat
it as an unsupported encoding type
(<tt>NFS4ERR_ENCODING_NOT_SUPPORTED</tt>).</t>
        </dd>
      </dl>
      <t>This partitioning prevents contention for small numbers in the
Standards Track range and provides a clear signal to clients about
what level of interoperability to expect.</t>
      <t>This document defines seven encoding types: the flexible file v1 layout-compatible
PASSTHROUGH (see <xref target="sec-encoding-passthrough"/>), the chunked
MIRRORED (see <xref target="sec-encoding-replicated"/>), and five chunked
erasure encoding types (see <xref target="tbl-coding-types"/>).</t>
      <table anchor="tbl-coding-types">
        <name>Flexible File Version 2 Layout Type Encoding Type Assignments</name>
        <thead>
          <tr>
            <th align="left">Encoding Type Name</th>
            <th align="left">Value</th>
            <th align="left">RFC</th>
            <th align="left">How</th>
            <th align="left">Minor Versions</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">FFV2_ENCODING_PASSTHROUGH</td>
            <td align="left">1</td>
            <td align="left">RFCTBD10</td>
            <td align="left">L</td>
            <td align="left">2</td>
          </tr>
          <tr>
            <td align="left">FFV2_ENCODING_MOJETTE_SYSTEMATIC</td>
            <td align="left">2</td>
            <td align="left">RFCTBD10</td>
            <td align="left">L</td>
            <td align="left">2</td>
          </tr>
          <tr>
            <td align="left">FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC</td>
            <td align="left">3</td>
            <td align="left">RFCTBD10</td>
            <td align="left">L</td>
            <td align="left">2</td>
          </tr>
          <tr>
            <td align="left">FFV2_ENCODING_RS_VANDERMONDE</td>
            <td align="left">4</td>
            <td align="left">RFCTBD10</td>
            <td align="left">L</td>
            <td align="left">2</td>
          </tr>
          <tr>
            <td align="left">FFV2_ENCODING_REPLICATED</td>
            <td align="left">5</td>
            <td align="left">RFCTBD10</td>
            <td align="left">L</td>
            <td align="left">2</td>
          </tr>
          <tr>
            <td align="left">FFV2_ENCODING_XOR_PARITY</td>
            <td align="left">6</td>
            <td align="left">RFCTBD10</td>
            <td align="left">L</td>
            <td align="left">2</td>
          </tr>
          <tr>
            <td align="left">FFV2_ENCODING_LINUX_MD_RAID</td>
            <td align="left">7</td>
            <td align="left">RFCTBD10</td>
            <td align="left">L</td>
            <td align="left">2</td>
          </tr>
        </tbody>
      </table>
      <section anchor="iana-checksum-algorithms">
        <name>Checksum Algorithm Registry</name>
        <t>This document introduces the "Flexible File Version 2
Layout Type Checksum Algorithm Registry".  Values in this
registry name the checksum_algorithm4
(<xref target="sec-checksum4"/>) carried in checksum4 on the wire and
selected per-mirror via ffv2m_checksum_algorithm
(<xref target="sec-ffv2-mirror4"/>).</t>
        <t>The registry uses a 32-bit value space.  Registration
policy is Specification Required <xref target="RFC8126"/>; the Designated
Expert reviews each request for:</t>
        <ul spacing="normal">
          <li>
            <t>a complete and publicly available specification of the
algorithm sufficient for independent interoperable
implementations;</t>
          </li>
          <li>
            <t>the exact length of the cs_value field for this
algorithm (a single registered length per algorithm;
variable-length variants register separately);</t>
          </li>
          <li>
            <t>collision risk against existing registrations (the
Expert <bcp14>MAY</bcp14> decline to register an algorithm whose
output overlaps substantially with an existing
registration).</t>
          </li>
        </ul>
        <t>Initial registrations are listed in
<xref target="tbl-checksum-algorithms"/>.</t>
        <table anchor="tbl-checksum-algorithms">
          <name>Initial Checksum Algorithm Registrations</name>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Value</th>
              <th align="left">cs_value bytes</th>
              <th align="left">Class</th>
              <th align="left">RFC</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">CHECKSUM_ALG_NONE</td>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">none</td>
              <td align="left">RFCTBD10</td>
            </tr>
            <tr>
              <td align="left">CHECKSUM_ALG_CRC32</td>
              <td align="left">1</td>
              <td align="left">4</td>
              <td align="left">bit-flip</td>
              <td align="left">RFCTBD10</td>
            </tr>
            <tr>
              <td align="left">CHECKSUM_ALG_CRC32C</td>
              <td align="left">2</td>
              <td align="left">4</td>
              <td align="left">bit-flip</td>
              <td align="left">RFCTBD10</td>
            </tr>
            <tr>
              <td align="left">CHECKSUM_ALG_FLETCHER4</td>
              <td align="left">3</td>
              <td align="left">32</td>
              <td align="left">bit-flip</td>
              <td align="left">RFCTBD10</td>
            </tr>
            <tr>
              <td align="left">CHECKSUM_ALG_SHA256</td>
              <td align="left">4</td>
              <td align="left">32</td>
              <td align="left">cryptographic</td>
              <td align="left">RFCTBD10</td>
            </tr>
            <tr>
              <td align="left">CHECKSUM_ALG_SHA512</td>
              <td align="left">5</td>
              <td align="left">64</td>
              <td align="left">cryptographic</td>
              <td align="left">RFCTBD10</td>
            </tr>
            <tr>
              <td align="left">CHECKSUM_ALG_BLAKE3</td>
              <td align="left">6</td>
              <td align="left">32</td>
              <td align="left">cryptographic</td>
              <td align="left">RFCTBD10</td>
            </tr>
          </tbody>
        </table>
        <t>CHECKSUM_ALG_NONE (value 0) indicates that no
protocol-level checksum is computed.  The deployment relies
on transport-layer integrity (RPC-over-TLS, RPCSEC_GSS_KRB5I)
or storage-layer integrity instead; see
<xref target="sec-security-checksum-scope"/>.</t>
        <t>CHECKSUM_ALG_CRC32 (value 1) is the CRC-32 algorithm
specified in <xref target="ITU-V42"/> Section 8.1.1.6.2 (the same CRC
used in Ethernet <xref target="IEEE802-3"/> Section 3.2.9, PNG
<xref target="RFC2083"/> Annex D, and zlib <xref target="RFC1950"/>).  Concrete
parameters, which two independent implementations <bcp14>MUST</bcp14>
agree on to interoperate: generator polynomial
<tt>0x04C11DB7</tt> (equivalently, the reflected form
<tt>0xEDB88320</tt>); initial register value <tt>0xFFFFFFFF</tt>; final
XOR value <tt>0xFFFFFFFF</tt>; input reflected; output reflected.
The 4-byte <tt>cs_value</tt> carries the CRC as a big-endian
integer.  Covered bytes follow the uniform coverage rule
in <xref target="sec-checksum4"/> (chunk header + chunk payload with
the checksum field's bytes treated as zero, in
wire-transmission order).  Deployments <bcp14>SHOULD</bcp14> prefer
CHECKSUM_ALG_CRC32C for new files since CRC32C is
hardware-accelerated on every modern CPU.</t>
        <t>CHECKSUM_ALG_CRC32C (value 2) is the CRC-32 with the
Castagnoli polynomial specified in <xref section="12.1" sectionFormat="of" target="RFC3720"/> and
adopted by <xref section="6.4" sectionFormat="of" target="RFC4960"/> (SCTP), and also as the SSE4.2 /
ARMv8 / RISC-V CRC-32C hardware-acceleration instructions.  Concrete
parameters: generator polynomial <tt>0x1EDC6F41</tt> (equivalently, the
reflected form <tt>0x82F63B78</tt>); initial register value <tt>0xFFFFFFFF</tt>;
final XOR value <tt>0xFFFFFFFF</tt>; input reflected; output reflected.  The
4-byte <tt>cs_value</tt> carries the CRC as a big-endian integer.  Covered
bytes follow the uniform coverage rule in <xref target="sec-checksum4"/>.</t>
        <t>CHECKSUM_ALG_FLETCHER4 (value 3) is the ZFS Fletcher4
variant as documented in the OpenZFS on-disk format
specification <xref target="OPENZFS-FLETCHER4"/>.  Covered bytes
follow the uniform coverage rule in <xref target="sec-checksum4"/>;
this algorithm additionally requires the covered input
(header + chunk with the checksum field's bytes treated
as zero) to be a multiple of 4 bytes, since the input is
processed as a sequence of little-endian 32-bit words.
Implementations that need to checksum a chunk whose
covered input is not a multiple of 4 bytes pad with zero
bytes and register the padded variant separately.
Concrete parameters: the four 64-bit accumulators <tt>A</tt>,
<tt>B</tt>, <tt>C</tt>, <tt>D</tt> are updated per word <tt>wi</tt> as
<tt>A += wi; B += A; C += B; D += C</tt> with 64-bit unsigned
wrap-around; the 32-byte <tt>cs_value</tt> is the concatenation
<tt>A || B || C || D</tt> with each accumulator serialized in
big-endian byte order.  Other Fletcher4 implementations
(different word width, different endianness, truncated
output) register separately.</t>
        <t>CHECKSUM_ALG_SHA256 (value 4) and CHECKSUM_ALG_SHA512
(value 5) are the SHA-256 and SHA-512 hash algorithms
specified in <xref target="FIPS-180-4"/>, with output byte lengths 32
and 64 respectively.  The <tt>cs_value</tt> carries the hash
output in the byte order defined by <xref target="FIPS-180-4"/> Section
3.1 (most-significant word first, each word serialized
big-endian).  Covered bytes follow the uniform coverage
rule in <xref target="sec-checksum4"/>.</t>
        <t>CHECKSUM_ALG_BLAKE3 (value 6) is the BLAKE3 hash algorithm
specified in <xref target="BLAKE3-SPEC"/> at its standard 32-byte
output length (BLAKE3 in its default mode, no keyed hash,
no key-derivation context, no XOF output at other
lengths).  Extended-output BLAKE3, keyed BLAKE3, and the
key-derivation mode register as separate algorithms.
Covered bytes follow the uniform coverage rule in
<xref target="sec-checksum4"/>; <tt>cs_value</tt> is the 32-byte hash output
in the byte order defined by <xref target="BLAKE3-SPEC"/> Section 2.4.</t>
        <t>A checksum4 whose cs_value length does not match the
registered cs_value bytes for its cs_algorithm <bcp14>MUST</bcp14> be
rejected with NFS4ERR_INVAL.</t>
        <t>The "Class" column in <xref target="tbl-checksum-algorithms"/> is
informational and indicates the threat model the algorithm
supports; see <xref target="sec-security-checksum-scope"/>.</t>
      </section>
      <section anchor="iana-proof-profile">
        <name>Proof-Profile Registry</name>
        <t>This document introduces the "Flexible File Version 2
Proof-Profile Registry".  Values in this registry name
the proof_profile_id4 (<xref target="sec-proof-profile"/>) that a
metadata server presents in CHUNK_ESCROW_TAKEOVER to identify which
incarnation-lease proof format the accompanying
ceta_proof_data carries.</t>
        <t>The registry uses a 32-bit value space.  Registration
policy is Specification Required <xref target="RFC8126"/>; the
Designated Expert reviews each request for:</t>
        <ul spacing="normal">
          <li>
            <t>a complete and publicly available specification of
the proof format sufficient for independent
interoperable implementations (envelope, signature
algorithm, payload field set, replay-cache
semantics, and expiry handling);</t>
          </li>
          <li>
            <t>compatibility with the strict evaluation ordering
specified in <xref target="sec-proof-profile"/> (session replay
-&gt; presenter authorization -&gt; profile support -&gt;
proof verification -&gt; epoch compare-and-advance);
a registration whose verification cannot be
evaluated after presenter authorization <bcp14>MUST</bcp14> be
declined;</t>
          </li>
          <li>
            <t>a clear statement of the trust anchor the profile
relies on (deployment-provisioned public key set,
Kerberos KDC, etc.), and whether the profile
requires wire negotiation of any parameter (a
profile that requires wire negotiation not
defined in this document or its cited references
<bcp14>MUST</bcp14> be declined).</t>
          </li>
        </ul>
        <t>Initial registrations are listed in
<xref target="tbl-proof-profiles"/>.</t>
        <table anchor="tbl-proof-profiles">
          <name>Initial Proof-Profile Registrations</name>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Value</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">PROOF_PROFILE_UNSPECIFIED</td>
              <td align="left">0</td>
              <td align="left">Reserved sentinel; see <xref target="sec-proof-profile"/></td>
            </tr>
            <tr>
              <td align="left">PROOF_PROFILE_HA_AUTHORITY_ED25519</td>
              <td align="left">1</td>
              <td align="left">
                <xref target="sec-proof-profile"/> "Mandatory-to-Implement Profile"</td>
            </tr>
          </tbody>
        </table>
        <t>Additional profiles named in
<xref target="sec-proof-profile"/> (ECDSA-P256 alg -7,
RSASSA-PSS-SHA256 alg -37) <bcp14>MAY</bcp14> be added later per
the Specification Required policy above.</t>
        <t>The value range 0xC0000000 to 0xFFFFFFFF is
reserved for Private Use per <xref section="4.1" sectionFormat="of" target="RFC8126"/>; deployments
<bcp14>MAY</bcp14> assign values from this range for experimental, vendor-specific,
or private profiles without IANA registration, but such values <bcp14>MUST
NOT</bcp14> be presented on interoperability boundaries and this specification
makes no compatibility guarantees for them.</t>
      </section>
    </section>
    <section anchor="xdr-description-of-the-flexible-file-version-2-layout-type">
      <name>XDR Description of the Flexible File Version 2 Layout Type</name>
      <t>This document contains the External Data Representation (XDR)
<xref target="RFC4506"/> description of the flexible file v2 layout.  The XDR
description is embedded in this document in a way that makes it simple
for the reader to extract into a ready-to-compile form.  The reader can
feed this document into the shell script in <xref target="fig-extract"/> to produce
the machine-readable XDR description of the flexible file v2 layout.</t>
      <figure anchor="fig-extract">
        <name>extract.sh</name>
        <sourcecode type="shell"><![CDATA[
#!/bin/sh
grep '^ *///' $* | sed 's?^ */// ??' | sed 's?^ *///$??'
]]></sourcecode>
      </figure>
      <t>That is, if the above script is stored in a file called "extract.sh"
and this document is in a file called "spec.txt", then the reader can
run the script as in <xref target="fig-extract-example"/>.</t>
      <figure anchor="fig-extract-example">
        <name>Example use of extract.sh</name>
        <sourcecode type="shell"><![CDATA[
sh extract.sh < spec.txt > flex_files2_prot.x
]]></sourcecode>
      </figure>
      <t>The effect of the script is to remove leading blank space from each
line, plus a sentinel sequence of "///".</t>
      <t>XDR descriptions with the sentinel sequence are embedded throughout
the document.</t>
      <t>Note that the XDR code contained in this document depends on types
from the NFSv4.2 nfs4_prot.x file <xref target="RFC7863"/> (which itself builds on
<xref target="RFC5662"/>).  This includes both nfs types that end with a 4, such
as offset4, length4, etc., as well as more generic types such as
uint32_t and uint64_t.</t>
      <t>While the XDR can be appended to that from <xref target="RFC7863"/>, the various
code snippets belong in their respective areas of that XDR.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.haynes-nfsv4-flexfiles-v2-delta-writes">
          <front>
            <title>Delta-Write Extension for the Flexible File Version 2 Layout Type</title>
            <author fullname="Thomas Haynes" initials="T." surname="Haynes">
              <organization>Hammerspace</organization>
            </author>
            <date day="7" month="August" year="2026"/>
            <abstract>
              <t>   The Flexible File Version 2 pNFS layout type defines a chunk-oriented
   data-server protocol in which every write is a full-chunk payload.
   For workloads that make small edits to files protected by an XOR-
   based erasure encoding, this forces client-side stripe fetch, re-
   encode, and transmit on every edit, with wire amplification of three
   to four orders of magnitude per byte edited.  This document defines
   an optional extension, CHUNK_XOR_DELTA, that lets a client transmit a
   per-projection XOR delta directly to each data server holding a
   projection of the affected stripe; the data server applies the delta
   locally.  The extension is restricted to XOR-linear systematic
   encodings and XOR-affine checksums, using the existing chunk state
   machine with no new commit protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-haynes-nfsv4-flexfiles-v2-delta-writes-00"/>
        </reference>
        <reference anchor="RFC4121">
          <front>
            <title>The Kerberos Version 5 Generic Security Service Application Program Interface (GSS-API) Mechanism: Version 2</title>
            <author fullname="L. Zhu" initials="L." surname="Zhu"/>
            <author fullname="K. Jaganathan" initials="K." surname="Jaganathan"/>
            <author fullname="S. Hartman" initials="S." surname="Hartman"/>
            <date month="July" year="2005"/>
            <abstract>
              <t>This document defines protocols, procedures, and conventions to be employed by peers implementing the Generic Security Service Application Program Interface (GSS-API) when using the Kerberos Version 5 mechanism.</t>
              <t>RFC 1964 is updated and incremental changes are proposed in response to recent developments such as the introduction of Kerberos cryptosystem framework. These changes support the inclusion of new cryptosystems, by defining new per-message tokens along with their encryption and checksum algorithms based on the cryptosystem profiles. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4121"/>
          <seriesInfo name="DOI" value="10.17487/RFC4121"/>
        </reference>
        <reference anchor="RFC4506">
          <front>
            <title>XDR: External Data Representation Standard</title>
            <author fullname="M. Eisler" initials="M." role="editor" surname="Eisler"/>
            <date month="May" year="2006"/>
            <abstract>
              <t>This document describes the External Data Representation Standard (XDR) protocol as it is currently deployed and accepted. This document obsoletes RFC 1832. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="67"/>
          <seriesInfo name="RFC" value="4506"/>
          <seriesInfo name="DOI" value="10.17487/RFC4506"/>
        </reference>
        <reference anchor="RFC5531">
          <front>
            <title>RPC: Remote Procedure Call Protocol Specification Version 2</title>
            <author fullname="R. Thurlow" initials="R." surname="Thurlow"/>
            <date month="May" year="2009"/>
            <abstract>
              <t>This document describes the Open Network Computing (ONC) Remote Procedure Call (RPC) version 2 protocol as it is currently deployed and accepted. This document obsoletes RFC 1831. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5531"/>
          <seriesInfo name="DOI" value="10.17487/RFC5531"/>
        </reference>
        <reference anchor="RFC5662">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 1 External Data Representation Standard (XDR) Description</title>
            <author fullname="S. Shepler" initials="S." role="editor" surname="Shepler"/>
            <author fullname="M. Eisler" initials="M." role="editor" surname="Eisler"/>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <date month="January" year="2010"/>
            <abstract>
              <t>This document provides the External Data Representation Standard (XDR) description for Network File System version 4 (NFSv4) minor version 1. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5662"/>
          <seriesInfo name="DOI" value="10.17487/RFC5662"/>
        </reference>
        <reference anchor="RFC7530">
          <front>
            <title>Network File System (NFS) Version 4 Protocol</title>
            <author fullname="T. Haynes" initials="T." role="editor" surname="Haynes"/>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>The Network File System (NFS) version 4 protocol is a distributed file system protocol that builds on the heritage of NFS protocol version 2 (RFC 1094) and version 3 (RFC 1813). Unlike earlier versions, the NFS version 4 protocol supports traditional file access while integrating support for file locking and the MOUNT protocol. In addition, support for strong security (and its negotiation), COMPOUND operations, client caching, and internationalization has been added. Of course, attention has been applied to making NFS version 4 operate well in an Internet environment.</t>
              <t>This document, together with the companion External Data Representation (XDR) description document, RFC 7531, obsoletes RFC 3530 as the definition of the NFS version 4 protocol.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7530"/>
          <seriesInfo name="DOI" value="10.17487/RFC7530"/>
        </reference>
        <reference anchor="RFC7861">
          <front>
            <title>Remote Procedure Call (RPC) Security Version 3</title>
            <author fullname="A. Adamson" initials="A." surname="Adamson"/>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document specifies version 3 of the Remote Procedure Call (RPC) security protocol (RPCSEC_GSS). This protocol provides support for multi-principal authentication of client hosts and user principals to a server (constructed by generic composition), security label assertions for multi-level security and type enforcement, structured privilege assertions, and channel bindings. This document updates RFC 5403.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7861"/>
          <seriesInfo name="DOI" value="10.17487/RFC7861"/>
        </reference>
        <reference anchor="RFC7862">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 2 Protocol</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document describes NFS version 4 minor version 2; it describes the protocol extensions made from NFS version 4 minor version 1. Major extensions introduced in NFS version 4 minor version 2 include the following: Server-Side Copy, Application Input/Output (I/O) Advise, Space Reservations, Sparse Files, Application Data Blocks, and Labeled NFS.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7862"/>
          <seriesInfo name="DOI" value="10.17487/RFC7862"/>
        </reference>
        <reference anchor="RFC7863">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 2 External Data Representation Standard (XDR) Description</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides the External Data Representation (XDR) description for NFS version 4 minor version 2.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7863"/>
          <seriesInfo name="DOI" value="10.17487/RFC7863"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="RFC8178">
          <front>
            <title>Rules for NFSv4 Extensions and Minor Versions</title>
            <author fullname="D. Noveck" initials="D." surname="Noveck"/>
            <date month="July" year="2017"/>
            <abstract>
              <t>This document describes the rules relating to the extension of the NFSv4 family of protocols. It covers the creation of minor versions, the addition of optional features to existing minor versions, and the correction of flaws in features already published as Proposed Standards. The rules relating to the construction of minor versions and the interaction of minor version implementations that appear in this document supersede the minor versioning rules in RFC 5661 and other RFCs defining minor versions.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8178"/>
          <seriesInfo name="DOI" value="10.17487/RFC8178"/>
        </reference>
        <reference anchor="RFC8434">
          <front>
            <title>Requirements for Parallel NFS (pNFS) Layout Types</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document defines the requirements that individual Parallel NFS (pNFS) layout types need to meet in order to work within the pNFS framework as defined in RFC 5661. In so doing, this document aims to clearly distinguish between requirements for pNFS as a whole and those specifically directed to the pNFS file layout. The lack of a clear separation between the two sets of requirements has been troublesome for those specifying and evaluating new layout types. In this regard, this document updates RFC 5661.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8434"/>
          <seriesInfo name="DOI" value="10.17487/RFC8434"/>
        </reference>
        <reference anchor="RFC8435">
          <front>
            <title>Parallel NFS (pNFS) Flexible File Layout</title>
            <author fullname="B. Halevy" initials="B." surname="Halevy"/>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>Parallel NFS (pNFS) allows a separation between the metadata (onto a metadata server) and data (onto a storage device) for a file. The flexible file layout type is defined in this document as an extension to pNFS that allows the use of storage devices that require only a limited degree of interaction with the metadata server and use already-existing protocols. Client-side mirroring is also added to provide replication of files.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8435"/>
          <seriesInfo name="DOI" value="10.17487/RFC8435"/>
        </reference>
        <reference anchor="RFC8881">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 1 Protocol</title>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <author fullname="C. Lever" initials="C." surname="Lever"/>
            <date month="August" year="2020"/>
            <abstract>
              <t>This document describes the Network File System (NFS) version 4 minor version 1, including features retained from the base protocol (NFS version 4 minor version 0, which is specified in RFC 7530) and protocol extensions made subsequently. The later minor version has no dependencies on NFS version 4 minor version 0, and is considered a separate protocol.</t>
              <t>This document obsoletes RFC 5661. It substantially revises the treatment of features relating to multi-server namespace, superseding the description of those features appearing in RFC 5661.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8881"/>
          <seriesInfo name="DOI" value="10.17487/RFC8881"/>
        </reference>
        <reference anchor="RFC9289">
          <front>
            <title>Towards Remote Procedure Call Encryption by Default</title>
            <author fullname="T. Myklebust" initials="T." surname="Myklebust"/>
            <author fullname="C. Lever" initials="C." role="editor" surname="Lever"/>
            <date month="September" year="2022"/>
            <abstract>
              <t>This document describes a mechanism that, through the use of opportunistic Transport Layer Security (TLS), enables encryption of Remote Procedure Call (RPC) transactions while they are in transit. The proposed mechanism interoperates with Open Network Computing (ONC) RPC implementations that do not support it. This document updates RFC 5531.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9289"/>
          <seriesInfo name="DOI" value="10.17487/RFC9289"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9052">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
              <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="96"/>
          <seriesInfo name="RFC" value="9052"/>
          <seriesInfo name="DOI" value="10.17487/RFC9052"/>
        </reference>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC9053">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Initial Algorithms</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines a set of algorithms that can be used with the CBOR Object Signing and Encryption (COSE) protocol (RFC 9052).</t>
              <t>This document, along with RFC 9052, obsoletes RFC 8152.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9053"/>
          <seriesInfo name="DOI" value="10.17487/RFC9053"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="Plank97" target="http://web.eecs.utk.edu/~jplank/plank/papers/CS-96-332.htm">
          <front>
            <title>A Tutorial on Reed-Solomon Coding for Fault-Tolerance in RAID-like System</title>
            <author initials="J." surname="Plank" fullname="J. Plank">
              <organization/>
            </author>
            <date year="1997" month="September"/>
          </front>
        </reference>
        <reference anchor="IANA-PEN" target="https://www.iana.org/assignments/enterprise-numbers/">
          <front>
            <title>Private Enterprise Numbers</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC1813" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1813.xml">
          <front>
            <title>NFS Version 3 Protocol Specification</title>
            <author fullname="B. Callaghan" initials="B." surname="Callaghan"/>
            <author fullname="B. Pawlowski" initials="B." surname="Pawlowski"/>
            <author fullname="P. Staubach" initials="P." surname="Staubach"/>
            <date month="June" year="1995"/>
            <abstract>
              <t>This paper describes the NFS version 3 protocol. This paper is provided so that people can write compatible implementations. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1813"/>
          <seriesInfo name="DOI" value="10.17487/RFC1813"/>
        </reference>
        <reference anchor="RFC1950">
          <front>
            <title>ZLIB Compressed Data Format Specification version 3.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <author fullname="J-L. Gailly" surname="J-L. Gailly"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1950"/>
          <seriesInfo name="DOI" value="10.17487/RFC1950"/>
        </reference>
        <reference anchor="RFC2083">
          <front>
            <title>PNG (Portable Network Graphics) Specification Version 1.0</title>
            <author fullname="T. Boutell" initials="T." surname="Boutell"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>This document describes PNG (Portable Network Graphics), an extensible file format for the lossless, portable, well-compressed storage of raster images. PNG provides a patent-free replacement for GIF and can also replace many common uses of TIFF. Indexed-color, grayscale, and truecolor images are supported, plus an optional alpha channel. Sample depths range from 1 to 16 bits.</t>
              <t>PNG is designed to work well in online viewing applications, such as the World Wide Web, so it is fully streamable with a progressive display option. PNG is robust, providing both full file integrity checking and simple detection of common transmission errors. Also, PNG can store gamma and chromaticity data for improved color matching on heterogeneous platforms.</t>
              <t>This specification defines the Internet Media Type image/png.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2083"/>
          <seriesInfo name="DOI" value="10.17487/RFC2083"/>
        </reference>
        <reference anchor="RFC3720">
          <front>
            <title>Internet Small Computer Systems Interface (iSCSI)</title>
            <author fullname="J. Satran" initials="J." surname="Satran"/>
            <author fullname="K. Meth" initials="K." surname="Meth"/>
            <author fullname="C. Sapuntzakis" initials="C." surname="Sapuntzakis"/>
            <author fullname="M. Chadalapaka" initials="M." surname="Chadalapaka"/>
            <author fullname="E. Zeidner" initials="E." surname="Zeidner"/>
            <date month="April" year="2004"/>
            <abstract>
              <t>This document describes a transport protocol for Internet Small Computer Systems Interface (iSCSI) that works on top of TCP. The iSCSI protocol aims to be fully compliant with the standardized SCSI architecture model. SCSI is a popular family of protocols that enable systems to communicate with I/O devices, especially storage devices. SCSI protocols are request/response application protocols with a common standardized architecture model and basic command set, as well as standardized command sets for different device classes (disks, tapes, media-changers etc.). As system interconnects move from the classical bus structure to a network structure, SCSI has to be mapped to network transport protocols. IP networks now meet the performance requirements of fast system interconnects and as such are good candidates to "carry" SCSI. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3720"/>
          <seriesInfo name="DOI" value="10.17487/RFC3720"/>
        </reference>
        <reference anchor="RFC4519">
          <front>
            <title>Lightweight Directory Access Protocol (LDAP): Schema for User Applications</title>
            <author fullname="A. Sciberras" initials="A." role="editor" surname="Sciberras"/>
            <date month="June" year="2006"/>
            <abstract>
              <t>This document is an integral part of the Lightweight Directory Access Protocol (LDAP) technical specification. It provides a technical specification of attribute types and object classes intended for use by LDAP directory clients for many directory services, such as White Pages. These objects are widely used as a basis for the schema in many LDAP directories. This document does not cover attributes used for the administration of directory servers, nor does it include directory objects defined for specific uses in other documents. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4519"/>
          <seriesInfo name="DOI" value="10.17487/RFC4519"/>
        </reference>
        <reference anchor="RFC4960">
          <front>
            <title>Stream Control Transmission Protocol</title>
            <author fullname="R. Stewart" initials="R." role="editor" surname="Stewart"/>
            <date month="September" year="2007"/>
            <abstract>
              <t>This document obsoletes RFC 2960 and RFC 3309. It describes the Stream Control Transmission Protocol (SCTP). SCTP is designed to transport Public Switched Telephone Network (PSTN) signaling messages over IP networks, but is capable of broader applications.</t>
              <t>SCTP is a reliable transport protocol operating on top of a connectionless packet network such as IP. It offers the following services to its users:</t>
              <t>-- acknowledged error-free non-duplicated transfer of user data,</t>
              <t>-- data fragmentation to conform to discovered path MTU size,</t>
              <t>-- sequenced delivery of user messages within multiple streams, with an option for order-of-arrival delivery of individual user messages,</t>
              <t>-- optional bundling of multiple user messages into a single SCTP packet, and</t>
              <t>-- network-level fault tolerance through supporting of multi-homing at either or both ends of an association.</t>
              <t>The design of SCTP includes appropriate congestion avoidance behavior and resistance to flooding and masquerade attacks. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4960"/>
          <seriesInfo name="DOI" value="10.17487/RFC4960"/>
        </reference>
        <reference anchor="RFC5905">
          <front>
            <title>Network Time Protocol Version 4: Protocol and Algorithms Specification</title>
            <author fullname="D. Mills" initials="D." surname="Mills"/>
            <author fullname="J. Martin" initials="J." role="editor" surname="Martin"/>
            <author fullname="J. Burbank" initials="J." surname="Burbank"/>
            <author fullname="W. Kasch" initials="W." surname="Kasch"/>
            <date month="June" year="2010"/>
            <abstract>
              <t>The Network Time Protocol (NTP) is widely used to synchronize computer clocks in the Internet. This document describes NTP version 4 (NTPv4), which is backwards compatible with NTP version 3 (NTPv3), described in RFC 1305, as well as previous versions of the protocol. NTPv4 includes a modified protocol header to accommodate the Internet Protocol version 6 address family. NTPv4 includes fundamental improvements in the mitigation and discipline algorithms that extend the potential accuracy to the tens of microseconds with modern workstations and fast LANs. It includes a dynamic server discovery scheme, so that in many cases, specific server configuration is not required. It corrects certain errors in the NTPv3 design and implementation and includes an optional extension mechanism.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5905"/>
          <seriesInfo name="DOI" value="10.17487/RFC5905"/>
        </reference>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
        <reference anchor="FIPS-180-4" target="https://doi.org/10.6028/NIST.FIPS.180-4">
          <front>
            <title>Secure Hash Standard (SHS)</title>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
          <seriesInfo name="NIST" value="FIPS PUB 180-4"/>
        </reference>
        <reference anchor="BLAKE3-SPEC" target="https://github.com/BLAKE3-team/BLAKE3-specs/blob/master/blake3.pdf">
          <front>
            <title>BLAKE3: one function, fast everywhere</title>
            <author initials="J." surname="O'Connor" fullname="J. O'Connor">
              <organization/>
            </author>
            <author initials="J.-P." surname="Aumasson" fullname="J.-P. Aumasson">
              <organization/>
            </author>
            <author initials="S." surname="Neves" fullname="S. Neves">
              <organization/>
            </author>
            <author initials="Z." surname="Wilcox-O'Hearn" fullname="Z. Wilcox-O'Hearn">
              <organization/>
            </author>
            <date year="2020" month="January"/>
          </front>
        </reference>
        <reference anchor="ITU-V42">
          <front>
            <title>Error-correcting Procedures for DCEs Using Asynchronous-to-Synchronous Conversion</title>
            <author>
              <organization>International Telecommunication Union</organization>
            </author>
            <date year="2002" month="March"/>
          </front>
          <seriesInfo name="ITU-T" value="Recommendation V.42"/>
        </reference>
        <reference anchor="IEEE802-3">
          <front>
            <title>IEEE Standard for Ethernet</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date year="2022"/>
          </front>
          <seriesInfo name="IEEE" value="802.3-2022"/>
        </reference>
        <reference anchor="OPENZFS-FLETCHER4" target="https://openzfs.github.io/openzfs-docs/Basic%20Concepts/Checksums.html">
          <front>
            <title>OpenZFS On-Disk Format Specification, Section 2.2.4: Fletcher</title>
            <author>
              <organization>OpenZFS</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="PARREIN">
          <front>
            <title>Multiple Description Coding Using Exact Discrete Radon Transform</title>
            <author initials="B." surname="Parrein" fullname="B. Parrein">
              <organization/>
            </author>
            <author initials="N." surname="Normand" fullname="N. Normand">
              <organization/>
            </author>
            <author initials="J.-P." surname="Guedon" fullname="J.-P. Guedon">
              <organization/>
            </author>
            <date year="2001"/>
          </front>
          <seriesInfo name="IEEE" value="Data Compression Conference (DCC)"/>
        </reference>
        <reference anchor="NORMAND">
          <front>
            <title>A Geometry Driven Reconstruction Algorithm for the Mojette Transform</title>
            <author initials="N." surname="Normand" fullname="N. Normand">
              <organization/>
            </author>
            <author initials="A." surname="Kingston" fullname="A. Kingston">
              <organization/>
            </author>
            <author initials="P." surname="Evenou" fullname="P. Evenou">
              <organization/>
            </author>
            <date year="2006"/>
          </front>
          <seriesInfo name="LNCS" value="4245, pp. 122-133, DGCI 2006"/>
        </reference>
        <reference anchor="KATZ">
          <front>
            <title>Questions of Uniqueness and Resolution in Reconstruction from Projections</title>
            <author initials="M." surname="Katz" fullname="M. Katz">
              <organization/>
            </author>
            <date year="1978"/>
          </front>
          <seriesInfo name="Springer" value=""/>
        </reference>
        <reference anchor="LINUX-RAID6" target="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/lib/raid6">
          <front>
            <title>Linux kernel software RAID (md/raid6) -- lib/raid6</title>
            <author initials="H. P." surname="Anvin" fullname="H. P. Anvin">
              <organization/>
            </author>
            <author>
              <organization>Linux kernel contributors</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="DCACHE" target="https://dcache.org/">
          <front>
            <title>dCache -- a distributed storage system</title>
            <author>
              <organization>dCache collaboration (DESY, Fermilab, NDGF)</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="I-D.haynes-nfsv4-flexfiles-v2-proxy-server">
          <front>
            <title>Proxy-Driven Server for Flexible Files Version 2</title>
            <author fullname="Thomas Haynes" initials="T." surname="Haynes">
              <organization>Hammerspace</organization>
            </author>
            <date day="24" month="July" year="2026"/>
            <abstract>
              <t>   Parallel NFS (pNFS) with the Flexible Files Version 2 layout type
   supports client-side erasure coding and per-chunk repair between
   clients and data servers.  This document extends that architecture
   with a proxy server role: a registered peer of the metadata server
   that polls the metadata server for work assignments and carries them
   out -- moving a file from one layout to another, reconstructing a
   whole file from surviving shards, or translating between encodings
   for clients that cannot participate in the file's native encoding
   (including NFSv3 clients).  All proxy-server-to-metadata-server
   coordination is fore-channel: the metadata server returns work
   assignments inline in the response to a proxy-server-initiated
   PROXY_PROGRESS poll, and the proxy server reports completion via a
   fore-channel PROXY_DONE.  No callback operations are required for the
   proxy server protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-haynes-nfsv4-flexfiles-v2-proxy-server-03"/>
        </reference>
      </references>
    </references>
    <?line 15139?>

<section numbered="false" removeInRFC="true" anchor="sec-implementation-status">
      <name>Implementation Status</name>
      <t>This appendix records the implementation status of this
specification at the time of writing.  The purpose, per
<xref target="RFC7942"/>, is to help reviewers evaluate the protocol
against running code and to document which parts have
been validated end-to-end versus specified on paper.
This appendix is reviewer-aid material and is removed
from the final RFC.</t>
      <section numbered="false" anchor="reffs-metadata-server-data-server-and-ecdemo-client">
        <name>reffs (metadata server, data server, and ec_demo client)</name>
        <dl>
          <dt>Organization:</dt>
          <dd>
            <t>Independent / open source.</t>
          </dd>
          <dt>License:</dt>
          <dd>
            <t>AGPL-3.0-or-later.</t>
          </dd>
          <dt>Source:</dt>
          <dd>
            <t><eref target="https://github.com/loghyr/reffs">https://github.com/loghyr/reffs</eref>.</t>
          </dd>
          <dt>Implementation:</dt>
          <dd>
            <t><tt>reffs</tt> is an NFSv4.2 server written in C that acts as both a
metadata server and a data server in a flexible file v2 layout
deployment.  A separate binary implements the proxy server role
defined in the proxy server draft.  <tt>ec_demo</tt> is a client-side
library with a demonstration driver that
exercises the flexible file v2 layout data path over NFSv4.2.</t>
          </dd>
        </dl>
        <t>Coverage:</t>
        <ul spacing="normal">
          <li>
            <t>CHUNK_WRITE, CHUNK_READ, CHUNK_FINALIZE, and CHUNK_COMMIT (the
happy-path data-plane operations) are implemented end-to-end
and have been exercised against multiple encoding families.</t>
          </li>
          <li>
            <t>CHUNK_WRITE_REPAIR and CHUNK_REPAIRED (client-driven single-shard
reconstruction with server-side layout-flag clearing)
are implemented end-to-end and have been exercised across four
file sizes, two encoding families, and one- and two-shard-loss
patterns; end-to-end integrity verification passes on
substantially all measured cells.</t>
          </li>
          <li>
            <t>The chunk_guard4 CAS primitive, including the conflict-detection
and deterministic-tiebreaker rules in <xref target="sec-chunk_guard4"/>, is
implemented on both the client and the data server.</t>
          </li>
          <li>
            <t>Per-chunk checksum integrity checking (see
<xref target="sec-security-checksum-scope"/>) is implemented end-to-end.</t>
          </li>
          <li>
            <t>Per-inode persistent storage of chunk state (PENDING /
FINALIZED / COMMITTED) is implemented using write-temp /
fdatasync / rename for crash safety.</t>
          </li>
          <li>
            <t>Encoders for FFV2_ENCODING_REPLICATED, FFV2_ENCODING_PASSTHROUGH,
FFV2_ENCODING_XOR_PARITY, FFV2_ENCODING_LINUX_MD_RAID,
FFV2_ENCODING_RS_VANDERMONDE, FFV2_ENCODING_MOJETTE_SYSTEMATIC,
and FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC are all implemented
and cross-verified against the wire-compatibility relationships
described in the per-encoding sections of this document.</t>
          </li>
          <li>
            <t>The tight coupling control protocol (TRUST_STATEID,
REVOKE_STATEID, BULK_REVOKE_STATEID) is specified but not
yet implemented.  Data servers currently advertise
<tt>ffv2dv_coupling = FFV2_COUPLING_SYNTHETIC_UIDS</tt>, and
synthetic
AUTH_SYS credentials with fencing are used for access
control.</t>
          </li>
          <li>
            <t>The proxy server mediated repair callback CB_PROXY_REPAIR is
specified but not yet implemented.  Single-shard repair is
currently client-driven via <tt>ec_demo</tt>.</t>
          </li>
        </ul>
        <dl>
          <dt>Level of maturity:</dt>
          <dd>
            <t>Research-quality prototype.  The implementation demonstrates
the protocol and has produced the benchmark data summarized
below.  It is not production-ready.</t>
          </dd>
          <dt>Contact:</dt>
          <dd>
            <t>loghyr@gmail.com.</t>
          </dd>
          <dt>Last update:</dt>
          <dd>
            <t>August 2026.</t>
          </dd>
        </dl>
      </section>
      <section numbered="false" anchor="linux-kernel-flexible-file-v2-client">
        <name>Linux kernel flexible file v2 client</name>
        <dl>
          <dt>Organization:</dt>
          <dd>
            <t>Independent / open source.  Out-of-tree kernel module built
against a mainline Linux release candidate.</t>
          </dd>
          <dt>License:</dt>
          <dd>
            <t>GPL-2.0.</t>
          </dd>
          <dt>Source:</dt>
          <dd>
            <t>Topic branch tracked against a mainline Linux release
candidate; contact the author for the current tree pointer.</t>
          </dd>
          <dt>Implementation:</dt>
          <dd>
            <t>A native pNFS layout driver at <tt>fs/nfs/flexfilesv2/</tt>
implementing the flexible file v2 layout for the Linux
NFS client.  Layout registration, XDR decode of
<tt>ffv2_layout4</tt>, device-info discovery, striped and mirrored
read and write, and the CHUNK operation wire path are implemented as
a peer layout driver alongside the existing flexible file v1
driver.</t>
          </dd>
        </dl>
        <t>Coverage:</t>
        <ul spacing="normal">
          <li>
            <t>CHUNK_WRITE, CHUNK_READ, CHUNK_FINALIZE, and CHUNK_COMMIT are
implemented end-to-end and wire-verified against the <tt>reffs</tt>
metadata server + data server on a 64-bit ARM Linux host at
the 7.2-rc series.</t>
          </li>
          <li>
            <t>Per-chunk checksum integrity, chunk_guard4 CAS,
writeback-chain sequencing (CHUNK_WRITE -&gt; CHUNK_FINALIZE -&gt;
CHUNK_COMMIT), and DENSE per-shard offset canonicalization
are implemented.</t>
          </li>
          <li>
            <t>Encoders for FFV2_ENCODING_REPLICATED, FFV2_ENCODING_XOR_PARITY,
FFV2_ENCODING_LINUX_MD_RAID, and FFV2_ENCODING_RS_VANDERMONDE
are present.  FFV2_ENCODING_MOJETTE_SYSTEMATIC is scaffolded
(returns -EOPNOTSUPP; native kernel implementation deferred).</t>
          </li>
          <li>
            <t>NFSv3 and NFSv4.2 data-server dispatch are both implemented.</t>
          </li>
          <li>
            <t>NFS4ERR_DELAY retry-with-backoff for concurrent writer
contention on CHUNK_WRITE is not yet implemented; multi-writer
workloads fall back to routing writes through the metadata
server.</t>
          </li>
          <li>
            <t>Client-side single-shard repair write-back is not yet
implemented in the kernel client.  Reconstruction is
available via <tt>ec_demo</tt> against the same metadata server.</t>
          </li>
        </ul>
        <dl>
          <dt>Level of maturity:</dt>
          <dd>
            <t>Developer preview.  Wire-verified on the CHUNK operation happy path
against the <tt>reffs</tt> server.</t>
          </dd>
          <dt>Contact:</dt>
          <dd>
            <t>loghyr@gmail.com.</t>
          </dd>
          <dt>Last update:</dt>
          <dd>
            <t>August 2026.</t>
          </dd>
        </dl>
      </section>
      <section numbered="false" anchor="interoperability-and-benchmarks">
        <name>Interoperability and Benchmarks</name>
        <t>Two independent implementations of the client role now exist
(the <tt>ec_demo</tt> userspace library and the Linux kernel layout
driver above), and wire-compatibility between them on the
CHUNK operation data path has been demonstrated against the <tt>reffs</tt>
metadata server.  In addition, the Mojette encoders in this
document have been cross-verified against an independent
Mojette implementation with byte-identical output for
FFV2_ENCODING_MOJETTE_SYSTEMATIC and
FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC.</t>
        <t>The benchmark suite is now organized to distinguish two costs
that were previously conflated in a single-host Docker
measurement:</t>
        <dl>
          <dt>Algorithm cost:</dt>
          <dd>
            <t>the CPU + memory-bandwidth cost of
encoding and decoding, measured against pre-allocated RAM
buffers with no I/O and no network.  This is the encoder
ceiling on a given host.</t>
          </dd>
          <dt>Transmit cost:</dt>
          <dd>
            <t>the end-to-end cost of a write or read
on a real NFSv4.2 mount across three hosts on a LAN,
including RPC round-trips, fsync commits, and network
serialization.</t>
          </dd>
        </dl>
        <t>The two-axis measurement makes explicit what the previous
single-host measurement obscured: on a real network, encoder
algorithm cost is a small fraction of end-to-end transmit
cost at typical operating points.</t>
        <section numbered="false" anchor="algorithm-cost">
          <name>Algorithm cost</name>
          <t>Algorithm cost has been measured at k=4, m=2, 64 KiB shards
across the encoders defined in this document.  Reference hosts
spanned four CPU classes: Apple silicon (aarch64, NEON), Intel
x86_64 (SSE+AVX2), AMD Zen 2 mobile (SSE+AVX2), and ten uniform
AMD Zen 3 virtual machines (variance across the fleet under 5%
on all encoders).</t>
          <t>Across these encoders and the four host classes, algorithm-cost
spread on the same host reaches approximately two orders of
magnitude at k=4, m=2 (the fastest SIMD-vectorized encoders
approach the memory-bandwidth ceiling in the tens of GB/s; the
slowest scalar encoders are compute-bound in the low hundreds
of MB/s).</t>
          <t>Two hand-tuning passes on the Reed-Solomon Vandermonde encoder
in this document, performed without any change to the wire
format or test vectors, compounded to roughly 17x on aarch64
NEON and roughly 39x on x86_64 SSSE3 -- a precomputed field-multiplication
table pass followed by a SIMD byte-shuffle field
arithmetic pass (<tt>vqtbl1q_u8</tt> / <tt>pshufb</tt>).  A similar
implementation-only optimization pass on the Mojette encoder
wrapper yielded roughly 4.85x on x86_64 AVX2, again with
byte-identical output.</t>
          <t>The generalization is that a naive per-encoder microbenchmark
cell measures implementation quality on that host, not the
encoding algorithm.  Wide reported spreads across encoders in
the literature reflect this in large part.</t>
        </section>
        <section numbered="false" anchor="wire-compatibility-across-encoders">
          <name>Wire compatibility across encoders</name>
          <t>Cross-encoder byte-identity holds among the GF(2^8) encoders
defined in this document at low parity counts, verified by
encoding on one implementation and decoding on another
byte-for-byte:</t>
          <ul spacing="normal">
            <li>
              <t>At m = 1: FFV2_ENCODING_XOR_PARITY, the P row of
FFV2_ENCODING_LINUX_MD_RAID, and the m=1 parity row of
FFV2_ENCODING_RS_VANDERMONDE all emit byte-identical output
for the same (k, data) input.</t>
            </li>
            <li>
              <t>At m = 2: FFV2_ENCODING_LINUX_MD_RAID and
FFV2_ENCODING_RS_VANDERMONDE emit byte-identical output for
the same (k, data) input, provided RS_VANDERMONDE uses the
hand-crafted P + Q parity rows this document defines (see
<xref target="sec-encoding-linux-md-raid"/>).</t>
            </li>
            <li>
              <t>At m &gt;= 3: the encoders diverge; RS_VANDERMONDE reverts to
normalized-Vandermonde bottom rows and no cross-encoder
byte-identity holds.</t>
            </li>
          </ul>
          <t>The practical consequence is that a receiver that supports any
one of the m &lt;= 2 members consumes bytes emitted by any of the
others without re-encoding.</t>
        </section>
        <section numbered="false" anchor="transmit-cost-three-host-real-network-sweep">
          <name>Transmit cost -- three-host real-network sweep</name>
          <t>A three-host LAN measurement distributes the roles: one client
host (kernel NFSv4.2 mount), one proxy server host, and one
host running both the metadata server and the data servers.
Four wire-path variants are distinguished:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Variant</th>
                <th align="left">Client wire</th>
                <th align="left">Encoder location</th>
                <th align="left">Path hops</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">a</td>
                <td align="left">FFv1 -&gt; 1 DS</td>
                <td align="left">none (baseline)</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">b</td>
                <td align="left">FFv1 striped</td>
                <td align="left">none (fan-out only)</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">c</td>
                <td align="left">FFv2 -&gt; DSes</td>
                <td align="left">client</td>
                <td align="left">1</td>
              </tr>
              <tr>
                <td align="left">d</td>
                <td align="left">FFv2 -&gt; PS -&gt; DSes</td>
                <td align="left">proxy server</td>
                <td align="left">2</td>
              </tr>
            </tbody>
          </table>
          <t>A 180-cell sweep across five encoders x four variants x three
file sizes x three iterations verified end-to-end data
integrity in every cell.</t>
          <t>Median write throughput at 1 MiB was:</t>
          <ul spacing="normal">
            <li>
              <t>Variant a (FFv1, single data server): approximately
3.2 to 5.1 MB/s across encoders.</t>
            </li>
            <li>
              <t>Variant b (FFv1, striped): approximately
9.3 to 13.0 MB/s across encoders.</t>
            </li>
            <li>
              <t>Variant c (FFv2, client-direct): approximately
10.0 to 13.5 MB/s across encoders.</t>
            </li>
            <li>
              <t>Variant d (FFv2, via proxy server): approximately
1.1 to 2.2 MB/s across encoders.</t>
            </li>
          </ul>
          <t>The key finding: an approximately three-order-of-magnitude
algorithm-cost spread across encoders collapses to
approximately 1.15x wire spread at the client-direct FFv2
variant (variant c) at 1 MiB.  End-to-end throughput on this
topology is dominated by RPC round-trips, fsync commits, and
network serialization; encoder algorithm cost is a rounding-error
contributor at these operating points.</t>
          <t>The approximately seven-fold variant d penalty (1.1-2.2 MB/s
vs 10.0-13.5 MB/s) is the extra client to proxy server hop,
not the encoder.</t>
          <t>Decomposing a 1 MiB write on this topology into cost
components:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Cost item</th>
                <th align="right">ms/MiB</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Fastest SIMD encode (algorithm only)</td>
                <td align="right">0.05</td>
              </tr>
              <tr>
                <td align="left">Reed-Solomon Vandermonde SSSE3 encode</td>
                <td align="right">1.7</td>
              </tr>
              <tr>
                <td align="left">Reed-Solomon Vandermonde scalar encode (pre-opt)</td>
                <td align="right">66</td>
              </tr>
              <tr>
                <td align="left">Variant a: FFv1 to 1 DS (no EC, baseline)</td>
                <td align="right">215</td>
              </tr>
              <tr>
                <td align="left">Variant b: FFv1 striped (no EC, fan-out)</td>
                <td align="right">95</td>
              </tr>
              <tr>
                <td align="left">Variant c: FFv2 direct to DSes (client EC)</td>
                <td align="right">92</td>
              </tr>
              <tr>
                <td align="left">Variant d: FFv2 via PS (PS EC)</td>
                <td align="right">610-910</td>
              </tr>
            </tbody>
          </table>
          <t>The variant c wire floor of approximately 92 ms/MiB is where
end-to-end throughput lives; encoder algorithm cost accounts
for well under 2 ms of that budget for every SIMD-tuned
implementation measured.</t>
        </section>
        <section numbered="false" anchor="cost-of-fault-tolerance-single-shard-repair">
          <name>Cost of fault tolerance -- single-shard repair</name>
          <t>Client-driven single-shard reconstruction, using the wire-level
<tt>OP_CHUNK_WRITE_REPAIR</tt> + <tt>OP_CHUNK_REPAIRED</tt> operations
this document defines, was benchmarked on a colocated topology
across the following axes:</t>
          <ul spacing="normal">
            <li>
              <t>File sizes: 4 KB, 64 KB, 1 MB, 16 MB</t>
            </li>
            <li>
              <t>Encoding families: Reed-Solomon Vandermonde and Mojette
systematic (both at k=4, m=2)</t>
            </li>
            <li>
              <t>Loss patterns: one shard missing, two shards missing</t>
            </li>
            <li>
              <t>Five iterations per cell (80 cells total)</t>
            </li>
          </ul>
          <t>Substantially all cells passed end-to-end integrity
verification.  Median repair time at 1 MB, RS 4+2, one shard
lost was approximately 80 ms; at 16 MB, approximately 990 ms.
Mojette systematic at the same operating points was
approximately 72 ms and 900 ms respectively.  Repair cost
decomposes as <tt>degraded-read cost + write-back cost per lost
shard</tt> (not (k + m) writes -- CHUNK_WRITE_REPAIR is targeted).</t>
          <t>At file sizes &gt;= 64 KB, repair cost is within one order of
magnitude of a healthy write of the same size -- not the
catastrophic overhead the phrase "erasure coding repair" might
imply.  Healthy no-loss reads on any systematic encoding pay
zero decode cost (the shard is copied through unchanged).</t>
        </section>
        <section numbered="false" anchor="encoder-family-trade-offs">
          <name>Encoder-family trade-offs</name>
          <t>The wire-spread convergence does not mean encoder choice is
irrelevant.  It means encoder choice is decided by properties
other than raw algorithm speed at typical operating points:</t>
          <dl>
            <dt>Fault tolerance and geometry:</dt>
            <dd>
              <t>FFV2_ENCODING_RS_VANDERMONDE and the Mojette family support
arbitrary (k, m); FFV2_ENCODING_XOR_PARITY is m = 1 only;
FFV2_ENCODING_LINUX_MD_RAID is m = 2 only.</t>
            </dd>
            <dt>Interoperability:</dt>
            <dd>
              <t>the m &lt;= 2 byte-identical set described above lets a
deployment mix implementations of different encoders at the
same k and m without cross-encoding.</t>
            </dd>
            <dt>Reconstruction cost:</dt>
            <dd>
              <t>systematic encodings (FFV2_ENCODING_RS_VANDERMONDE,
FFV2_ENCODING_MOJETTE_SYSTEMATIC, FFV2_ENCODING_XOR_PARITY,
FFV2_ENCODING_LINUX_MD_RAID) short-circuit no-loss reads at
wire speed; FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC transforms
every shard on every read.</t>
            </dd>
            <dt>Wide-geometry scaling:</dt>
            <dd>
              <t>at k &gt;= 8, m &gt;= 4, the Mojette back-projection reconstruction
cost scales with m (parity count) rather than k (data count),
so its reconstruction overhead does not exhibit the O(k^3)
growth Reed-Solomon matrix inversion incurs at wider
geometries.</t>
            </dd>
            <dt>Implementation availability:</dt>
            <dd>
              <t>FFV2_ENCODING_XOR_PARITY has no external dependency;
FFV2_ENCODING_LINUX_MD_RAID's reference construction is
present in every Linux kernel at <tt>lib/raid6/</tt>
(<xref target="LINUX-RAID6"/>).  The remaining encoders in this document
have reference implementations in the sources cited above.</t>
            </dd>
          </dl>
          <t>A full benchmark report with per-cell tables, per-host medians,
and per-variant transmit decompositions is available alongside
the source code.</t>
        </section>
      </section>
      <section numbered="false" anchor="sec-architectural-implication">
        <name>Architectural Implication: Cost of Fault Tolerance</name>
        <t>The headline question every storage audience asks of an
erasure-coding protocol is: "what does it cost when something goes
wrong?"  At the systematic-encoding operating points measured
(Mojette systematic at 4+2 and 8+2), the benchmark answer is
essentially zero.  Mojette systematic at 4+2 reconstructs a
missing data shard with read-latency overhead within run-to-run
noise of healthy operation.  Mojette systematic at 8+2 holds at
approximately +4%.</t>
        <t>This shifts the deployment conversation away from "is erasure
coding cheap enough to enable" and toward "which encoding and
geometry minimize the compromise."  The compromise that remains is
not the cost of fault tolerance; it is the cost of write-time
encoding, which is bounded (under 60% at 1 MB, under 25% at 64 KB),
and the cost of crash-safe durability via the chunk state machine
(see <xref target="sec-system-model-consistency"/>), which is +7% to +22% on
writes and +2% to +10% on reads.</t>
        <t>Wire-format performance objections raised earlier in the working
group's review of this work are addressed in
<xref target="sec-rejected-alternatives"/>: the per-RPC byte-shuffling cost of
the original Mojette-specific projection header has been replaced
with XDR-encoded chunk metadata (see <xref target="sec-chunk_guard4"/>), so the
remaining wire format cost is the XDR-encoded chunk header itself,
which is identical for every encoding and is part of the +7% to +22%
v2 write overhead measured above.</t>
      </section>
    </section>
    <section numbered="false" anchor="sec-rejected-alternatives">
      <name>Design Rationale: Rejected Alternatives</name>
      <t>This appendix records design alternatives that were
considered and rejected during the development of this
specification.  It is reviewer-aid material in this draft
and is retained in the final RFC as design-history
context for future implementers; the alternatives below
are not part of the normative specification.</t>
      <t>The design of flexible file v2 layout went through several iterations between
2024 and 2026 that are recorded here for the benefit of future
reviewers and implementers.  Each alternative below was considered
and rejected, with the specific concern that led to its rejection.
Understanding why these approaches were rejected may help reviewers
evaluate the current design against a fuller space of possibilities
and may guide future extensions or replacements.</t>
      <section numbered="false" anchor="proprietary-projection-header-inside-opaque-payload">
        <name>Proprietary Projection Header Inside Opaque Payload</name>
        <t>The earliest iteration placed a 16-byte Mojette-specific header at
the start of the READ/WRITE opaque payload, interpreted in the
endianness of the writer's host.  The motivation was concrete:
NFSv3 READ and WRITE arguments carry data as <tt>opaque data&lt;&gt;</tt> and
provide no XDR room for per-write structured metadata such as
encoding geometry, integrity, or write-ordering tiebreakers.  An
NFSv3 server cannot be extended; if a flexible file v2 layout deployment
wanted an NFSv3 server to participate as a data server in an
erasure-coded layout, the only place to put encoding metadata was
inside that opaque payload, prepended to the data bytes.  The data server
stored the entire opaque blob without interpreting it; the reader
peeled the 16-byte prefix off and acted on it.</t>
        <t>This was rejected because:</t>
        <ul spacing="normal">
          <li>
            <t>It embedded a specific erasure encoding type (Mojette) into the
generic replication-method framework, preventing alternate
codings from reusing the same wire format.</t>
          </li>
          <li>
            <t>The header bytes were not XDR-aligned, which required every
implementation to handle endianness explicitly rather than
relying on XDR's natural byte order.</t>
          </li>
          <li>
            <t>Carrying integrity and identification data inside an opaque
disrespected the XDR self-description model that the rest of
NFSv4 relies on.  A generic NFSv3 inspector watching the wire
could not tell those bytes apart from application data, which
among other things made debugging, traffic analysis, and
middlebox processing rely on out-of-band knowledge.</t>
          </li>
        </ul>
        <t>The endianness objection raised at IETF 120 (July 2024) was the
surface complaint; the structural objection -- that smuggling
structured fields through an opaque type bypasses XDR's
self-description -- was the deeper reason the working group
declined the approach.  Once the design accepted that data
servers in a flexible file v2 layout deployment would speak
NFSv4.2 (with new ops in this document), the constraint that
forced the smuggling disappeared: chunk metadata could be
expressed as proper XDR fields in CHUNK_WRITE / CHUNK_READ /
chunk_guard4, visible to every observer of the wire.</t>
      </section>
      <section numbered="false" anchor="per-client-swap-files-with-metadata-server-mappingrecall">
        <name>Per-Client Swap Files with metadata server MAPPING_RECALL</name>
        <t>One proposal split logical and physical chunk addressing: the
metadata server maintained a mapping from logical offset to
physical location, and the client appended new chunks to a
per-client staging file on each data server before asking the
metadata server to atomically remap the file to the new chunks.
This was rejected because:</t>
        <ul spacing="normal">
          <li>
            <t>The MAPPING_RECALL operation required to atomically update the
mapping would, in a multi-writer deployment, have to recall all
outstanding read/write layouts on the file -- grinding the
application to a halt during every remap.</t>
          </li>
          <li>
            <t>Each client required its own staging file on every data server,
producing N clients * M data servers staging files that had to
be reconciled on client restart.</t>
          </li>
          <li>
            <t>The approach was biased toward correctness at the expense of
throughput, which inverted the expected workload mix where
single writer cases dominate.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="server-side-byte-range-lock-manager-per-file">
        <name>Server-Side Byte-Range Lock Manager per File</name>
        <t>Another proposal relied on byte range locks obtained by clients
before writing, with the lock manager state spread across the data
servers.  This was rejected because:</t>
        <ul spacing="normal">
          <li>
            <t>A failed lock holder required a lock manager to arbitrate
recovery, effectively reintroducing a centralized decision
point for each chunk.</t>
          </li>
          <li>
            <t>The lock recall path for HPC checkpoint workloads (many ranks
writing disjoint regions) would have required thousands of
locks per file, with recall storms on every phase transition.</t>
          </li>
          <li>
            <t>The design did not specify how the lock manager itself would
be replicated for high availability, deferring the hardest
part of the problem.</t>
          </li>
        </ul>
        <t>The current design uses CHUNK_LOCK (see <xref target="sec-CHUNK_LOCK"/>) but
only on the repair path, not on the normal write path.</t>
      </section>
      <section numbered="false" anchor="modified-two-touch-paxos-on-each-chunk">
        <name>Modified Two-Touch Paxos on Each Chunk</name>
        <t>A fully distributed-consensus proposal placed a lightweight
(modified two-touch) Paxos round on each chunk write, reaching
agreement among the data servers holding the mirror set.  This was
rejected because:</t>
        <ul spacing="normal">
          <li>
            <t>The constant-factor cost per write (two or three round trips,
leader election overhead, majority quorum requirement) was
unacceptable for workloads where single writer throughput
dominates the deployment mix.</t>
          </li>
          <li>
            <t>The approach demanded that data servers be peers in a
consensus protocol, which is a substantially heavier
requirement than being independent chunk stores.</t>
          </li>
          <li>
            <t>A majority of (k + m) data servers must be reachable for any
progress, which is a strictly stronger availability requirement
than the k-of-(k + m) needed for erasure-coded reads.</t>
          </li>
        </ul>
        <t>Working-group feedback on this proposal was uniformly negative.
The current design retains the option -- nothing in this
specification prevents an implementation from running classical
consensus internally among metadata server replicas (see
<xref target="sec-system-model-consensus"/>) -- but does not require it per
write.</t>
      </section>
      <section numbered="false" anchor="automatic-commit-of-empty-chunks">
        <name>Automatic Commit of Empty Chunks</name>
        <t>An earlier version included a WRITE_BLOCK_FLAGS_COMMIT_IF_EMPTY
flag (later renamed CHUNK_WRITE_FLAGS_ACTIVATE_IF_EMPTY) that
automatically committed a write to a previously-empty chunk
without a separate CHUNK_COMMIT round trip.  The flag is retained
in the current design but its scope was narrowed: it is
performant in the exclusive-writer case but produces blocks that
cannot be rolled back if a racing writer appears concurrently,
requiring either hole-punching or an extension of CHUNK_ROLLBACK
to work on committed blocks.  The narrow scope is documented in
the flag's definition; a broader version was rejected because it
created rollback liabilities that were disproportionate to the
single-RTT savings.</t>
      </section>
      <section numbered="false" anchor="global-clock-or-wall-clock-based-generation-counter">
        <name>Global Clock or Wall-Clock-Based Generation Counter</name>
        <t>An early design used a wall-clock timestamp as the cg_gen_id.
This was rejected because:</t>
        <ul spacing="normal">
          <li>
            <t>No global clock exists among the many clients of a
multi-rack deployment.  Clock skew can cause a newer write
to appear to have an earlier timestamp than an older one.</t>
          </li>
          <li>
            <t>Timestamps at millisecond or microsecond resolution are not
fine-grained enough to disambiguate bursty writes from the
same client.</t>
          </li>
          <li>
            <t>Mixing client identity bits into the low-order bits of a
timestamp (to make it unique) reduces effective timestamp
resolution without providing a useful total ordering.</t>
          </li>
        </ul>
        <t>The current design uses a per-chunk monotonic counter scoped to
the chunk on the data server, with cg_client_id as the
disambiguator across clients.  See <xref target="sec-chunk_guard4"/>.</t>
      </section>
      <section numbered="false" anchor="layout-level-generation-counter">
        <name>Layout-Level Generation Counter</name>
        <t>An alternative raised at IETF 122 (March 2025) was adding a
generation counter to the layout itself, transmitted to the
data servers alongside each I/O, so that the metadata server
could redirect writes to new data servers without issuing a
full CB_LAYOUTRECALL storm across every holder of the file.
This is a natural extension of the per-chunk cg_gen_id: where
cg_gen_id disambiguates successive writes to the same chunk, a
layout-level counter would disambiguate successive placements
of the same data.  This was rejected because:</t>
        <ul spacing="normal">
          <li>
            <t>The use case is already covered.  CB_CHUNK_REPAIR (see
<xref target="sec-CB_CHUNK_REPAIR"/>) and the proxy server mechanism
together handle mid-layout remap without requiring a
layout-level epoch on the wire.  CB_CHUNK_REPAIR reaches the specific
chunks that need redirection; the proxy server reaches the
broader re-placement case; between them the full remap
space is covered.</t>
          </li>
          <li>
            <t>Adding a layout-level counter introduces a second,
potentially-conflicting epoch alongside cg_gen_id.  The CAS
semantics on the data server would have to compose the two
generations (per-chunk and per-layout), which multiplies
the states the data server must reason about without
strengthening any guarantee the protocol offers today.</t>
          </li>
          <li>
            <t>The CB_LAYOUTRECALL storm that motivated the proposal is a
worst-case cost that the current design pays only during a
genuine data-server retirement or full re-placement.
Partial remaps -- the common case -- already flow through
CB_CHUNK_REPAIR + layout refresh on LAYOUTGET without
disturbing other holders.</t>
          </li>
        </ul>
        <t>If a future revision determines that layout-level generation is
needed, it can be added as a protocol extension: the on-wire
change is additive rather than a replacement, because
cg_gen_id's semantics are independent of any outer layout
epoch.</t>
      </section>
      <section numbered="false" anchor="declustered-raid-with-dynamic-parity-mapping">
        <name>Declustered RAID with Dynamic Parity Mapping</name>
        <t>An alternative raised at IETF 121 (November 2024) was
borrowing from declustered RAID designs: the
metadata server maintains, for every fixed-size region of each
file, a mapping from logical address to the specific data
servers that currently hold that region's data and parity
shards; writes do not update chunks in place but instead produce
a new parity stripe on a freshly allocated set of data servers,
and the mapping is atomically swapped on the metadata server
once the new stripe is durable.  The attraction is that
overwrite is replaced by remap, eliminating the write-hole
problem entirely at the cost of moving consistency into the
mapping table.  This was rejected because:</t>
        <ul spacing="normal">
          <li>
            <t>The mapping load scales with the file's chunk count, not with
the file count.  A single large file with billions of chunks
produces a billion-entry mapping that the metadata server
must maintain with transactional semantics; the overhead is
inverted from the usual "a few large files" regime that
pNFS is designed for.</t>
          </li>
          <li>
            <t>Remapping storms during rebalancing, data-server addition, or
data-server failure require atomic updates to many mapping
entries at once.  Providing those updates with the
reasonable-latency bounds required by HPC checkpoint
workloads is an open research problem, not a specifiable
protocol.</t>
          </li>
          <li>
            <t>The approach reintroduces the metadata-server scale bottleneck
that client-side erasure coding is designed to avoid: every
write traverses the mapping table, and the mapping table is
the hot-spot under concurrent writes.</t>
          </li>
          <li>
            <t>The mapping table becomes the single point of failure that
the rest of the flexible file v2 layout architecture works hard to avoid;
replicating it with strong consistency requires a consensus
protocol on the metadata server, which the current design
deliberately does not require (see <xref target="sec-system-model-consensus"/>).</t>
          </li>
        </ul>
        <t>The current design uses fixed per-file chunk placement decided
at LAYOUTGET time plus chunk_guard4 CAS for writes, which
localizes consistency decisions to the chunks being written
rather than to a global mapping table.</t>
      </section>
    </section>
    <section numbered="false" removeInRFC="true" anchor="sec-wg-concern-encoding-on-client">
      <name>Working Group Concern: Encoding on Every Client</name>
      <t>This appendix captures a working-group concern raised
during the review of an earlier revision of this draft:
the source of the concern, the question as the working
group asked it, the authors' understanding of what was
being asked, and how the current specification addresses
it.  This appendix is reviewer-aid material and is
removed from the final RFC.</t>
      <section numbered="false" anchor="source">
        <name>Source</name>
        <t>Christoph Hellwig, IETF 120, NFSv4 Working Group session, during the
discussion of the original Flexible File Version 2 erasure-coding
proposal.</t>
      </section>
      <section numbered="false" anchor="the-question-as-asked">
        <name>The Question as Asked</name>
        <t>Christoph stated that he was "very scared of the implications of
having every client be a full participant in a distributed storage
system."  He pointed out that any erasure-coding or replication
protocol that runs at the client requires every client implementation
to understand the encoding, and that encodings evolve over time as new
algorithms appear in the storage research literature.  He observed
that the same problem appears with replication ("simple two-, three-,
four-way replication"): a client power-failure event mid-write leaves
the participating data servers in inconsistent states, and the
recovery machinery (mirrored logs, write-ahead replay, partial-write
detection) is "a bit of overkill for simple replication."</t>
        <t>David Black seconded the concern in the same session, stating that
"it's better to have the data protection algorithm be inside the
boundary of what you think the storage system is than outside."</t>
      </section>
      <section numbered="false" anchor="what-we-believe-is-being-asked">
        <name>What We Believe Is Being Asked</name>
        <t>Two coupled requirements:</t>
        <ol spacing="normal" type="1"><li>
            <t>Encoding correctness and encoding evolution must not be a per-client
burden.  An ecosystem in which every client must ship and update
every supported encoding does not interoperate at scale: an
organization cannot upgrade its storage system's encoding without
coordinating an upgrade across every client.</t>
          </li>
          <li>
            <t>The expensive recovery paths (partial writes, durable shard
placement, mirrored logging) must not live at the client either.
A protocol that exposes those paths to the client forces every
client implementation to carry the failure-recovery machinery,
which is precisely what RAID controllers and distributed storage
systems put behind a service boundary so that hosts do not have
to reason about it.</t>
          </li>
        </ol>
        <t>In short: the data-protection algorithm and its recovery story
belong inside a storage boundary, not at the client.</t>
      </section>
      <section numbered="false" anchor="how-the-proxy-server-addresses-this">
        <name>How the Proxy Server Addresses This</name>
        <t>The proxy server role is the storage boundary that Christoph
and David asked for.</t>
        <t>A proxy server is a peer of the metadata server and the data servers that:</t>
        <ul spacing="normal">
          <li>
            <t>speaks the encoding on behalf of clients that cannot;</t>
          </li>
          <li>
            <t>receives whole-stripe operations from an encoding-ignorant client;</t>
          </li>
          <li>
            <t>encodes (or decodes) using whatever the layout's
 <xref target="fig-ffv2_encoding_type4"/> demands;</t>
          </li>
          <li>
            <t>drives the CHUNK operations to the participating data servers;</t>
          </li>
          <li>
            <t>carries the partial-write / FINALIZE / COMMIT recovery machinery
 that the encoding requires.</t>
          </li>
        </ul>
        <t>Three properties follow:</t>
        <ul spacing="normal">
          <li>
            <t>A legacy NFSv4.2 (or even NFSv3) client gets erasure-coded
 durability without speaking erasure coding.  The proxy server is where
 the encoding lives; the client does not have to be upgraded when
 the encoding is upgraded.</t>
          </li>
          <li>
            <t>Encoding evolution is a server-side concern.  Adding a new entry
 to <xref target="fig-ffv2_encoding_type4"/> requires updating the proxy servers and data servers,
 not every client in the deployment.  This matches the operational
 pattern of every other distributed-storage protocol on the wire.</t>
          </li>
          <li>
            <t>The recovery machinery (PENDING -&gt; FINALIZED -&gt; COMMITTED, the
 chunk-state machine, partial-write detection via
 <xref target="sec-chunk_guard4"/>) executes on the proxy server, not the client.  Clients
 see ordinary NFSv4.2 semantics; the proxy server is responsible for
 converting those semantics into the chunk state-machine the
 data servers implement.</t>
          </li>
        </ul>
        <t>An encoding-aware NFSv4.2 client is still permitted (and is the fast
path: no proxy hop, no double bandwidth on the proxy's link).  The
proxy server is the answer for clients that either cannot speak the encoding
or are too old to be upgraded.  In Christoph's framing, the proxy server is
the inside of the storage boundary; encoding-aware clients are
implementations that have been admitted into that boundary by
design.</t>
        <t>The proxy server does carry a data-plane cost: client bytes traverse the
proxy on the way to the data servers, so the proxy's link sees roughly
twice the bandwidth of a direct client-to-data server path, and the proxy server pays
the encode/decode CPU.  This is the price of admission for clients
that do not speak the encoding; it is the same store-and-forward cost
any storage gateway pays.  It does not affect encoding-aware clients,
which talk to the data servers directly.</t>
      </section>
    </section>
    <section numbered="false" removeInRFC="true" anchor="sec-wg-concern-recall-storms">
      <name>Working Group Concern: Coherent Multi-data server Writes Without Recall Storms</name>
      <t>This appendix captures a working-group concern raised
during the review of an earlier revision of this draft:
the source of the concern, the question as the working
group asked it, the authors' understanding of what was
being asked, and how the current specification addresses
it.  This appendix is reviewer-aid material and is
removed from the final RFC.</t>
      <section numbered="false" anchor="source-1">
        <name>Source</name>
        <t>Christoph Hellwig, IETF 122, NFSv4 Working Group session, during
the flexible file v2 layout erasure-coding discussion.</t>
      </section>
      <section numbered="false" anchor="the-question-as-asked-1">
        <name>The Question as Asked</name>
        <t>Christoph observed that performing erasure coding across a set of
data servers, where clients need a coherent view of the encoded
data while writes are in flight, is "just really complicated,
especially without recalling layouts."  He continued: "maybe we
need a more efficient network operation that doesn't recall layout
but updates layouts in a different way, and that might reduce
the overhead.  Basically any scheme would require either a fair
amount of intelligence on the data servers or some form of updating
outstanding layouts to point to a new right-out-of-place location."
He explicitly noted he was "leaning to updating the data servers
to be smarter."</t>
        <t>The same conversation introduced the idea of a "generation counter
that gets sent over the wire to the data servers, which means the
data server now needs to look for a new location for the same
existing layout."</t>
      </section>
      <section numbered="false" anchor="what-we-believe-is-being-asked-1">
        <name>What We Believe Is Being Asked</name>
        <t>Two coupled requirements:</t>
        <ol spacing="normal" type="1"><li>
            <t>The metadata server must be able to mutate where data lives -- replace a
failing data server, redirect to a spare, rebalance, repair --
without serializing every layout-holding client through a
CB_LAYOUTRECALL round-trip.  A recall is global with respect
to the layout: every client holding it must drain in-flight I/O
and DELEGRETURN before the metadata server can mutate.  In an erasure-coded
workload with many concurrent clients, this turns a localized
data server hiccup into a global stall.</t>
          </li>
          <li>
            <t>The data servers must be smart enough to enforce per-client
access on a finer grain than "the file is reachable from the
network."  Anonymous-stateid I/O combined with synthetic-uid
fencing is a coarse instrument: fencing one client's access
to a file affects every client's access to that file.  The
only way to selectively revoke is to teach the data server who is
permitted, on which file, with which iomode -- which is the
"smarter data server" Christoph was asking for.</t>
          </li>
        </ol>
      </section>
      <section numbered="false" anchor="how-truststateid-revokestateid-and-bulkrevokestateid-address-this">
        <name>How TRUST_STATEID, REVOKE_STATEID, and BULK_REVOKE_STATEID Address This</name>
        <t>Sections <xref target="sec-TRUST_STATEID"/>, <xref target="sec-REVOKE_STATEID"/>, and
<xref target="sec-BULK_REVOKE_STATEID"/> of this document define exactly the
"smarter data server" the working group asked for.</t>
        <t>The mechanism:</t>
        <ul spacing="normal">
          <li>
            <t>At LAYOUTGET, the metadata server issues a real layout stateid and fans out
 TRUST_STATEID to each data server in the mirror set, registering
 <tt>(stateid.other, fh, clientid, iomode, expire)</tt> in a per-data server
 trust table.  CHUNK_WRITE and CHUNK_READ on the data server now validate
 against the trust table; an unknown, expired, or revoked
 stateid yields NFS4ERR_BAD_STATEID.</t>
          </li>
          <li>
            <t>When the metadata server needs to mutate the layout for a particular client
 -- because that client misbehaved, because a data server the layout
 points at is being drained, because the file is being repaired
 -- it issues REVOKE_STATEID to the affected data server.  Other clients'
 trust entries on the same file are untouched.</t>
          </li>
          <li>
            <t>When the metadata server needs to mutate at client-scope (lease expiry,
 client eviction), it issues BULK_REVOKE_STATEID, which removes
 every trust entry the named client has on the data server without
 affecting other clients.</t>
          </li>
        </ul>
        <t>The control-plane cost reshapes accordingly:</t>
        <ul spacing="normal">
          <li>
            <t>Layout mutation is no longer global.  The metadata server reroutes data to a
 spare data server, rebuilds shards from surviving copies, and revokes
 only the trust entries that pointed at the failing location.
 The other clients holding the layout are not contacted.</t>
          </li>
          <li>
            <t>The revoked client only learns of the mutation lazily, on its
 next CHUNK_WRITE or CHUNK_READ to the affected stripe.  That
 operation returns NFS4ERR_BAD_STATEID; the client responds with
 LAYOUTERROR; the metadata server replies with a refreshed layout pointing
 at the new location; the client re-trusts and resumes.  A
 client that never touches the affected stripe never pays the
 cost at all.</t>
          </li>
          <li>
            <t>With warm spares known to the metadata server, the entire repair can complete
 before any client notices.  The metadata server reconstructs onto a spare
 using server-to-server traffic, atomically swaps the layout slot
 in its in-memory state, and revokes only the trust entries on
 the now-evacuated data server.  Reading clients see no interruption (any
 k of the surviving shards reconstructs); writing clients pay
 one round-trip to refresh the layout when they next write the
 affected stripe.</t>
          </li>
        </ul>
        <t>The combination of TRUST_STATEID and a warm-spare data server pool is the
"more efficient network operation that updates layouts" Christoph
asked for.  It is not literally a layout update on the wire; it is
a primitive that makes layout updates a local event the metadata server can
resolve before the client has to pay a recall round-trip.</t>
        <t>The chunk state machine (PENDING -&gt; FINALIZED -&gt; COMMITTED) and
<xref target="sec-chunk_guard4"/> address the orthogonal concern of partial-write
recovery, ensuring that even when the metadata server reroutes mid-write the
data servers can detect non-atomic stripes via per-chunk generation
checks rather than via a global wall-clock or consensus protocol.</t>
      </section>
      <section numbered="false" anchor="combined-effect-on-the-cluster-tax">
        <name>Combined Effect on the "Cluster Tax"</name>
        <t>The proxy server addresses the encoding-distribution cost; the trust
stateid mechanism addresses the layout-mutation cost.  Together,
they confine the residual cluster overhead to:</t>
        <ul spacing="normal">
          <li>
            <t>the store-and-forward bandwidth on the proxy server link, paid only by
 clients that route through a proxy server rather than going data-server-direct;
 and</t>
          </li>
          <li>
            <t>one LAYOUTERROR/LAYOUTGET round-trip per client per affected
 stripe, paid only by clients that actually try to use a stripe
 whose backing has changed.</t>
          </li>
        </ul>
        <t>Neither cost scales with the number of layout-holding clients,
which is the property the working group asked for.</t>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The following from Hammerspace were instrumental in driving Flexible
File Version 2 Layout Type: David Flynn, Trond Myklebust, Didier
Feron, Jean-Pierre Monchanin, Pierre Evenou, and Brian Pawlowski.</t>
      <t>The Mojette Transform encoding type specification in
<xref target="sec-mojette-encoding"/> -- including the algebra, the bin
convention, the projection sizing, and the reconstruction
algorithms -- was contributed by Pierre Evenou, drawing on the
work of Nicolas Normand, Benoit Parrein, and the discrete
geometry research group at the University of Nantes.</t>
      <t>Christoph Hellwig was instrumental in making sure the Flexible File
Version 2 Layout Type was applicable to more than the Mojette
Transformation.</t>
      <t>David Black clarified at IETF 124 that the consistency goal of
flexible file v2 layout is RAID consistency across the shards of a stripe
rather than POSIX write ordering across application writes; that
framing is reflected in <xref target="sec-motivation"/> and in the Non-Goals
of <xref target="sec-system-model-consistency"/>.</t>
      <t>The authors thank Dave Noveck, Chuck Lever, Tigran
Mkrtchyan, Rick Macklem, Christoph Hellwig, and Sorin
Faibish for their detailed review of earlier revisions of
this draft.  Their comments shaped the system model
presentation, the chunk lifecycle and guard semantics, the
trusted stateid design, and many smaller choices recorded
throughout the
document.</t>
      <t>Chris Inacio, Brian Pawlowski, Chuck Lever, Zahed Sarker, and
Gorry Fairhurst guided this process.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAsRdmoAA9y963IbV5Ym+n8/RR52nDDZBVASJbtsanq6aZKyOCWRapKy
q3pigk4ACTJLQCY6EyDNcrieZZ7lPNlZ37rsS2aCkrsn5lwcHV0UgNy5L2uv
+/rWeDx263K9KA6zD3mTLxbFIjt/c5Xtruj/72VvFsUv5WRRZG9K+n/v8sd6
s85+LJq2rKvswOWTSVPcH/LPkp/cH7hZPa3yJY07a/L5enyXP1ZFO67m7f2r
8Zx+P6eft+P7g/Hzb900Xxe3dfN4mLXrmZvRvw6zX0+Ork9/c9O6aouq3bSH
2brZFK5cNfxXuz54/vy75zSHpsgPsx+KqqDpu4e6+XTb1JvVYXZerPEvmdfV
Y7suln7qr9yn4pG+nR1mZ9W6aKpiPT7BPJ1r13k1u8kXdUWTeCxatyoPs/++
rqejrK2bdVPMW/rrcSl/0CqX+WpVVrejbFovl0W1bv+Hc/dFtSkOXZZ90Vyy
bP24orf9RD+hkbIf8BB9uszLxWHGW/YvZbGe79fNLX2cN9O7w+xuvV61h8+e
4Uf4pLwv9u1Hz/DBs0lTP7TFM37+GeZSru82k8MMvxo/3MpZPIvPgn60oM1v
12H45Mf7MsR+WSePPfvMEe/frZcL5/LN+q5uaFfG9J4sKys60+v97C0/xh8J
wVzf1cu8jT+nJeVV+bd8Tft1SF/QPjftKp8W/G0h+7Sob+8em3+5xb/26Syc
q+pmSc/c80mcjU/2txPhrFis8/FDU9Lq8evLN8evXhy8sD+/fv6N/vn11y/t
06+/+eZA//zj1y+f25/ffvMi/HkQ/nypf3774uAb/+cfv7U/X718Ff782v78
9lsb7LuDb787dK6s5vGqPizy6tN3fzzkjdCLfJRdb9Z1U+aLjMjrsihm46t6
US/pH8f1DARGQ2Rv8s1iPb6uF3RvqmlBx5FdHp2djBflJyNRGTRvbgslCKKH
h2KyXxTTdn+z/rRfzDbP/v7XFebwTP9/vqKjeXZ8Nf7um/HLl3z0PIw/fPpv
LGf/3/Zl+vyZHX7yoXCCq2JFk5kUTfbiu+/+iKM8Oj8afzg9T1a986Ep7+n3
2Sku9Kop2yI73+Cxdqe3EFD2w8PDfplXuVyYti1vK76+zwo/wLiSAZ71loBF
0HOHPJdorvN80RZyYC++fWFH/uK7r408Dp5/a5++/OPBc09gL76zP7/7xj79
+rvnRgh//O4Vk9Kbsw9X4xffPh+/ShZ/VUw3TUE3o73LrsDA8maW7V69vdrb
PvNzvk5EJGdVS8NsaOvquX+6zeh/s+tielcR7dw+Rms82twS+80Onr/4mj9t
i6YsWhCmveH87OqaTgSTzT58/D7jCQ+fwqwu+QBePN//5vnBt8/w6D4e3OeH
6Jnv3x396fTl+OrD6XF64PLFIRF5kc031RTLGdEJ0NyK+6J5fLgrmmJncAM8
rV18dVxXxCd634w/7NNCiQ+1ddX58mqf+Pm9sqbw8b/tZz+Vi2n9y/jiq7dF
3lTRlv23vNrkzSPt2cHzwW1Qxkps65mud13k/u92RTfu2WRRT4jd081s6O/8
U/FyfzWb4z5cfxz/KPQRdue0aepmPK2bpqCdoUv/oamndGGbouX7f3J82mYf
W3xz1D5W07umrupNO17X46vwT+IY1b0IquGdlEvAMtTo6bpYFJCFm6qc8mfZ
x6qs4+14D/lEm/H8YAsBYUWgoMtChOpMxvlx/9UBpnF2enr67fOD8ct0yfg4
kD8Webq+Y+H+1NzpoWhqdEJbJ0W/pLfQi/dfjvE7jHpBfOjf3lyN37w7vT5+
e3qZ3sudi1VR0dfZRTU+KVtSAJh5Z1d0oOVct2eE68vrO9g/2H/F6tR6ShN/
YtY67iAt1fTd3+ZtJKz1kzFpK+2z7/O2nP6fB8/pZKfEWYlZ3xXTT+1m2Yqc
7jOzD0eXl6dnHXb7nsRHuSJ15qRop0254gWofBGyOv0ln64zWva0KYi5XOYz
+sU1SZsWIuypi/n9PrTRpii7V++crh52sJoNXtgfNsUsITQisRdPn+ZJvs5p
2ssV3YtWllDNiW9AJO6eHB/vYZ7nF5fvj85P0g04IqWzXhZrutYnJHoKiFpo
q6ScymkeLUinpTNYMikSJWbv678Wa9qKL9qErWs92s/+RPvbrnucibbglCZS
b9It+GbLFrw7P76ihbw6ePX1KFut9rMXBwfjFy9fjrKTH47P+ElM8E9H1/+W
Lv1fN6Qj0hJbSAy63P++IfW7FZFxWbT1YsMbUPa2ZN7USzCivwrBt0+t/z0t
M1//LVrKi+/++O2WpVyRvK5uC7INdjDmu7Pzj38eQ5/5Jp35u7La/JJ9AlNY
kD4/Xz+Q/cCKT7a7nD1r8nL2zV42HmeLciL/emqKb/ex5UfVfUSofD2T19AO
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
wTFJYW2TaD1bwr5ZLAR860VxbkVZWkYoUVfIAxRyOIJsRspXZfkgbVlsBXv6
WuVOT5Hbq9upTtF58Nedz8kUt6egvu5A22wN3QeYK4ReBuSctDREKsiFiZXA
9h1NSE8cKzzFKtSSXy2H9fnwjBl1dT3pa87rcKxs74k7lAmpml/yRnyGSAji
0kuSHnj4dJfZdMPffCI5J0rMGViFbc+15l01aSAq9fWfawBQk1UiKwAYroSS
tJW9sjW6vpAUO4YinXXw3f6L4wOnb2ND2ogI1s5XrVFPH725vl6FrBRGx5gR
6bNdFjACoVijXILicQ3qZQ8IaQ8Rcn3i4zLJWMubB544Peeil05C0PLWva43
fpzzZfv+SMpMVnVwAM4nhZVNs7K8Wqlvtg5YFZfFWDGpTav4rEk+bYBRsdr7
OXc2v4s/XwATlEJubFBTx7nMtR9qp0X4VK2V5AGy5ULpeC0/UYTupmeHg2zT
k/2z9NnetTWws8+erWWIbKv4qtVWbDfg/Cz0pTgtD6KLnRUyw0hbUOUvHays
V25dbLEa89HTfFo1zDTVWsJdiN2+ZrJGL2/HW7bhDNM3stNroz9DLDMKUSz2
PcUCv09BthVj63oiVlNW6FCX3f8IXnAMZiqctDRds1FARRqXsQ243amVZ3yM
WaMwWRqFMRd+wi7sjKbWyrR9GeRE5kXYmpwQJW1RXdA+DV/TM34zh34F5k9n
eWUSOsZ7hwyVtZLGzv5xti2TcaXQu76RP+czPR6sXK/H7reAlKRyDm2Nk8Cd
RVS141Gt+1IzDSImutTk0wprmbHuVedStGgmZm/KMWpB0g02WIz19NLQp0m2
Y6WmEa8NdpCei40wHrO7rFyjxiT9Gipp5mHbY7GYhpr3TCZqKli8/wSRa/Vl
Ir2WMrgULLih+NkJQhPU7vjObAi7VUuvrSmB0ZhaYtQCORz0stBR1JhQ2li5
xLt7wxzIJvIOl8bpaojuGcVFqPQYON8K1diMUYOJLP0gczePfmxdqWjVClGp
6aeaULdVdnaj1ZT8eS69LxXhxepHZRORoyeHH8zminFwkaWmJmu1HOmVroeu
We2LiXP7i36u+SR+I7Wg5KGu+YefXsXesOK7d3vV+fBpcZWcb2k5aI38srKt
yeQTHwyk9YAls6454j1emqck/lzw3M31dLish9PrqZHMYAIAN/dhcnGndimA
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
tWlP71VNERWfa6dv+7VThMdnSMaY6/a6yrd5XusUjYqev4qiG/irNTGHC6e6
0CHNB/UgLcB9EzQgs0rk+ZeYwSJ42r2rYASogOLomc3oLUagRq1DjbrpmbW4
1Uv90h9VyCa+sNLqa1aWEHBxuAiPzqLl4BTEE5PF6lAi3BN4iUmlGCBCIJrn
y0yK5lLibDAg/PePWSSXwVqYS66bARkxZJE3m78E8TiSPwTK2CoHmtJLeKJu
Cy4GYMIZHDQgwfqrFN8Ha4JLTfUgJ2OlYBuF2ag5GwUsbPww3dPiTTPF2mI6
Dn8bV5NPFSnoNljYcxAahonqE8roDrjgd77XBuERUhW+EY3m1GjvwUmlJkZU
JXXLhzxZvoV1O2bh2GStDgUx5gkwDQ+hsoAD9AmFGxjoqFEBjXZIegKdfAqr
WUbiNJPCDoKai2lyrdOpaNGqGqdtJECxbO5lcsQepnUthrDT5aCdXDjV4Zyb
mFTlBAWnUvlEAuZyycwjOPDVHe3Y6OJVSW5ZQqlDljzQ3fiDYbzrNosSarM0
h2hALTp76535FQ4BN1dZdLQP+FuIycSHig1WuGydPwbSUrBTeBuhIvROTY5X
OPhiLptsMft9QQKNRETPiNM0s4nQ+DMFkSUGvcGNqcybHVmOPAELtqPCUmiw
gPT3mxoRDY45L7DanAU1EaYNwikVMIwkqhHjEFyKmKhhfkueX+DewtQcvHt/
/ud88rY6X6thUYqvSeiOJBwzDcI+ki4GIdwLGmfiCNlRoE41/Th/7+qfC3FN
CcgAGLINQD6ca0e5NvTENeML156DfuUPlIjgAtGWDc4mvWyJy5Cv8FzOzroi
clGqfmvuWyhPvgocGnvBrvI1rIxzdlSlrjFA4SmWsr6mKVsZDcv9VRu/Wc/T
8u/xW32VqxTZosxPylpZOUi3QquG5RkdZbGJ+PMPe/t/2j9Nfo5EFAlUNv74
9qeDP70/DH7wKM2buB9PRi7OcE7wuviLs4PTcMy83ftwdD5KTQX+HjmVwHL8
X/wh2TDXDc2P5e3h8d7R4f89+P/9pP50sLd/cMqlCP9DPyScbhfnJycXPxz+
+KVflxTa/1d9nS+xe7og9QTXHpExXpN//MZdtxbdOs4vXRK2VYTw4Z+8iw31
8o8cSxoxfHSMH46dEP+T54vLif5btpNUWj62y75UfM/ev3naZ66R2CQr/c/a
h/+5D0nopAaX79cMvCNJxMf9097x/tHBOjVycPpujbRllDz/04fbw4/1hOFm
I/vSl/aFnn7drvx159ng8DIB9GQVnXFr9P9Xjfu/bIQ8mC8Zt4Xr/qnjXjdC
CzT9jxmh8oiknpTSiDzqvzGtSPlG03RPdPi6PNNf6vldXf6Pcv66E2C+39P+
STzELML067Xs3v5ZEKnDk+NBBdfP5/Ikl+DwbP/QDSFXVR35PDnqGaOEKbq2
LKHAnniUqgx3ZMKIrJ8sniLPsnSKpna3nVNM5wN1hbid3v0noxfCpUXjDeM2
AXbP+5Xy+91a+f2mR34foesqfXyjR6S99K6XLHlYJuIjKU398eC8fJSkSwfU
44+lA+o7SrOP8rgEZ1eO+g/yNXRdPU9N7PL+kQ0y5nWVwOAzHiPscjM7+IxB
Cr1en2zwGf1cer1uf/8zBkn1Bi2UoWf0sOv1W2ej3iePBiyL0cB53svj1f3W
R1ZVFVmqGDLCvseUElRYefCnNz/9eLi/DfKQiw9nYVZP984+nB5c7J8NNExY
dwuP8Hfli59fEC/PC+KA9PSCa++V8ZOuXHcdaAjB4FulVT/cA55hk510gpDw
Uu6PHr53/OPBRfBOcrbs77Zep6f6poTrKRdHDYzLRTObdmuxtFfG2g8U4Olj
EyGdw9Kq+9rVe1Ogf+64S33BOqXDiO+jexD4Rhvly9dbLxNScOsdwjktIOqr
K6WZoV8RGTfBaG0WWhC5c0em9HtAHU+M8uGdPzWfp9K6zddHgAOegBjrZsJ4
3dZOK5V7aS8JIH5jO1ROgnDPEeSQaOxgnt+ynnRJTRJVba992WS1UMSWlyNb
Am1Rt1QSknsuaY9jcEAEHMcJPZ8e8G9XC8puSf83fQrV64XfNzeg6mFgU6GU
tAdK+3YeOxgZA12yFSgtVn0GGce11shQF0kSlgXD/Wmgh89PwJPraXL3lBGk
hQFkP5bffb9TXhNfyPaFkPiB8u0CXTSlCevAn7utWGk0wWTptC2P/ww9y0hN
E5X1du/8/HT7QgyNH+iEuThDAuB3YeD9bVaHvkW0VDCrkQIdui4hSzUeleEp
crphcJ5+4TTsvAzHZzDWw9HBZTVYGXuHdLaC+IVtEfkBBTfU6ejk1Io1/iuG
G/+hJWj5b6spE3jXaX9wbkktnIWF7a9LhjbRlwoignuicjeFxnEB6cUtUI6o
dd/KZO37F1HWmOiZu2uhICyVtfzPw7KG7m69/ww9a72s0fF9sH+xv3e+hzZ3
JGvfv1gra51vGZC1/LpHZK3z2B5Z68zTOlmL3ETZEQzQJTW9nFG3iuuHhAO9
AkiNXzQ2jsr4d6ueXC3uG8aScTMtlQ3hKqGanUV9ZbX3DKcgj44vgP6EfSBt
eakxn3Q6Q5fgViBFQw11OmN0zdsJYJbDuXahhjtoSKIrYSzTM4FdEyzoGepc
CAplhDvxPNC6GBRscCcI19AQOC80XtAaWK7D444e9MUFmgkyKJi8yJFVf0hb
sjthzAwTeHMDvk4QYNBKm/qoZs2caW5k+B2FwdQm/qbdvgsLXBi2OyEQq8VS
+OrQoAUFD2uEwbjGfHsB6YER4WJnB+e02zqDqRIUnZv9SOKlt4YxDe1YdF9P
IxyoJusA5XJaWC5M9huRqqq19g42AKAr6TLS9N02E9fFrTDpHl56weLGl6V2
HFcdeGbNr1rlbEtZkIgoLkgial6qpRLZgnOHoet6lxaGUBlg+MUOw5ayTcY1
tqy+d1nLQzZBzWo13zyVFYO8wBXHxxFeiSbzbxSmu0w+ElQyrCIZvgsgHlVN
PUjf1MUUJuz9YrqMrfb0E6QmR2enBkoWj5CPCnoFFEdCYjSpF2w3R9ILptgA
uLNu7VVJ1wQ6Bq+WKX+i05yyzc5vXY9TehtjEK+pG0TZaBMdN6k0ZwPkqrYx
pFjoyZPG31V1Id22beJ+KQZPuEjm499SuqUhIFEWMvQ9fJSGgPCPn6QGNW5Z
4kP5NF30VRaIUDsk4FZfGw3QE4gKmrbJ6STQTyFbVeuZixpUPSlVYoE7QLQ4
XWaTTI4bNYZClSivKyGo59TikgieUUFc2JJqoRTmh72lbBnMmNJWddwyLJlX
PqmzevQ7qiNcdCz4N80dcZbu0yuU6UKsea4gvGpugw4Dcp1tqfzXT7LX85vS
OEDnTZmlk//dLJzOjahe+HZ7fFkvRYOEhwfzYa79g40vIuHxMYioMFQSx5C4
uxtV+Yxf8Iz0JuswVQzFsrlhea3nAFz6GN4l4Vy5Jof74yhbkLtI2nin76cP
pkZTHLuQgllYTPSKWXNDbCqFGyQd+B8iLvo2+HKTMQ+aO2SlGHe8GZW8jDA0
4uKKx2yIYyuU6cyzlrXN6uvp1cPVLIlnb6S4qlHhwWujLDa4yYzelcA6/dTD
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
pOJHBrCNCX+Pz9Pyq7o1M9sB0o3ROFwl0QBfyjk4r1NEKy5YxIA7iZbxZ3PT
rIJlGzWVPDNTJskDh2XQ2kKJKUYilgiASJdYrNPTzjpWp4dTaxd6jjYtQImg
1h4zVpx7YILEcATkRznc8Dduc70mqYFnL3eK7Dy/tIptwtYKn3Lbvkxhsem2
SY5NyeLx/BWVVw/rWgAaMvKw4uabUTvbFrC5jo37YCpLPxociVIyLGbC6Hgk
8TRhUmy44wIQf7ZC+vl+aawi1Si2loIyKMoXMVBnQo7h+hJWbNJya1SasiTx
ke7R34/vJ+kKWiwoDOLBtueR++agUc0YoXPJ9HqHlIGmcTacdQks57hmaTiK
vEARZM1AftRIbcnND/wCaUM7XDdhmxZdUH/Eg5GUC3BYfKrOMaGnkSFYz/Z2
+er6lveJAe0Nl35RB0P/OY9O0UPD2Y3RYluSTAom99IvQE0KDbtaBOHErfrr
FRpecYiRapwwRbVIHFb96PnEhQrfvT2c8GwcidYDQG6TOA0WQk52kkFtzet5
fSJQxq4tDguo9vKenawRX7oRsrGvyAx5QMCaEVfBn6ITEQlwYj2qW8605xNl
tdrFud6KfCUGL5HCNJC2GFRwB42veT1uOG1wiISdipQAHwRJDCqIn+mwSkcM
MgXbnqluLcEHmp/YrXl86DW3AWs3I/+RzsDnDKZVNg0bt8t84nFE1OCnckNS
xBOFz0W9YZrCI4DhOzoerVUldWrcYe1gUSwW0341pRDRM2n3BlaY2GTAUnGV
O8ubKWJ2tUuh8iih0FU3m9t6LimKw7S47CrYDcg5vdiQQ91X2CFiuLJBwapK
9i7ZT54/mfEX3YcUqEn/tVuec3gW7Ru4JQdH5ay/VMU63+yjyOK+yqy19Urq
sCSajTYd+ZnhUyGxhSL5B1EC1RzWn95SORE3/+FU6VpKE3h2IhhRzhLzgEx4
ws6J9Mwr17wxogWU9Rr+YH5u1DZCalIgulqRQh7xkkMh5CNG9jleD+6oHXE5
lXcXKHFL23HVzae6vxzbE/qsW9ecJcyjWpG+39GjHZxnqDl+40CJh6LajGWB
5MkgV4qFAy8+nHK58lipTCxm2VH6IyhsEhxfvcOSq1krh8t0/GBEY/tA+p8R
8Y+/cJpVmyFRzHH43JQ/bOMmKeb/PFQ/icRkbIdK4mEIQaMjRJNUr04U922c
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
BtaAr/E5WTJjLLx1YE4QcgQBDFIW/vgdPdcenXWdHy+KbcOL5gd+fI1aLuut
zCKHwF34Icw24fT5KXbP+gmRiq0N65kc6JaIRWbkVPBIJAYiPR+tVdL4mEpJ
kTwV1TVB8kDBg5fWw91ydrnqlxr/k45vlMqq6xGIRwLZ7arr55EiFW+a0pt4
1qvmYtVcX0ZFX56hP0ORwLTmkrhB87vE2cVR+iDyVPjcLNctUqi1xsWG9+3t
pL7qLCBTq1QKpBBhqea8Xd9NZ6uOIpYLy6Kxbo6fINKlG8r7TQjNiSevb1ZE
UBDfyrzK2s6a+pQRNIMjJ9JHkx78KTkhP+FKZ2rmdb0jemUaN7j+Fa8E/3x6
djO/AEeOZRNpnrvctrA0V9MxMgWZ2nSqizwiZEJrN7l/jfnVSwvUhkF74/wX
zTVBO8KrCfHaJKqObBT6WAeW/+Q5ub6nkpwml0e0oJNW14aMJyDaSbDSqqDE
eFi1i0ailBmxqmoottChnxiTeHHTDdr2YH3b1+cLyp+I0tTEquuYZ8B47V5o
dpneL+EqrDd4zgDwPKPrgEy96aqZqfnk74gd7g1FMUVmA5W1YOUjV5IYOfbV
3bCwa9ZzjdoIaB3KD8ZLltAr1GEDPduQuWjmESwdRsOBeb5dwn/i5YD+ihu6
W1H0KahVkfWoZlSjgNIjSVZzQT05t0wNNciDypOvR5OTh+f1QGmLl1++Mc4P
WQl5TI4foqjhyX9rDQ3Clg8yeuG/XaDdgjxEFvFeebsQwYj7FR+tg792c7Zh
GUTccXJlNxioLR2pxPK6bu4WfTMftLVeIw8N1Cb5ZoH7bt1eAGnEZPVSWtIj
b3KzJNEF6kK/xmsfhel1727AWLSDgBQC7fJgWKTBbvFsZaESdEhOCG1R0ZLv
FlZgx7AoYjuWXxUPAKeOWdVYvYsx4+qYerr2o/KB83Mlpz7c3KxdgsTuu0EV
WRnDR1Z3vMEncr5ZAQR74xKwDiKth6KzTPIzQwdVqaNdt8sZgtGTiB+KJbr9
XCjy7VFTdMg0BA0a1veNIoNsxfjQSbcvanLzgTAcUmeuWstiBGaburBCia1O
Le5ybRcMTrSMLJ1kSx3DIsJTqaXULVPVI3Ij8iY2CUee+K69SsarjS0WzSlS
xwmRs/awVQ3OpfGaJ2LOGGviqDlyUKLUdaETZ/0I3TpPlOKC6MqTV3t6k0e7
Y1ZLJfDhAwO3SGvS0OK5iadBPWbYW4paqq0m30rZQP7jHOfhOgxOn95wOef5
fKuJihsq7wddfZJ8lGYPzBWfYvV0CEuECq0bBg+YIgq++c9k0+DYU8FlSN5E
7rsKojlbhoQf/ar7aNTrQfP1rBAlhOrceHca7SQswlKg2hmAAk8aW5Bul5zz
fYk5bCGqE9WKXKTocCnwfm6XMWwsdQ5nanlpSvwKVQv2akk7n7XQ88N7JSG5
aud3pnBZDtYUULi4I/O3DS5RFS9D/iDpmP06JjQLEZNzttIQK7DACamYYObM
AaNBBFg+jEpCuXkRIhZOis2RtH3PL8TWkA81N1KLOSlqFnwaH7MYdDHyXAw0
yP1OnDOMKclGaW2YfJvqJHYjRZ/VzgxVLSoGwVTYDQfgol930vinPgw31snR
6bujd+9evnmtjEtWq/jbva+/2fs69T/jqQbfy7mZN5UcbO4AZcDXZq3jKa9V
uCIZehxXKD9XMRalOBi6eKwdGsTYlBMRrC5ZsMKf973sc9iowqKmTrDY2onV
3ltEgd/8xVBZDKC0b8ZbIkhWu0J88kPgU7ny5RLjpBexfl5KhNeozYP1mph7
NF0Gbu/4s9nPYAqBR5nALmzQNfXbo9fPX77+jqy0Fy9fH7x6+T+Cy6+wIkqm
DNSuhByFOT5IQ9lNTy/705gtWbh/A6EWtrN5j+ZawnYltzlWIAvP8KN/On4Z
BFaYouVjx29evfr24PAPLjqBnwFl4TmMm1j6x3tJLa3EUrcVleg0GyzOH6Oe
deTHTKosQM3bxFXTgyvb5ZkffPvq6FRCJVhSY70StxAwUJwMAV3i7h6F/R2E
deMngl70l40gZw2EVggPx2rf2KLCZShqqvgNd5TL0FFdD8uk/IR162i84WN/
Uqg6XYQrt8RM+NxQFHAGT11K4ER6J1URnDVRwMwUnoYg0DHdiNpmKCR6iPA9
yWPlaED0kqe3YAvS9ivU/y7IBB9WmzwAm6N90Na9XEa9Q+y3WlS/6yftj+ht
u1hMBTAFGLjBysn2YF6mwpbrreyQ1jGfRE/y5U2l2FHHTFw+dRLnIK/suDNk
f/7MYQODheEXa0UaslUMeYwMZqE/Nncw1ahJ1QXYVzNlNCkZM12P2kfagaYO
jk9eHryqM/pG+Wfi/UOvJw0n0VR4zAqWWrF2Twcl8LqyJ4v9FKYqfjAfclWL
kMNfW1Mz+GXrDoJADfmucaaGQl1hnFDcI3qBOk9zqxIaBPugL86NLH3oV/ev
uHSpdAH+thT1j7VG0FPShsYY6ol2IZhP+VgkwRMUAXOq6xbyETP9UMVKr1hU
tOHzYXhUZvsoRaU+CjMI7rTl1cyAq6jBXtD1G0K763XDjTt7GEaVEW1E3aVj
24CGPdHtldVhMn17j7btY3PhUloxGyTKpejiQPvSWJ+lwNuT9KVaYpEiAwkE
6eL1Zj9UiQt6X/R+FJ6v+G1pEGp3Q1QHzbC0yA2WbxjcjTSSLbb3ecjUzizn
FjYP4Q2udS6exoO/eKCZWWNndzFPQ9nB0U3GB4jbU6TIBpgFSdC30qCv2ZBu
GkpOgb3lvFWwIRgCJ7lopcLk5lK4WFYdMUosULmF4VMzdRmAW7ij10ESgwFG
CdBTQq6+OT4R6ng3hDINiYVl6vXdtaUaOZLMLCkR1i95mw3b7JoHoD872W0W
6ZEx0AvFFdFIuevZZr0DoxL5y6s3B8+DGfLupCQYBNlc3MzVJaCvub7E4jpI
S7Yzlb7wF764rR8adTrsby4U1w/A5GWzIp+sr3w+HtGmPt7AzWLoaTmFezRb
mKq8MD7pTwJJwRUpDvOBXfV82KFf1uWi6mDwXzUX2qJMevvl11xcRJSlZSoa
C3swvvy6zOIYXYZV4YbeJhvuOqy2obNK9yKCfno3VnY35reNsl5QmnzRTmNw
Kax8h9oJ6ffhuWkp/RtpQ8IC5P59cuU+Y/95kwly1VwPllcn+WGrwWarxlUS
GpXwdDTguFitAiI8rMDAdVVB80/SkG/8n2UdMCkeJSnwZW0VLQ7C1/Ysiruw
w1hS0UZO95cqEB5qdlSbzIcNZsh609lhuySVRv3YBpEXy06KMHmmMQw0IOyl
efH12UIxzVQxhZ8Ngp9RwShzs9fosy6iVexjWsUuoE1SeZldNC4GwWTDI61o
ERLRf2ctHQGqHMCBBMfwzpL0ldsFOcN6Z+yWoyV2hQ3VVhwUwdXrQwoUUTby
WBXhd5pI5sI2rPLzdtahDOFk1SohxUyenKoKVXT4ov2IziQAf3x4onlM9rCv
V/26n/ULMlDOwhxIS4Z3VpKsDJOhCFXwcpFCRV4ujPpG6u+YMkFaTmrwtEra
Z+FvTwESOAuGxbQ9Pyfn+TpcFEgiBqNWKd/u0ojD90cHz4+QoHkexOXLsSP9
NlhPR1Sr9OYY76f12ZBT0HqK4DSSG9At0Rl8Zxs3un2x2Opiw58je+uGHxhT
yM+TjTzpfIHSjdtfME2RxDeC4B6+ef38JWH6SCOoiBjWQEs/B4kG4triuL39
hvvLAoPUBfHjmIl28fFxZ246P1dRW5Ooxf5nKqd87IdW2hs6cX2H72wQzilG
8XOk48fL4iDp+r+gWsW1iai4MhfN6izcyeGhhYL1EFQgOZs2QaBmnVYKaufo
xV3Q1MROLG8c1v2KXoEyNk1lSsRiYPIFqfWr2Avj+AAtgK81D6qPbU2JBfWw
+poswhXDfZV+Hw4UcNnuGAT/4/Fe/VYKhyiVRCAovjDkyvSHpq7ri3apgKcr
6loM/BCo7VvDg6fOmIbfLSZJhVvd+V3WqK1fbcnN3cJl4D7wVNYXxzQoqmJu
JT1Uq8NpDWFf8+Vha+aJYYF0KKPhLszgakq5isXUfiYSE46HclAskfZzU8ha
QPiRqi2KtClJMfnhT/aCvoXnQJiZWVjD3vIe6bvwGP+d2D06v+LMHYa5gUyf
MTm81CsYvmuHtqrtQAX3dN7fhs8d8ovpCUIOUhEBhntN1tmaNnNHcSvC668g
K3VqUKm7vX1JbD8siTKX9IzX0kgZCQkAsinbCfrDNddedZK50jSz+wgS5YQR
3TLKSS20/YawSdZ8Zpu1O2E4z/IOJ3j1geoPIWkRZOdOizCbf9BW1kuh+mhK
ArREC/Rta3kWhPs9F0gK0odKo78Op5ehEyISQ33wx4OXryjUOz7AzGQlWAuL
EYlFYc8BADPFcYUu33xK5GdTNgI56XOAT/hlALxVP8rFdKi4BXrm6LkXWtDS
hPlS6z2ygrB8sIMEtEWcnZysF8JOYBrm4YRTqtwpHi66pogXtebryeUAEMcv
r4ELOgWGYbPoZ+E2DA6ajDCZDkd5BMoejYsNQEi3duO8hDWYCQYle0Wy2kGh
lYx8rjtPzUyNJDOPZ3Zb0E1BLEDp5cChb6abXecC4iIUMLCCJRwcwiqsUAQX
cr6WLrR2JPQcC6sUFnz45ocfXp4Et8VfHHAmkFuXb1X8FTpWwSFJW3XqqAm6
cBxh2/HNFeq/hkcTrmzbaXZJDHlRKKmjy8HZBM7Zgw+T2DQz0E1q4OXNgUbm
H4lYUiVdqdMjpaPn4PHUeJwXl0xWAOxF9pxzcZtFBqjCzS/i2EL9+uhPfsWl
mQ/9c+X3latdWfQWRZnjdlBUGeA95nrob1Yzufg10ZkaUpkJhf+pphObJMSO
chUUx8r6VT3b6DjkTKguAMMGF+RQdEyYE1tma3HSa2+i9edVk4is09GUDJth
guMbfkw05e+Qa+WU4DF86b5YnXUmhEHWS6pUnvKm5DR5igDdsQtCasQ80IJp
Bos4VuL7CtvYNZkW6nOxKapRF2fCqyHZfgweAsEXzXpViJKauHRpA7oh5vkh
mxHvKJX2Cb7klKz/nylxIf6xZOXClmxxCaoUxZo6YTbiHbuyR6xsMLKocHXx
od1lKwe7jjdUhTdYQJikZz5fUeKeUrPnCkQlmJvy4lxRsnU1PEsHFl+LryOw
iQHM1fB0QzCuEDpmnLpFgifLsG/AdNXT/7Yl9zzWeHnmmDNraiN9WV7g+tuj
F+HmhAK+GXCBS4fpcL11S5icYp6ATUsz52DE24kEyl9GB7+Oee8vjZBFjjQ8
oi/VAZiKhbpbC6Cxqv2lWAqXAI9Ebh/yu3K/0fprMjAtsLJUvJKH0MXM1uOm
0JjeaVlh8s9JDQoptGDQIzcBOo4YXjY0QE92y0Wn1RfjK6JWuVMDZJv9sV9L
HlwBrFIyQUaq2zi2yEG3G34kncwQbg9LRQ/zHYdrJpVEJ23K8RLEZxPHi4hP
EI1jWeSMTFDR5vv1vJfQNWecDgDDF7a185uFdy2/rE3yR1EeDIcR3wxCvSKu
Pb4jkSu5DPt57f1N7KfF7iDPksdJDSmxaRxd+FrAeRMmyIClGSaY2jn85uaM
1odje+ONq+p0k2HKsFRYnHpHFghhABMUCxCoNk+vQjCWTPnju7aR9lCqOpwt
VNAbqaWEZY46TGPQBy9Ojo7DGFIdkWoISnJr2z4D/exLtofiTmQb3JFwsk2K
nEDigqR5O4Rvlx/697n9nllSkeQpOV1qSpFXCTGhTeSt3n7QbMdyc3+TtT/C
NvikD3WCr+r7DbPNOwiD1Vuw2ZaC/Khmtq7+WrsFNjGswrPGzpoJSakHzofE
o3woNCqCXQMoB8stLN/7NIv7OTzwyEB+xUwc/mDotBSJiIZuoTlAXee9GHji
SSyd3gP3AR6ywYcWUDCO4o/DJ1AMG1wGXxAkvya55ZIgmKZY16XBJWTlKotX
1TvXFq3CP7AJp0wFtA73HLY9DumDl7IT3BNBcHuB4dyERV9RkZvwFxJA40M7
JTt7g+sVHnz0ch4sjWDDowdCWIAf7S3H/JZDvOXNzfqRMLpWtYSTAP04+vPB
4YnSoMkq2UiEqTGmH1k1IlfzYIlFqUkwB9d2208JTfAhyBv1gOC7gYM4b16/
+ktOkQpVbojQoFKMgBZXg3+v8c0faC3oiHnQH7WkueX2jrNsXSU2lQHEzQBC
ZCPvyseI/IJ18wWD2Iu9EVXDWopp2X5wtzLNHd0t0fuyQb2+8BnS4lV1tEvo
CkJo0pr5RQ9D6xG25TZ2P3E1Iw9lcUHtz7qmJbPvAcxOxUTKtpQ40x3CgNrE
dLgOd89S6lz4NHAVRvFbVMjpWSvbj2A5FZ5EsNb9K/vVRdimbKtbvl8AneO8
QQlAFw+slh7dC5uLOf9fYi1DiW0B10ksIhx0OjRBYn2jhY6zBdVm/4coqjZo
FxDUUDduhdmwqVVZkJ0LnxEiXjsIzKI7b2d3swWiqYTtbgSS735jLp1e5h3V
c2weJrNZl32wKvPB4D3AgFImTra2Kn1+J420egdkd8KMbpvWBOMYmXUVm3XO
GDctcctOgw7J2jCzcaDWHRYxWAHzITPrvK0KIduJs4t2XeWTvmOrrhobaLsj
RgLDafdamBucM8YOoFiDB4s7XKIcf+pXVMtyxFVGzwpZddr4F2oFbg56BBd0
RLJ2yy+XEiZSAivKpEqVLrLnFgqJvi5mJUVDCKgBYSUo93n7sfq1ay+PRHu4
3kkLykr8huV01p/O+iCW69NuXj19zH5RT+1dH3/1Vb3jA4r1ztPHk/o3E/rL
7q5iQJYVSdeD3l8/fRLfXz3+6vHo/U/k/Y93d7UnlgKRSQPFiLPip0qq2jSI
AMFpGf2rSbEFwwU5nKA9elid0A7dskNdzGDZNfkENq4eLjU5cBk8v7uKlQIL
tjRiwvafBa2l7OhrFGQIMQLDcpgqsddyC8iaX4Zw8Hb8sk0q+l9YVfpfvHy7
mlcJunHi6gJSkMQ+lChLxeHBO8n57MwuToNdzS+7iK/eRWFzjIJOr5ol0GoM
eMp6k61RTMvBWDNjmC5sEOjt97RM9VvyYnc2JjF2Nx4XrPLPSGOX9jk42hzQ
XdxpySB67NVj8gafbEN80R2U+tfMXbBUvscSfIOF2WUfjx6L9pQMuD8bidsN
FtYOgSqXhhtn04vujWBpGXLWzi4JExq+TKnLtlvFStmcDncTPOJnv/iP8YHw
4q8no1QPYsS34hDHNOmWtdUbh02fPF1ZUW68tIm07kMJXyX0A0L4lBTbsGJJ
SoXr39PPj1h/ad2VuLXJXoeRfL03LmUS/ua8kGlj9SzrMSvq/X397+inhvwl
/bMbGI3q5/LuKr+167mN8VubgVqz4YNLXj+jN4aziCDmwI2vt+UvVEQ10n67
jLfxaOfTNLIBYZIsi/BpS0pvomJEggmAHaMXGmPANtnwzBLKfJDDEOAiO0ke
oZngAauvBsrFndkIdLHLbYYYojD3wAmDObBV/fQ+YXDxRKgObEQiUVoZJ+Y4
3xKILXJNG744FK4hyaO6XF7DZA0/jSKT//Or/++n+JKoajg1LSuewXk2g9/I
H/v1fRO3uBIfI5WiYiDUD8n8zgQrFKya2Q1J+oZEL500zvVaqnc0hxiz2H2m
2TLMPIclQAyRw57rojmu4GLemjWdT1xrepxG4aYXr3UC4HJOQaxhPT0Fc4bz
OXasHbU93v/oeSvI7INIWxI+8zL93QlePDyi/fvmvv3j6o+4G+OThmXigN++
7i0fmAxqk59f0GxQmQhyU78pjMTH5VBqZIxSG91YKd6I4Gv6tT6vVXlJYVGG
36/rmPJx65AGI0yvz9pVrqZdJShd71yxgHgHasazZA31CF2313p7juru08Ck
DwXt53mPSHwQLNewCcInQbL7yEVabhvFCHEQJowoXkYa60rg1vLz845A6dGf
nzyS+4uzF1ymrspaEscaGyLebcQ1d8jLmISVgcL/d47fxklDqZDR94psYeP/
/Ra28EYTjwznYOG9CwsZDJLpN5o9wa1G2HW4i8iUZBXwJjfUkLgnfu+lFmfU
Oylcmum0g1JctmvQQqoX7Uq+xyBr8RFJbCmUerepXoqjatYHlWRi+ptKVt1H
rv0B+WLgI8hBI8QdbsBwI61JjKeQO4gsSCXoYXUayLf/yApThPLEAQYLGDtk
ER1r/Pi2fbYVZFfFrI5Sdsi9zoQxMMNwsA3EFy9lp2Dk9L1xfYI39OAo7ZWt
Pe8VZ+XauZqD1p1DNkBVvciree2H4p3BnhD74jEjizb7KOrb/Uxta5A9IrwW
2qVxzibogWsXGhk5q8ET5mYnWMDNppyTVQOAVJw9eCBIJCZ3wjJt8lcm9Wjy
pBbvDOZbySpi0zuhkSi4Dwffvjt6feIdnUobRar4ysyKSXv1567Df1PQdLNm
V0qT1DvrlAPTPh/ch/DcLlcXZscuyR2PTTxtBW1FBBKmGptYUIrRBjyoRp26
RgnZkaMoJkZ+WXwiVC3NgUZcWmUJ6IQxIQmbUdovSTKe3QUrrZKm1Vpf5+VR
au0Q6aRoplLZ4FhVLnmqdhA1StZWR5d9D/a+6bR2tD1BGr+WRXkSmSYo3Agg
eclek7rjivXFrWHe6Cy5/No8NU05DeE2KgZwYzoihVBWxTfp3O7ZOaEcSJ70
ntRtE02wCGWvMhQY9/9hCJtdBpmIcZ6zgu0s6c8GvHulJOeEW9nY3LIs5D05
yCrcKevWyp7zRN3qqnYE/qr8Kw1G5gO3Hj2SEkaoDea9gazqGcq6BrmKohRM
KFxrhbKWQa4SAUjBAn/aAnmsRK+cw4D1oeVJEsfTNJkl+ofql+X5qzLo95+o
SC44LOQFHNJSzmN7kRMGxp1p6/pwuHApLcFChl2/Dl+r+TJgE18qFta9Xb58
Hes3gs0VhB9kWuF13N3k8a9468jMQjVfjxJBCVLMtAUMdDbNoqmTOmqM4bxl
BOh1ML+MmaONH+AmeDxQqxsDyJW46+gp4afT7lj2o8QA0n9luln3e/9SCFel
eAO0GHvxbrJxHZBfj/llFvWKrgNZdJof01zdDK3h3TYgXM9vVkjVzzvQR1ej
ofOs7RIEDwD+Huwz9XN0mFW6Xcntyc1oC2NHcyHb249s8wnHUzC8936zx7bS
k70nTDbsSMGRQJEF3zKIBw2AfiirWMkq3gyMymtiM00Fm86DypgRqZtakCDg
HlRJV0XLYVDvh3dC2nxJty7EA6W4Hd+rXAsnbNsGK1+pvwnzFaa+6gBqJNWC
VKS9J1KsyXzsxUYvn85OMbkVqtPzoZPR/h6XNL+NgTvxI+59lbyvzEzVUqHE
zHGK6xvtrPThXiGy1CqSY4OiYQySJAf5+O1hhu/zi0HDvGA2YHZG5BwYib4w
MNVdDwa5Hf7myzc/vHl+9BSWGFFWZf/6Jxd8yfsIS/YZTMgoplvOq4PDV/rJ
IdmsSS0cAFokQOPM2mh2DAGMvKLATHOT0OIkYsmvLWBstcohonYurJnyVnUy
Qf59DSfVEzqEf66EYM0NngfBrZKJItYOjkiDVF6yBqlY8pDkQusA7Ei/aQKR
uEjPCJW1L/EZ17IKbGmXTbgCxbYLbmCzILmg2pxOxMQ3yUNi3JAnjFQa2pWn
9JCbhq7jN2+PXmOnZS8ormEnLJPsCYEEu0WzEsZz2coPT/nkkV10wcPeUxdt
0YOUXzi5ZUfSOzWy7k+q4W4ZfhHmUd90wqZ0oWzzJtrSs+C2ubOs3gh9bmcw
O3peBWkLOXfm4P0osQpvdBzeoKMNXvC/oiac0bxrgTD0hHjlv+Ak34QNugDD
TONbCwDVolLXmbwrVQZ98+JG1TOhz5buA1V8EXW35MtuopFXU4DJ+aRJVZBk
/IiHlKw0kLtfMnNzfBIHu/TEhTzhfjsB5lWr/+JPuzlWjbL/GJdZkJ6GGmOr
4pJHWF+cUFmhbxOzEdkOwgUDcWcs7/RrDRciokovHJBzaReaLKamx4mEaKjQ
IF5/k0yUtFIYZdBxExbMeA1U8RqRUik0YkqbPkDa27WY3kI009GpD7IO4tve
2HKgJkb3qS4HmPBtOapyB4Bxn8J03ax9TDT6wYmWiY6eUemsvSZ2Nky8jkuc
HzlaqKANm3n5i90Sh4jsa2IskJYTwUGgshlhCfHtIPWCCrbxyXFQhxQBPjl6
+VxdguQfBa2fPWrZQaYATTnefVAh+HEX5G/Byncj4ugXj9upb2nLgfJlbSxJ
2F97h8xugykUnpgRfofRFakRQNM9Pvrjmz8c6dR0o9N/pXgU2zICYdEF7VfV
tz++ImfI/1wXrfAneZNQXOlrzEaKbOCAIUmf+4YjaVUqfd5opfrTKFTTjqoF
mIWT2pHPLrtWvSgQPoMFiBFLaTmJnquqcK4UTsghk2VbOEtVcpZ2M1cApXPS
GNcqtSAAJqDKB9uAUJyL4awGUd8zTZ4BdQjVKfBR6QY1exLb5UYRSqltsYPK
YWh3odtnFb6bmDAUoGtXVLqLV2TmhVyfNu0vhkzFDt5U2Ri5bypj0u5t9/SF
yV20CobGK9x7wnYV3oFg7GIhl6I2gCIFCuNZwE+8zYCYUgM/rkrFAinsg8QO
ZW3hJeuGFyl9Z+tNH7bXznRruyC5lWULVcM7YBdhclbd2Q1o3WyFwXoaJmBL
CATZqrPOGdy4Z1ljfThFwZWBx0f/749gkRMrBtVTQVksCXknzSgIPbV2hiSJ
b2Z7f8lryqFj2Qaw59klkljCgzLYRxNRFbULnQYjFZZtldlPKgEoLaKNS92O
wXG4I19UWVXPujfUpw4EkU/1XSjghuJDtoEHLATj2yt3FiiMJzDjIARaGUmd
5Yebq3CtKCWIZzCxszeT36UMJvqw3GAc7mS+ZkduK3z6zFxII9eaEAplU1sB
srq1Gmg2A8qkEbGIVffSmKFyNCbIEKnJRVXJ4WycL7pr2P76O1T0T2rJqjFX
10CxxfP1Lembs5sLq41qpcMtp56oQbgg6y4ptlchaQHetCWCJNT/2TXGEYU7
KFt4DbgplSHoQp02iwuK511eWY8A/RNaBBQ0hbSTi8dQVMNVh4ngLjs///Dk
6nT8Eb3V6O9TfuApw6u/7dZTWqnpbNGQ/OoTQ71zeHz49ZNJjf93OKlfLFqi
21893QWn23P00PDbFBZd6XjjXiEWchnuLQY99GfNWbdgpv3nPcLf+b6jo3vw
zKj47fayJ5sTOC46TdKfwcF9KPB5dU1trBq2QEwWJ9rRpLJWGm52ys03W91d
r3t0QQrGmLrrceGMvD+cZC7Do65JV4TZFJaSm7Og+Igo7KZbIyOttRzCJkEw
XZaX9iP4BAebYBejLLedtHIH4BeYy0M/tHDbhfv4gowBt0Xvvj+YPvn1N5Oa
/suvH4fd+vbVwR+Ovt60RfnGzIqf4DR80EsD8whRcJz46fkMDExsGM7t0V+C
4g2e3mU88QAPLfrlBUWBk81y89R4/h1ZdeDIu5M9ugoyzufmXplQgWgiwqks
DzRAjsuCjfV9y7WFRgRj61kLISUXjXdrfgnKXBA77i5oXwDnWgs2x4fqnI0r
hft+m41MtKnft3e8UD8cHJLyGrqLJUeeqZ9LMM922r2LvQnFrN4dHZ5+9+7d
6R+Ov/31SwAZwj9OyS6anrx6x3t4dUO5+GwoQsKHMV6b0cWdCfFB4jZrlt15
mNKusD0ZkxPMq0r7DoQ1F0p6VfJWoG8FckhsasyRxSdq61bIFibCbILVy8aL
XlnpCZIuhFxPqsfC6/P1qCGZuVnUC+TOLlwLv9svwdtCazFkCgD6HuW+tDHy
oUiSxZ1GiG5YIl+2JvAOdL8bzzGBysejwz+8+/GH04NXRKH4+gjH83WfE1PE
D+G9isKME+R2EOREwkZbxvHK1sY37HhJYYDi8YvD3z357e+I1SiXrV033/xV
gHzB0OPch855KMCCw5sPXj6P3a3sJbvIkQf7uqApEWxHrEL2hLgReZ7EfXin
NdrBTZwTkQZUg+xpBIyTZpFLRtk9uK8DKAyElydsxnNbTj2VtJZjThA7xaI1
hirllmVOcpaC9BIxBT2p3xyT5zEWgJrpnP71RsqBcJKTHdOAw2IQdpe4ZRJM
AZDnvLMKVJ3WFwNnBsE0q65XswpajGZIhbCUV07inXPXkEosoEfZ9B9RkQEn
ayuXZYupcjqtE21ZQFY+d9hqmUbzZGO0IDlG3n5Gat9Z3ZUomDk399kwA26A
QYl7zvkSYrvSBlKEWZqKfyLvNxzfSqrV5f6IhgSM/QoFhSyr/KDyRkcAANuB
wW15rz2iUOmQXRKwBYLlNa1rjjQd/Hjy/em7v4g6L4Xh0nezErCyMmta1U5t
23nTCBFx3swslfY1E1gOzxgCTTEG7duEThHGQ5/26sL68JJRsErsMY50LgnT
thw4FsAKG++jHxJyWxkZJd4cbMiP9PALuI0fHmfhGCyNhgo38u8sg6YQEKDC
ztjVkgVm+5gA1c36cs8tdDxBdJ7uu0DX2pLTrz0pEsQj+2cc6IZdUZBDXIJh
UbNlQtBNFqpb6xIdUrudqXsw3p6MCyeXDwQssUWf3yOfVmIV2C1n3TV6ZzJX
IGRV/UyMycSWah8EMN1+vO7h9nQWcrTuunTITZs/g/ik96nUqi3EqGXgrV1H
jI40S5czLsHsuBuZKOJBsJWgkQRcoy82SIRd+0JBo03qnAWJdHqyT9Ozm/X0
qqGgBYD4jampgp1D61HFuza7pydCCy2Dzv+8L/F8XJ4c7xT/0ZrCNuuxPoub
GIYOJIP0fZuTdu3vDDog8b9MqtSrp6sRfdboxnwF/OYRmqIqW5tRno8b+uwY
fWRkoCAoGlfT0RkUQKigQMUx1VjmCq6BlpylCG4fMBKocl5dhJaKLTq9CH1B
J250nZLhV2Qj8kGTEI+LOElTRcZ2OlSi4eZVwh1SUKDHyJGmbF8acQvDQnhA
K+IwqUra7ZICiqsI5TfcnAf9pPkLfb+C/WIwcVI5EvtIpZ80SFBMFWcSwsEi
PuGIvMjzeOHsuhahLAbS//zkx+PXnuJYLlhhFe9Xc00xXvfdkvPhYs0j2DQX
aiIYGjdU/NjMWpU8Ztc6pHT5S7Ae8pued8NsASXDkSOKsHnqbE1rR2ELPubO
46+++t3vdpOSaMUmESP5wcmbH14e8s9+u8udKCnBET8bVulmXfGmSO8oAUCA
b4ECfz23MuVIAQeHUMh7FrttUE6XHxi0VbqLEsNC4N7E4VyJTjZyb2/8iINn
pA9mAdC1qYRE86jXmGohzQrihnX2tw+4+5nDz6YbJIj6dCpJEOvrKseDyff4
T4fHh47eQZtyUcejMJwqpmo5mkubKQpZdNEADDwdSQqOzQA86Zda0MLHFLal
9FvMDhiPgvuJzlpECrF5rML5dgjbNDc5ikFwbpqOF2TZJ8HkCqpBGD9c/Jk3
S714i1JWGciCDsDN0nZWRcE3sOLAb5BuATbMvHQD7OJ4ZIijbRMYk6T58Vdf
70621N7jJ093JxvYPeivv3YvGLFV0A++EZTKiJOB/vib3T1Q3J8zMhNClDKC
oB+q8pe7rmwNh/D7IEnMNTOT1txCRzmDa9ZcXKwI79AqWeR1Bw+FmBHFCoSl
SPLAeFPWmGojIgDXLZfaNor/FR3qq9hbF7XnhX6FmmQ1CrCsiZfcFhFzg6S6
qgjWV4hk4fqubpaWDlDZiNmdTJIykYnSwksoJ6fnNC8jEmc3i2aVb7VtJu6N
cKbBmhXWHScySs4JNW0gfVEk9oDDfcGtCNrLbhmVUM6KJsqM3TttKQF03ApV
CtpHPoygP9dxUGE3FqlX6kGQNRg4T07uFWjGoO9a5Mmpe0tzseypnzKNSEia
9IJhOP6hBHneQhy5Cs1YTuq3NI4hz2Ewkv/n7DSGi1KLgxVkxqQ39D/Y7AdD
oNMqO6Xi60mxkmuyoURksmFLgq7eSs8vtTLbSfbZUKNIBTYkSHxQn46oM9um
XbnVShDTK3K6quB9i3kK/glaNqlLqQ8SQWE+0OoT1ge3+4YymsgPTaQac3a9
sq4ZermmKXT1eRz1DRtruVKoRiAwtSTlIAArYB4kreD/c/zi8De//eaxrjMu
hrv0McrdmiGvbLNpvAa00N3Fzaod92+wZ3cGxg24xA8nl8cuHmkpqYo7b646
Sm2rxO7fR3eoFQL5zQdHednXCOsLfKC3bsSR3iL2s5H3khG/Cv9w0aNGtRfb
myzLleaewzAJMVQxDi7Nlg7PCp4R4XDNbPcmmHHxusTsMl2MeHwJg7EU4KSL
f8GzuO0GT0APzBHT+cKAsW0YXS0pY8uWrYDtrvxu6C4nkCjwxAdHOBOFKoqR
b1tjHfLcZjlasrdHxz9USuJmy84LvbpZtEp9UZ/AL6Xix/C0lZmwjc66Qy8V
l9NsvBQb2FlRPZW8jXq0UmTJL1NZ/9SPMIzqgB98q28M6/KIYd3492hZOFK3
KmaICHHYry6SQ+/5rrgaCBRIFTVz5bopieWWroB9WRi64j+EgyI5zPqM/btF
e9GtuyuoDHsdPOTlZXdGbrKRKnGngmWijiI9oQ9Ns42COGGEkQ8tZR/JgMZ4
EF/MtgeobC2drGpFDtruRSQam8uotwFg7317x8llnIBhP3x51a/911hkid/m
hu39UdlM7CB5JzGj8FYhZoHFS9x1pGd2EKFTs0cH6zye5Rxf5iFwATM3Otjd
x00xlSo3jsDJhqx58u9x7EX8gu8wDUJ2plxX5AjWLvLfICLlqMFR4XBFyMqL
1pLIyDN6k5bfTpwCLFJAhETdMYRBD3wZVAm1ANBBZD1NzRrigBPIiFwRD0fp
xyJsCxy1naCGW2T2WIlUTDgvpTYbwZzDdZAdTu/ZpR9s77Wd+hgDW6Evu7ic
CF1dx/ozmmYcGHNxKf2OVOGI6N+NxkG7OWMshWM8pFjeYIA4xd1xB6baui+r
+jr2VWPtx8uwZebLoVIc8sHqDBt2CvytUE7OkBzOg1AbjKT6kTSpid7iH537
+IjJE6pzKjdl8mwq1sJFQfF2IIvtErbgu4DrrqirC8faRa4U7QHgnp5iiku4
YOeF1KVWWjXHUXGkbzc5P/ijhEBm5IHwZTmXYB4gmR1OozSoVF+lW/HQkGZC
3O+0od658vtgc3lfmK419AqdA55zhgYO1A0oPIRcnr1Cg3wScyHjhrMrR/Tf
SD+YdhiaGRZcmKystl7V7DPLHwnVU/DGqkg16joLmmLm0vItxvS09DwVxdEr
wqkjgkqANW1Jp5fd2nEd0L/QGtTAEcoh47pzrvjmtJZQMrIhLhLK8Fhg6i/a
OTUolMpioQZHoku5JxBVAjQ6nLPTZXt7yv5wS30ERn3cvxiiwTxl+gSqdacn
LMiLF4WNArfRKehR+Z3MFkXKDEnaDv6qiXkVxVzafFLksu/WxQUhu2f+gWAm
WBi8/5kooSQ8wzO/QO5QtJHKY0RSAKijBpO03QZbrK+mjayAVfSEeQyUPCLt
kyyh5OKYJ3PZV5Dtlaj6IjmrJ32lwk4YsGRzPXftYVgJENNnN6zjfE6Ra4Nq
mlF+SJkh2FHRn3Nr7o7VLA7grL9sxQFiFjA7YRWj88o2qx0uPxBWDVo1LNY7
uESRR6V6+gXCHRy24LiajHO/yg+n8Bokolt7zocoE5UcEvzz/SdXr4HnFory
IdC5izlvcDD1mI4q7BOeRyoW3kJTZPHQrN8eLqHSyPY2DYd63PhwTDRMicqh
zXws5Nb2x2OH7xlHT3zvqNxjE5bLZOhCdv6U+cya8U1L4aro80RQyq2gfxyf
gtKDdYMUH1eU/uwAKNhxlfTRvPIl+AO3DQ43RR7Bj+lLUlz2GQ0usXdDnlq2
QibcukO71igYGNe1oW+DDuYYOUIMrnoyCLwP7wn81l3dxNBB5kVi047t7Tx3
G0w16ieJVh0Jp2gMcMPsBtBFmnM24YDu87rzYF3d9ES2Rg0antY0XQ/gbKLt
ZEztZjd9QO+r5cWUavKV+2RAA5Q0rHve3CzWY5uO7TnhCAm+2Sq4QSvaHGZc
pJPtXr+FDm5wNKl5GAleZX+ueAGuFIpkBFQTkRxfx8cwQjkgHG3muzINbO7X
B+/5gf1uAHkalGfu7AYKgr4nC57yVTAIa6SkYfIhYb6hV7NYWP3SfFe7HQn6
yQtfwaTfstqdJoJjzmZxN5FoAykGKQ4vbkkajXh3dBxu1BcHP7464a6zagtP
naBxdsQyYWyVQpzBo8q585J0UUCoth6XMDpFShGlabq1xsuCwQqrALkLuz9i
cH9FYDqNXm04vXQ+0RKL0/wz2mQeLI8w+IJkjnaDj4hwmSkHAojFeLYeoqfs
diAWjKSeMlU46yElYgXheuHDw3wGQoIlbWam3BOF99Pa1bjiTE+nxmkL6aC4
kceHnWxGluiPHRPSFtbEEcur42naV4SIfk1Zr5DkszegA5HSN8I43t6EsRo1
YbRVKBs9IAwC04QzegrT3AkCioSNVLrE41cR0GSWwEUjemfXlS+OqfAr5iw7
6/v32vZR27ETDTaZR1hY2FbKIKiNATdsl7Z4EdSW0L4n92Rw6GTLZADI9KKq
W30VpW8ed9i15sajbss/w+89W8F7YS4AytQJzTksWKtEx17nZoRcyFd9MCuZ
rqiCQgu3hIp3N2fuMY6uMQP2msh8GiP/Ftc9hrM1zMOBV3AgfaDqngtFFXH0
U2G/r4B9NT4TThwRCLOqEui1Q9Oqx6rMEAIlJWwugT7Cn9a3rZQEaKF61pDc
hUL8z2v3c/ez4EAAupMMiJGbMKXG11ukfjYAQXXTzb+kolMfP3d1O4ZJYIQY
n4wkNF9ZbGgfYDrjnEA+Q96p1JCu0bAENAxOVZ3dJLQ4YKlkT0NKiRku5bsS
SprxBf9gym3dBioFfOedKjO6bH8tyiXihqjxugOorhuse9a7o8OXr1+88eEv
l7EdugU7WPNgHeLghikvhZ5ERMqBDQHpse+G8VFNYA4FiMEN3ECUvbr1L4HA
cbaJjHgI2wZRabL6Q6v9J2hpMCAALiWzi+GWsZlfMxACg7GrycuJ4MZKofHY
4Ngn3bvr5N1cdRlFLqmpVJyHsnZn6Tyrj4zrXhGXVzt3DH0Z8UoD4L9fNRY7
1tRs46lIWKQXFIs78ZkPX9ccg0VCLhj/H8JuX4TbLyiwFYO0pGOwS//1vu1p
RnNjRHLFIavOVTqil7LiVOqb75WkFjUPVKCiicX+jLitcAlqi4BlW3rGVpwL
9YMD5GWXG4GTD46SVIU7k0TgMhZOHkpg3bJKrmCX84A7LuZXK+aVSMkhz6ry
X1K2oq/TzdhNJJ9UD+wRShku0JyCPSDeXGZo6Nbc4jRONmHy2EZHk3KFFOQR
dWsAvPV1IlA8DHVJCk9OinuvJZn0qmopHW0j8C8Ry5tBijxJ8XvMrLgAVUlu
a5NbxuZfUYH1Klemwq1UPd37HRMq8ZI/+VmpwNUuHox1AtmWeQ+7TJqLJy9N
OmY5HLjJL6XwNbkCmrvZZWZ+pycWLUMHMHknJhifYDjJt4RelCYs53kVtoKG
rCrkZrno3pM4cpNF6gIHYhF6y8K6RaZDEkYjpTlDFKVDr5eDgSsfwmsmPqCw
vrtu680rw4kj5jbA/Uldf3BVAW3GPFTumKz7CzZFTQsW1XpY8O/72xZyd36D
mKgbzyD4qzNHwDOp/PLwSQKqU8Yz0Q5ePmI3Gt+HryvYWFLQc9vcxRQzq7R4
+P+EGSQ8G5P7VVyiriq0IWoQgDabvxm2qkaV6PTgk0+pl9mIkC28SQtWIKtE
J+Uus73R5q9aORSO/EBZXReNQAr4PDtMiVjtovvtLuXwAnHV+MhZd17/oV0F
n74f6j/+uv6Oghvhjs0NjfogKgrKqIfbkGu8uTRkJ3x3evD2pajZp4+fBDVL
q4oVlIvD5mDm0IT97/GNxoJV4VBvX0d6NltHJa7Lda4a6Tegf3rHvA8jVFfK
CsFub0JbMsm4PlgDF0g6KsfuUOY/mdRlmpBJtZX5w6BkKS9LFq1UEgxvgZU8
BQ0jpC05trBtoDLKCDZGDVIc6V1uzkVqkeA2SPn7zgYbnMFQt9Q+izPPHRK2
1Qgx9lKiIlYAZ/JML3DnotKtH3Tr5y2PjI9rBPLmKdwbqQKLFgCRd2hDmPxJ
xxVSyUMRDDZmvdK6orRkq9q4LmVOpWDNhPuZUsYJuPtLJu2SzzoaFjdQSbCJ
CRQfT5k1mGrGBwvC0u7n0oP0YtBXLguf5t16zzDnou8T8Tl8/R0xtQNmg1sg
PjOeIQLFVxR+6ZdAvq4TDmYkd+TqsBUusBSxcSo89F2QNRjidPtwpd1JybNA
ttNXGIYRJkiztJZKvCjPWAR3cWhOHcQPtVDp4MCMtYFHSYVIarv1lt8Jt7Q0
X0iUPCvr2nqOmMom4UoGIhV39DLu/HAHkmAu5vX3yCOqgWr/+/HRwasfHu3u
S8jb3H/a3ODdc1uW0hcIhHCHNPDyYs8WO5NQqxN1c0S9wEfGETaz2L2mTBpV
OnkYUyoa0COokc1jIEibMkTTytVSY8NFP9aAjHI0OgyZG2UUxi6xMxaMZHU0
l04PGoZDWI46TtCzJKEUep8scy26UAymNJSIyL5RazicM4CR+KBZ3wwi7Jd8
lnxzh/E3QVldiKNH9Kez962UKl4L7p7bLGByYb7CI6BccuFP73clm0+P0TXf
rX1dIut6iF1cCzYp5RnMMQpKwi5PMRACNMERUpGxA/C+vQuLxRX40Y7g5o8q
bvGwKjHL4o69ahBFpKo6vtrFIfMrhMpMMX6uAIZjyX/sZm2qHljThmtuwcQh
61qY/j1bj56wTHBN5Vl/jS90xkClLhd3kRsZXO7E2STwUe0SUrpfdrxFKw9M
YseiMqMda6Y3ehDRFFiyJx8ZI1Zcu24Aw194ERgYuH6W7J258bwadYQVbeaQ
65z3JqGq3UfLQ/eI19/+klY4OBvZaeRpvEgf+hu07aOoczhXI07Zwwg5LXv3
TA6J7sJGMwK3klnq6pgBjfdH1w77m0iB400jMEbVIcJpeEHG1SSGZaJNY0Xg
SOtL+pecD2Br2DlUyD6Xib/jMnE2u37oNDY+VNWhS/ZmgwSFxYGbrUiOCXMx
JSwd4LMLUvtQ76Q6axJP1y63+epWe2lBOfw9WacIScTMpZ8nq5z3YXbCbp+P
Cys5GPmWGtZpQyjq/bfkHbhKgLpcaDxYvI1ObxjTM+NAQF52SbRnzN2e0t+O
u+pMLN6RlqvndB47LgOxu6WQ3fUyypRAvZXTEiaFNPhyORm6aq6aBVVypXv4
oV/cIA7iZWYkLwl8wO/C0BLmatF0fK8iY+hauw1GAMNQLiweKsl3hhvwxdKK
Us+NVnQ29EDcJjgCGD8gSXQAwdqhHK3og5UnCXaZZ47JEUCNGI/xLLIAWVkV
eMzuJ5TYtw3RSnNJGTn+OBtLzCZO9Ab1PDNaAL6TUSRmNG3U7qguHB1x8EHa
QvJ63foKdRBF4H5FFw3mi6DVCNpWADm4heiPyalgXh4cDCGnd6vNGzlhGLxk
haayAm22Ezs5UY0wN0TZvL68G8hSpj8E2wb/tRv6hTktaeKskugBTBlWmo4D
XXQZZLVEA2s8LcbE0uBFPGwz7/hiE7QjmXcp/9QXZgqnDoZGArXeN7W2nfeB
NaL3Fnsrjbp8iPFIT22elBn8aDhK+bwdBhiV7H7Y/Ltx9m7qwiOhM+c+IHfx
mlD6LtAIc5mG6k0GhzTzOcBQZ91y7g2jaBXR4ESHydfo7OyL86ec/FRBEGRW
55UoTyfj7g4N0sE4chIbriOwmbH6Ar4x43oNcleigB3bczU617f+bm+N9zbv
xgO9EqNQ4kfpemSDA47BjEDd9m8PnueEtKOIFIpqmKiJaABJLHIfTBJ1KyC1
IoEC23aotVA6g7lmwo13nqi/w9136TSeIUGeosXvzgghAv5DeF52o972KzQs
HmhJryjYKA1/CIJsA490zvalQa2A+u3R6+cvX3/H2keBI7DuJv7KJ2SMwUkI
n74JFnMjrRY3NSJT1hawV6Dm/ZLok0B6yVu7FAAPk8nrkLILNLuyR0YXTpNU
yiUGhfZEDlPwuIiCFcC3m5ip2sOBmfHKNqvSpGTviQbQFV0TdhNF5GcrSS2L
gnLSlzaPB8b6KLWvGO0skIpunWvgaAppKlayZAUPDfD8QSnqMCf4tyPyrcy4
whsxsaKBhfAXSTwBbGnPKN12rlDveuzmuuYWQRzTEDXiDA+LUgtEFSdTzBDZ
C2WnCLeM6yBixBL046M/H37/3cvnT9El+PTHd0enb4PeoHpyOiL014PX3x2d
vnzupDyPXU2k2yEBqRbNBYgfY4VZxo9Y9O2gccvoU47m8x1yHtx20cAUJaEE
LUhHRi6G5AvV54Jmu+EwTtiYiD1NTVdFzgflIYMwAzK5d/yQroIuX90Z5bh4
tWb3MIbakQ+ZTzeglIIsV4EuLs3Iwm3wLD1sESfB4Jhleyv9PVkT4113+AG1
Ekz5RmK47CC/izgGwbOAZABpDJApN3YB/4W7TZ4fBaeYZIwYW9L1E8LkYQK4
m2u+m+8PBU+4le45+E2J9SpXsGa7Yb9fpkWm2pnwts/fzVZoK324uVgsSb4j
1BeON1+5eXEtDKqLeocq8j54bzrTcmy6yRQ1IhEbUuYnRHiCBAQ3OtobTzY+
TyTWdV3yo1kUyJgwMXF0+MamykG7vdztKrwQaudS88V2gPTlkYf1znfhGLvJ
zCDGR6lbZxWtRugCzQDvYbZdBET5az+u8ql0zJTognfdzJhOBMZ12PHRFf6R
XItSUwUsgwd6abuGaLHx6WdNR/qCVTmCvGEcUkUqvKm0dJrDy8WVAAN11oPY
qj9ju8J20AaGCTDFp1UGR87lGydi3yPBWfjC2c3FxV3y0Yq10kooBMRSQVcs
pJ6YxI3KJrhJi5BmrdsyLptD7BqY5Q+RlSotGF0wnykMfCMI84VLlHVXkwxE
aBJZxRkmQc+GyMMYxUpaR1iuh11HxFultJ1j1uwcazGKD+wViD2tkuj4MCxF
8NFphxTaoeOIpLggJuImei8PXh9kDfTqf/+n8IJmOkv+9eeqcv3OvDlFH36E
6NcrjqSdAOxxjGVe3T3a921RAEzhOzFyzq/kp7Vikc6AIGLG4HC10CAVKx+x
i8AfacNDj3vh1z+TgCpZG0d/Pn3x8tXRu9M/PtFWvuuzxSk/dApwCnd8r//q
J1G/pnAF/vPX+o9Uxxb+f1gD/afvg1H+1/qHjoJ0f2Qk2VD/NbxkOp3iVaUB
hH//6uM3eD686uTb54+/op/iHx7XyX/+Wv37s/qf8pHWYOX7/SM/0AOsFlTe
o2yncLXm28VkDNwJAMrlDcezsHWVbZ0GPkeLTku+ik9L9yREso8PD56envzl
7dHpDwfv/nD64sWTU16H0x9ecseqLb84+LPfn/iFuD3lMetOlbYp7NJok7C4
tk/bh/zX+slXdbZfr5Ld+us9Lzn4M73k8X0v0c1209a93jDrbNszni+2qdhM
4oOeJAewidS0gKM81aPUPP/nR2xg892mmYCjjxy3IE/AvHU4mIbnqx//du/r
X+99vSeQPpFDYf7UfmooC6XQzU9fffzqq8df0X9+mqAFiLK4W1IBC/oW7SSZ
IpIe+eo39MjufoWZwYjEaoAF4By0TWv5SsMhQ6puW3Fzd2N15G6w9LWgNQjL
pAMjgOJ5dzEd+yxHxwfvfjw+On3+7uefKylX1lYvAKlpzWDcCWISu54rBCsy
6zW2fyzcL2jBo9LJ/qPCXZsg2X9Vmqric6VXReHfNsEaykq3J9VYD1meicEO
vXy3QYYuuvkpiZdJuL6I12CrYI9kmhxh9vZuEU/lZi/umok9VeOfp+KZ2eUj
ikelOBx6L7+ifg7s7a/58eSfijv36Tvldue3vxu97cXBycnx09PDNxRbOv2W
SPlO3738H0fJ9+IuoQUHzfrp6awnF/EUh+iUuBfoWMr36t99tfFLZOYdPT99
fnBygGts+0coLNXOT8kyOhX2irj3tvynUfZNBniH4npulQLHkEa7+4UR9RLP
s2r6+om/z6sj6bBytOSlYC2q190XRk8sEoFD3dRfP5mSmoRiqFgdmnvQCl5q
xVCgM9DM9orlkBY6XLwpWKZWvw1bJd52U/7nKb8p3ncAFv+1fnuzIsuS5I2l
HdBKbkiK/ROBgWrMtxKCByt1Xu/cLF0R/S6e5Dfg0cdT+n8vXrhH30lYe6CS
paB+/1q/PDp5Ed74oQs3iD4adAQ9+iJ59Ogj0dMCNb3Q/7nOniTlEp78Tfrk
H8PShTtnh4KWNMgX3SqY3ofUBpv/6zuejrzkt/yS8I4j95K3wbEOeuFLLqgO
jkPY1L9SDwTZ4kaq+gXhIO964UcyXsB8wb6yT+M/6VpfX6OcJOzhrv8DXaeC
kDZRiqckFQXTkEXh5SvhmH+5I6IKId19JHhUHsTjb+iyN8opL9Ryx+/E+ehV
VsV57Uq8ZzwDxr4LUr5fMteD0JGtpLD9TEApwb/9iRoCneoxgE379Kd47XKq
gb8CX01dci69IyTGwOWKghGnqkl/pqodDR8dvRYlSXy9REb55vjk6DnlH3jV
5KxwO2SeFucmq+SMTM+7doGuAsEaabm41miQJPMw08sdHcB5NJz4S44OL/FX
csa4Y87RMhn+EPUGrfHZihrZoJYXBpd1MjpxDJ4ucNEt0e8HyWAhfL6i4AIx
GswaLWhDVrRyBNEA9zgUpvvgIq99GKC1gsGn457SuKf5GCXTY4tDjlzUG2Fx
EuWwk6iQDSvDAcR5C0JJ3AIEKjRCUCSWGOG7bNfT56vmfF2lRNjIxpsCzepM
eBmVCJsXMuwmCg/mVJO8kHVKJ1qvuXNbPlvWdpXNN1VpO4nm2zBhyeuj39NA
WKF0qD2qLNkmMqLSl/nwUK7ARDp1c9VTyW+J/5gQmQQqoQiN1QKt8+VJ78iC
4EnBBgVJKPORj7cZj9gvW1TzlVfzYfVKunwnUfwb1lBLWmgtUY0kkdoP2A4i
YJ31Uu1QhasBRmUyPUd0sScAcr+82CMOjuXrGpPyWP39tC1WOG2gOLe2V0Ol
kbsUEE3jlMZf2mwY+Z9YyBiLBwDf9eHEsztPMCc5A9lFXSkJy5D5mko/Kdp+
dRGe+Td5u+9MxpTi1U8vXvzxSVS2B4c/HJ2+ePPm24Pjn3ZH6FH65M2SO5lV
TunTIuMeUbZCKkcXkqt5RiPGFX8PuQl+2n4V/LSr7Nh2C3NfHkmjCtBFa7CG
K6q3TKJX7UjFr7QFaqxNbhjfyk23UJDyv9r72vY2jiPb7/Mr5nI3j8g1QIkU
JctSnCxFUrY2osQlKdvJhxUHwJCcCMAwGEAUE3t/+61zqqq7ZwBIsnP3frjP
dZ7YEoDp6enprtdTpzyKqhTxtwqrNZbxZfFS2w5aovL2cExDVtH2vlf4R6eh
yY5j86Ac5I2iIP9k/+zs/PvTN2+/+97NUZjzQbjfiKVu5kCoJzAjPzt+CX5/
sOWvuBBV1Yppd1yXcnr7xd7vsHNel03idoCubf/Q5/ry6Jx7O2Ytt3duuhIt
229n2bHSgN1u6rJ1Rjt+8x9H5+dHwIGcHx3vn788sFF2/5nRXr95nY74c/7w
t4x2evbuh/3Xh0enx2/k38mT7v2m0Y5OXr082JcDtWQ1P/ot4/30hpTwL8//
3Bnt8W8Z7dXL129/end8+A6As3S0r79gtI5F3grAfoHH2dmsHYe21QJ1P2QA
3B8NgXiH1cUmX5/zhtfNLUvn9olbb7iNHIL0WQzSE/56Xa5IXuxlq/qKJiUO
4fNuC0prNFqONHvGbqG/pbuoQb4/5cKrt8NGuFHJZ8p8A4191jJZTt051Jj6
zu5jZZYv88NSqf9EkplfO6OlZ73IvbGyKA4tB0oscmoH9vAEmCJQo3WMpUtP
dsbk0Jda7ERXtY2RZ5yExlWLIfQNO3t6N7nmnS6O+jrezqp9981gOyU5NBsH
Lmb45TNcx0TUgPlJ/iIkpkII2pmFx3dbOrukASgaX3nCLQSCU7OsYZEBYSW6
+ggBj0rRrJolTRAZySMQo0LgymJ+IwcB6JtxcdNo/83Cm5up3T0Nd1bgWbw5
9tlL9RA7k4JRZpgc9hCn8FhxgH9RZdZRX+E1aLu3n/MDdshVvZYqruUcoAmz
B/y//GuKbHEq7qKYWxqA7XbtZzuqBX6OecMvHeAgN+n5GwZ48eroXD443aNG
k//v/soBzr7f33302JWYDdBOtn52gEc7u661RNfs/coBtAuuK6ovmEHQLcvb
w1WM77H1olq3HbTJ8pbY1L30YCt0xTFXb1pnnS6gIRNunagWsclggoTRTmvZ
l/cAXdH0M1vf9NPbdRLdkn0GXN5tcap72B55Z8uxT/JxXz6PeiNwD2iO5+X5
2/4Pe7u//JJ74P/J9o787/H2rlYxEbIuoyj7jVxzBN9qWs5x8dHR0ZMHu/2H
yeUPt3e3v+nlJ6+/0zTs7oMn+Hp/Oi0/5gas+/u4GqhC2fnm0QMNlBwYw1sW
ez07eQTSGi1R33Ez4X9nxRVpYKaEwQRdABIvoyBEsKAe303riewopt32DnZ2
Dp9/fSGOXKCMBfGehuAuTSGDDhM/Pzp8/uTJw90HF1vP8qol+7S1piz7RQwX
XjwDDFduJMbcym+rKeRvuM0zl8jhE2W23OtDFOYXLhkvzJwIb1d5uAbVFVq0
ioJh5/orQpAOlLfMhOllTXoJXLaYVuR6JbEZoL2E1gaGp8R6yTe1a9W1bEt5
zK+siZU3mCb8ObWFVH/ea7yRKDxVDSv+Xd4I8o4Zmd9bzeNJyr61kovfWtCs
2OoHVNLI4Wq7ItHMw9IapyOvCvwLWsz3AWoZcyuMYmU2YOizaX5w8nblOTrw
g7TbPUiBS/CgQDODqZhNybbKO6crpIR3A8PLw693HwCWIDafk94N7pKfPt7e
s1/uffMYv9w8Ozg/Mf+ROW2rHzk7O9qTQ3o/2z89/vAkv5+fvjw76P9gEz3I
lxdA+WgC2X2z+tStPjDYvTtHhwePX+ztrDowWfvA4OdPdl88fvj86ydfemAy
Hpj8tx8YDQr/6hOTL52Y7MtOTL7qxHT3U9TstqUehi31lxdn6M6KaubZXmb2
Iekdza2JddFvRPbh5yAegmmoHL2dAPg//vHm5Oi1/KwfbkouoZYcyH7TU6Fm
EhT7sW/7SNm2Nd7m+C5Fb+rd+L6yzY7kCAw6n5YYmUmMrVD8O1mM5yAqxuHY
0x/37NBrshF7Qc69KHYU+6nQATYtIfCs5mJV+Fs3n+gWfATb2cqWeI7Hiq2S
/SmulXE6eVIPdq6cqQhMo1DDQ9n20p53dh4IlZVFJTREN0J0D7YzP6d5ek4Z
4EJ3rMd7fBQ56Au5OU5uk1/sX/Syi+cXvfziAP86vGjhMG5IwDsb5Re3lXzT
ZBf7+Vffyhyf5c/xh/1n+QH++/xZfoj/Hlzo/O1Wi6nC07JbMe36xSywsnJZ
O+ev8o0xhQ2mjTVwv59/lnvJvw7wr0O7AZ3H5EkQ+3TGc9EeybHlbag7UDbN
iG84TV0bIduMoBg+9m01Aj1j/FQHncrW6QF2OlUyCpUxW6t8tu5BNwvcTvme
MrKsMLEz+8UjzShSlH+/38e12od0vw9D/LporpO25l277cXLk7P+zpMH/T3A
TDQGr/KQy6I+ZyNvgxAdMeatf3j1oRw7hH6NiMSd7cFd/MSlzp36mEornYVb
gNlD0XWbqEfpszUKxJOv+iVyGkYizQ/iy03e7NavsV2yL5bE5qDY8j8OYtg+
by94d731R/2zk6MDaG8rwvSCN9v0vmrm8W/ayEY9ISsH4m7aHqgrBdNAOeJ9
e5n+tU8svDESKd0Ff/nTmxf+epFNZrLFXjEW6+ijZkz79hu9b89u4H/zkqvO
fTCdJFrQJA2Pwu6DAPo1tqT6/l0dskImuLTg4uvss8/sufabCHCl7T3Cu2OE
zZrFekTB3smK/q4pILodf3DKB/k4aj7ri5cpPbdTY3qi5eXrH/ZfWRRug9GL
DYR1FpOp7qO18RDoroR7P5BYjxLGBTDsFPOElzLZrpoCatLKiE/5joi9slFj
/8T623TDru0WPL814Lr6Hsvx1bwVX43NkN7ZBJQSek0HRet+2oXGRyKcdT04
4StqPu/O8JDLvZ+0HYq+GF30IbNHU1CYa58WnSlvbYL0/14cNotx2Px/KA7r
NSCtlVgfitXS1k/iJ7wnZi8P7WNaodZe8DAdezLvWWMe7TelVVUTBCyHxqJt
VVmsk5E3E0KqmuhLctVaqtxpphr6pHLktuxf1ZBq00swdVa4qv+HtZ0e+ZX1
ijOmyf4ftBB9qdeO/FY733Dq8N+mo761yNliZLlo5+dV0LXGsHqlAdfJHrL0
HszrJumCLc89jjx65jtG87eofFbYyWVSnmNkKbZDyBDJcDE5bEF5saZhoe48
KCm+X1wU+G3+dHggZsJ8uL3lTYZLS+l3bmKOB/Mo0/KqFi8zNKJAmxU3l/PN
wtabbyFlql5xtZVSut5Z4g91vVBhVQOSg+kCb5vqS/jrQuWtbdaOkn/mnyQH
HDC2acT85PTNmxfv5N9AsL57+xr68+WLl62cJUPneQvt56ivVK90z8LPy+N/
v/8OJABvkMR8d3S4++jRzjdpJnlNl7djtiCsZ3eooQ4uWW7qYyMJGrcXqhsv
Xql1Yqh4PziveRgBamcU7Zal8350cHi23z+hmT6+yvtf97LTs/0zfHZ21jfj
n988/HorFOXTodNebjeldpJdI9dN8LOvkGkPVRMKqHjw8eCB/gOllcAtmZpM
QImGE8rfaqfOJLK0F2JQrj7iwWyypIJAW1Z5PWZEppDBLmLWegbN6bu+6CG2
fWP3DwvrnfGWgEVaykxCAbsjA7mGKgyV07n3oUwxIUm1n5q1S40tlX9oWnc0
QOiqELr8TbQS7KfDU6Q0HRzoIu5LYNUd0yjwZWvBCNB4stHYfey0vEn7GG7K
Tbc0TL736IG8khSe6DPoQFh2DcJiPpyMkKUXkShkUHLfLYktwr9uC2tKoSsE
uCz1c+Y1LjON2BB2MwdXqDeKJ6sDTiaWFJOBKRAAcbxIFE92yahJ11o05u/r
cjzOdbqxyMTugw7bbOUAu1JJukTXi/TpY3RaEnhLv2KNsuy///u/9abZv/yv
+4Nqel982yvR2fm9/8r/7f79+/fyf/03kUeIF91r/qif5X/8473uZ/8qn2Ew
CqBkzi557K/bzbXCjtkgquedjnmqw2Nr6xl9QcYcz9b1ozwdJgsbOy5js+IS
bPvt+cf5RsIPnLyN2cIog/XmRbO07H2jpaS2ievVXOdxNvnvc79P/gcuN2sb
ml3YvvPtj6uWxscNAG77q/FXd1cs9ri+TCdcNZrNZuW1mCFEkwzGxfS9l2ZB
TJHMEvpWLMfxQgN/BldOI4Ab8iY35Ck726hJDMOly0il5EcqljhlaYmTDPm6
nptZMddjSYSjC4NVpzFp6kxcTRYK4FkIsr2bTy+bPVtgfedOuoGM2qYmx7TX
m4jSasyxVJw8egwe+a3A3KZwRuuWKcMa1swgiSMH2u71lBIelbyXl2KVyQfq
OO+pOdbDBrrFGZb/TlAzfKUc2DYgpXnRZAs58Q933yl1GP7yeO8dVunH68oI
hLlCiOKVbKBDwDeFRGHcyMmzakoOcdF60WRc12ZayVXzxrp4W6CqmiVxLry5
IrIwyw3BgNnvkw8BMr8d8yXH9cIZrjsNvxp+94tscYU/lqNvNy6LcSM2iW7N
l1OZ7bcbYhGXoVZHn6v62GK97fDo68A6yaVWWLaZyGWLnmviG3nbLFGQWhHT
s55PWKxvkMjt2ZGRQ3xjriDgmu4FuAnN7HfmEBOREkpbUo/ULWSfAWfL50YD
RLQhIWc2AEbXa84BOh2xraxchjL7RZM4UGAGLG7AOtJeEnr8Ord+UY0QjmEo
UKMeja3qKJ4JTQ7JU1rwQqxu2cabSw0fWn+hXzh8N5LBDHO6teIVyvt6k4B8
jQQj5pvvkzrIuLLk9q8UKa7kKN+dvOo/3H7QFzuIdh6qHvhDfv376/n8pnl6
//6VHLDFYFs05/1xfXV9N7vPB/gDvIPWjuBlF/ySUTI5Ii4OvG+ebIM5QdL5
gYU+SF9gp7tYRWChdNFtCmwoktV6U30ftw2JYQ5BwYE2fAzbuPEN9fEucG7V
43LJfer8ZoTiBBn5wl6PPqu3TEMNLKmhqgG5kEw84YfT4PeOQBuiTcWUkqyc
DavGAlJrnkyXgGQL5FyzpSUDlMYvGSRJmB16Cc+g//nFy9f7r17+5ahnMX58
dvDm+PjluYOyrmWj3/V5H9JgaFPSSC6msf+wiK1DJJdjWFLf8qT5k40CIiyk
mAJ2+LKYVGMNPPVXEFMkE9UPgFm2xeY6Tg3a1idxRJan1BjOdmvvjm/HgdSs
kWZ4ADEXTH3tc61/Ku21i1RWppweOaozkYi5rZcf0VsLl32VVLe1Tro/llEy
0FfOYXM3z9J7R5BNK1ACcDejFHJdGwIHqPukJEIb9FLjsS7tuaO/U0I18Xkm
pNvqmaZ1zjh05Rqj73zkntCXi7/PlKO0AhtoOZiB1G/G6HmTpjNSjraecv2l
ywuKktABu93orM351M9P0M2U6cuIdgqrwo8wbdY25Z+LIDN5svo1h3tVUygT
6/KHiXnXChBecx7awXjTeeLuy339aB2K1NUjhZK17t2Ub4zMKX10ZOell3jg
5m46lEtnJWG6cGmGM+QWmuKyBHmIzI2YZKhEfLsOyd1bj41HpGodYLt7WQt8
vXxhG4fevXgZQd+z7fNF2HhSM8kuThbOLlcKID0IiVRxQHK/7TKzewqE1nV1
g+3X6avjFE92SkN3KjNpUhtZj0+HCXOpYcnmEjtbl5xtBX0Tt0g0OxBZ0CDe
XTlPVwAoo5TBKvRbjV3p5CLWaI4+vAuT/FaX/ODNW9kgsuRnf359/v2RrPK7
ty8Pzy6cGTW2XcsjuWfKg00x6i32mI9vLG6jHMVZ4AoMy9VSm5NyVBUadCSj
EJxA0nsdPEfs7ac/u7ynoFhajxWrcZaIfR+VF8eVaesJoNKD1oY15IU7E8Tx
ZcPQgkEAsZgNr/t/W2hDQr5eOAlmvnbs4KjajSkwsVJNcTQeGlDxNpBVvJ4U
s/cm6BYT+QszyXmurdGUSbjybrK4lsY84xhU+XL34ZzzVaPs368mRTWGlYYH
Qzd6xUuoqbe4Qrh798HuY7NBX1XTxcf8PeCQ42WLQ5ftn7Y38/yN6Nn6sj8H
wNFuNpGHAdGreH1K+ufcTDkaRxIDrpPzbr3iao1ornfsV5ivu9sP2lbreX2D
HpozRPYBdR2+T6TEuluQnc3v8kwd36FlzJhnCCQqtrNyPhBrAKmhVtjB++gi
DFcu4VV3u0/s3ovL5r44s/ex9AxHfNi9f9HC/rsiXmcO+pT4JEa9F/sCWpCv
HbTU2AEdJU2NaUG3Drh30bOmTH0kc2ML+l6uVM9qBWnBhm5V7MbIPRbZhbuc
sExS0KLsmliF1imIHEa7iPYiwTleZpTplsXRWucV/+cs4YI5vU+YglQ1K5WQ
uT/Zsh/zVcuHYf85QyTtnx7bfiRjNn0CjPX19m5/NiTQxKzjT9lBvSXjDvqH
bwZiVq5DX1aLDdFcShYIqbv2smiWL10Wy2cdHr0+O9J2VBS8Gm3B+amnqFM3
0bBsT/92CyYxUpbskLaZssLEaBsqNi2LZW93R1tR+QflPCwuL9E0HLt+0/my
+0dvTl6/OUdJ6jM/7CbjljTEZSlygwm1Ph23h5yoe8cp3SC67xDfgWnSPu4u
YZtikx3J+1DOfbxmeRtqOoZ+7LoFZqaerSY2cNDr2zdF01Gxz9RZ64cB0DlR
6fUvYZ1ReyPCKac2GLWBS4lbOGlYkJjzB9FVbvlursTVOubwcWadE2kGnC14
kHunbd+P5kCEB7QMgNa5Za3AMt3sagvhUGkMNCFNioA8/7ElEqxGrisI6VtT
EqaaL5Eb8c7/tIZfqnYne6hbHs1q5X7+mXoFrzlTdw3REnk9tyqdMxZdxOUV
+3CmcW6Phbh+aBkfFrdxqY90g2fOlw36pMfdxFtVdBc5xklgeNFhT0y01eJ6
uW0rqGQt16ox3OP6r+V8bnGLhAMx8hrGAMEaL6Vo0QNkPmK3PykMbaC4+grw
YbcCRceBpe+zAgv2/Jd4WZaqjcZoswCdJ0/crXMHaGhbW/9dLarm2po7N95G
7rZUcfoBAW62r5heasvKhLGhT8V2WIOEPLPQBB5Y9HQsi8Kg8oGCgw9O3orG
VMJhkQTTEVGv/I3aLsFr05iE/qUX4x6+5jeAoQSSitP9Y7l2sAB01lyaaU0q
eAwjf5zKBhMp1+kbY+8cMrSs6FVRf1/Rq8CzYS21LmTefo7EcLC5B95UkrgW
UCkcDH2ggkaYgGnBo0vanQ63afSnr/ZfQxHGgA0aYxLI3IelBmZlBhPk7MiE
LOpkT6aSuAp62nYBQlHFR23I5G/H0qxoz1ANgTePPdD0dWfp200vrAfNEG/h
afJodv9eWMyi9eY1iKo8DZfe5hG5triAVnkzz4ZqJuXW9c7PPvgfYJJ7C9n2
1lot8Nq/iRIj7qN5/v7bPdlY3+72AEb+U/XcGGqz8HoSobAOd0PV5OAWvkrw
kU2ndKEXM+734ZghvafswQrNKMuOVHsBb/SxzOH10ZvXIhsh2cfZxyeP38l8
Ns/Ojr7a/+GnXfli//gw/0uJHP+kHsA8Tr+k8C2njnrN/McPRSvOSFRvKesG
OGPg+JFBjI8ohnc5Nx6fR7/LrIW5PzhMm/3w4yZZERf6fExtCaPP2YuguT5f
UHNDh8J0JzUyfz9DirRkBmZWf6wmxLBTDhH5Bq2UTYqraTUn70l8YVoGeCmq
EjDCs5fHhyKTQWRMueYzzDhuMXSLpSty7MR7R5VS1eB3z+83imJs0L0CLQxk
Kxaz5MFnpRdk9rU1oA0B/LGY6iPZXk0mQx3LUCx/lycCBrA/XyiZiUd4edVp
WY76Z/W4FlWW/1DgPcifRlE4dbcc02t41Qb01Y6gd9b80ltKQclmBoyER4kn
0UWSF4TpGxu+2nlX17LyO19/5LnWbZlhV2pFiH3/8Bt+bxv0TPbgQxCvFZAb
obsR0ZF9ywY48kXpsvHchtNW5HTBd6c6sbkW4T22aves4PZhi1BetXnx4W/z
wXjnb+8WTy7y+/nFDX4/MDabppqIIdgl++mzMUJ9M5dv/x5j677uHb3PshGY
fneYQBmfem/7yaP0uXHseqqGtNhwpUo38at1ay6TVe0gOyZ+BWMIHqZEHK2S
YxaUdob4vkurpmtKeATL+7LgOLEvFDduVKF+DmnHElNvpDx6JBuXA4ntQxDB
GI5BoVRyWsuWW0tVMevQqweZV5PGMJA7iKbOqKsltPL++9MniygDXNdADigz
Fubz3YvN3f96shVHXAuDBG2PHMObQlMIULdNLw8W2+Aurg7dpSUrLTU7eBqs
pyYnKOeJxQGMQ+yLbsy/zXeefiL0jsmf5GgVQ+Pmsy4uJdW3Oz7/NRd2uGIo
r2GhrNyJWdJ4FKJ3871mpLe0SGw7Pslu90naPC0aT/7kTNbPgiZuvnYWPadm
ElOuPaTR+GoGU2ToEFla+dmJmJH/maxTswRlUSKmVvIoECGN4an0J6P+rKhG
JCmxVfjDt/nDpx3VDwfmqnzWnRkoqYA/YIuBKSStchOmMlwc/Xk90fmZJTpM
9z2M1uWdb8LjhubSUNu7BfBPlCFO6Kh/93IL6IIMG9s7VOa//xaWQ6kcWRhK
VsiLG/HGrOCX/V2V4YRbPuIkZ2VYOTv0LaNYWyqKLdt3tT7um1WYN+LW3awx
0dKLxPRtWZrwTJRzVq0UuKTNUx5YC2Lzsk1zNlv2tRhF+F0rS6ES0rK0eq0D
TEKyck1z9U7ruBewd+jC0hcNHCowCxJ/SozkLAMCWisnf7bgiMZMA7jZwmZ5
4I/lpyd0cusbUNeDdlj/iX9K/ln5YetTGUL2it/wxYsPOwgK7uTgkrYPSUyy
CaZcxNC3Au1ImKcMMWgP4aHj9hCXxRQFX2xJtLU0xDAdYhezODwrm/ChBR86
EPL2EKOlIU7OwkA/t195+OluMoTsOhQHUrtyb4ZUP1tT+Zn/qGZteLkfda9m
EQngH+WqKhlFCWomcW4YJUv5NKzcHzOQw3RcsnBUPUeLsFlN3U5+LD7JbaG9
y30jFfkmXkBvRXebradtU1qEy0M5E2LhPdreoTXa1czbycCDMLC+2hWjfbP9
EKPtPNx+8NnhhhxOLCVP1VXog7li0J0H2w9s1EefHXXkoyLil77tVQPLQ8u4
u7IEq4elkEWtx6X2GHxKYqK2M0IJRXcE+a7gjWRtF8fsqSVzCuxJxY12wsna
I8vsxKykNPCL50kMztaL2zzU4W/6H4ZbYYOg1jJxpeMOqi2MNa9vxLm4YgHX
qJ5UUydD/YLgQhbEeBpaeOYPmK9y9TkkdGyJhFLG3DEEOZuumhO5wrHHu2iv
ECkU+4jPh/pzFIlPizE4bWT9+v5qsw8Nt1E/7KFQSUtIb9Lbs6MUblDmOk/1
vUzlkN5MbQ3k7BhqaMfMzbimQJHTyeUlU6DPKPcPuB7oRvSF//ycT5r7uJOJ
upVy/ZP/pJc8hbB8kTjI9nj5ZnxlKqTbc5BFfJSI27W+qTp/NmZbXm9/nX/J
CC2vOt9EOE9cNSiNx49bIj8IvqeqeSAqoLw2xZY6OujlbbWlAn/n0aoRBk/b
ustHMK21lTzFN49WzmH4VPWOHU6ZChWPwdZksK04wu7KEUY2AuSXqK5N+X+8
qr2Sj3ce9L/Z0UYnXn3jspVyA/3w2MeufW7kzraVqkY7pWXlSgkxFpXXrD3M
qCmF98QiDOKrNUaE0QOCebAYXZWas1a1xmDMfAEeho5j5ZE3syAPLGqqBejz
GnQwMG/FllyROlrjQq5FC3awgj2DZwU4ESm2sos3J++WgYkX4lnEbxybeJFA
JbOVrkYPujqG3TVbhNLWyEWuUiMNMGo4hJLmY6ma/kWwMZ7me/mfnmt4Uv4D
Hd4Da/zxc8+4piDEp+sPG/nRNd5BSBColcE+LkYf8bkxtLYlI7/C5ByyqDa3
LirZkRCNR4zO2nnZZ5z3h5Y1hGAK7azNJw8UrigrMEcT9+xsCdeo3zMy1jKf
guWUpSBJUXpmOFlmkXh0VYmyRKdn+d5Xu70482yM3YbX0z4qMrGJnABc+JhX
dk7SN/h+OyR0koUrkvRiV5vhRh1t/zVPDV7DNw8wZpf74tSwU9AkI1M/JQHU
FyN5/gJMCjQSeDS/SjOp/OSGPgRirXjcC4g2OEdItWx5/ra/EoULbYaQzlzT
2OIEJzaueMO292ZxghQrytxNN5N8CK1QLZMh1+IGzq/vXHNexvXC2JiNx6uG
AEnOZzUJ+YD0AEGPJiSuZ0AKbTgvse14ncyG7D30jIWcwRp+bzec1oTd5hrh
YgjnLn11IQB0U9xlIL9x7AwfThnmuN1JvHdTxRqb2CN6y6SY+W99nkE0yJU3
1QdyYk0a1uWPmXwioxhbgOCLNBBlMQ1CeXhdV3T6s2oGVNOHgjmHl/qzZvl3
eBjGUZRlHNX3JAicx26GxW3KX3pTajZkXdJFZNKLjozGPr4q6wkgCsyIfTo8
ZW60nyJbK4tXZGmDYUSFJlvP1pMPI5GFmBuNl2efjqj5j3dza67XzZyHZJ6F
SDqBK6BfIrBU6+XGqO8psrQWQXbhx1X59JTHxzMHc4tk8Ri8V9xViLIkgSEN
tHQwDyH/uGIvN/CLPgHjXVqpFUDe3wrO2ZLjAtrJYTUbLqp55/wR9WRuTgns
yRcBhbX3dj2bAOehloWhktx/xuio3pL31fe9SKMSjhxWCUoNAuxJT8N6e+10
P7FTckD+aqXIbYOBqBrL/XjTh4lYqUlYeavF6f8+31SyDQ1A4R3XLMjvFC0E
8RaOe/nxugJaDJN7s/n+vx6iZOFqVt+iG3Wq0OWNz7DVIDK01TagQNxVt5XG
Em0hFFbWqSUztEzc+WsPGZKlU5baap2wIxuGnztx95rIPJAv43UMnBVjIC28
CMCT42pwHxHZx8RMbv7jHxy+j7Efe+0gUhKAe0JCdTEbwSZjtPhDmUxnqRGE
ZSMJMXXeBC91388vFwBCBQiFJk50HyBpQ7uGWa2G6ThPlcMmaXqsk8WnbrB7
hjt33V6FbhQRxBSAkVmcGKvfFPizPxteVyjZWMzkneDlmjH0NNjSKqfPg5zW
usEivZBVhHbhqtpBU1LYosTTkqmlCqfO6yWKxajSUtTmfaPMFt48oO/a1aHS
ldiQG8QYcM970Pj2moBi2a/X+PmVfJfdzmQJ/riRIxbPRQiSLqL5l6wtdyyy
zdV2mpiClLRPvtq1XgnxvcpruWWr4QwEfW6QwiiAibl2uHaT3sxsYIvFUU5x
p0BGsQRPjk48+WY7zRZTGLnyn2xaV1qA7DZTcDXWzkIexrNk846t+dXe77wt
RXNdXVo5XKKw1OpoTCyg+J4ljRso1Nd3mNlaD2VCN7n122GfY+zUDSvHvMWD
bmgpZgrbyYI8RjnRBNaeVh558+ntDT3I8ZPc2E8mZCmQ1+FRmeFqN/EZtlEg
8dOfWO2NeAIhx+d0vVWTe/f3TfViHz/4XfQXzLF9xI9o8G71MjdbfHgW7fRR
tJOPFgF8xx71XoBl1UOGt8iSDhz68vqkydI2vg13BdtwhDl+9fXvsMpf7e7+
DvVfZrdjIl/t6jc7D/CNqlZqvxmTkkjyGyiAB1+7v1LEiDilS1XMxpXWWNIJ
rmcorcpEzyxu7nnhayiQYcyPxTqj0UypKwMNiZOM9WWrljPFxza//PI01N0g
rpik9LWgRuFd+Ik1jx77xg5cHXmijY2iM8B2SGk0BLkjztVPh6eWQBvZwofU
TbLm7UI1WeeGyIgsqg+NoujyuWdjheCd8W0+Wtney8Ibi9ZiDIG0EGzWyMb9
n+QNZx923TdyyRDBSaaH/sVaGuSnxsBWwsk3krf9ZP1N1K9+N+vE/Kp68JHe
L70+D3jAzBtQW81A4JuTA+HhlVYrsFUl5KEEZnWxddDkbBUWSq9TxoKk8prU
tJxyXy4CTU9mJIVpO7yIL54ptqf9fKzMybDdWZWTvK6pct996HbcUiVpawXp
tKaW45ZRZ3MeEc+G6k5CJAZ7zXYf7O5xRYHztfQusRd4KSBkLGex4a9or/Ky
UqnI58tiST3XK3laZAfIXhqfVx+XwZD4OrP0dfYS7gk/m8Cdg55a+5IpbkjN
Wzuy29lbSFHyT/JsXd9ZsN9hWLCjSz6V7ZqJaJ42JUDWogRwoLvvyVDtA+MM
xKcEIcsyaA8uCGS4uvSqCvDqAPJiWyD2QlR8JsUJi8Uj82BoYnYSBdH3evBf
cqHyNzeFGET5iTLBrTefVNpqBsDQyyq/kE94rPySS+LPZEyhPB6ykHEfor7l
vkL6a52CkdH1lIfoBkS8fjqyyBvr1yvSX+Q8Ma2qfCf13Pk2bS+QzvdppnUM
uCW3k962mF0ttLYedIJ3auogPGXzwd9//4cLqn9vcw+W0MPTfFaLcYHNC+Wg
Ek9NJ4q6mHQ3no4gPt2K6KW1MLVXETg5Xh4rldnmcmrztxRPoJ3THTCCB1pd
rucZSOyk7LbQWqZp3hoSWST0JhtWN6QkbVbQGLSsYfJtYXC1PglL43bgUIt5
1BhhMRBBrKZWJQUEX+etywtPCUosDUxIh/eIiDPKjNtHs1xzKD0bbzCuByH+
EHYSUZFzFZRK25OJ6z62EXz/ggZfFAcKU0jlMHRirNAUDdsqHPZBOSwWjSKn
oAACf00RhczK9mO5m/VbgbMJRRZO8uItzQD4gy9RjwAznpSKSba+cQqGUxGo
VYEWNaHhOytjdoCRmcQuYF1L7i6RAdVMkGFjwVQoxiSedkMuNK+lObDc94dM
KKCELBOG54DGbvcKNNrCOwOjyd3ugRdOfcCEbZqzPMDJVEirww2oD6w94DAp
o7C9hV6C3Amstqsai0rbm8bhhb3TT+mtnOnVAuCz0oH71s07kCwSmelvSQ+Q
3PWGEFTZGvPhdZqR0ZeyGI80Kkz3miSSRkxOrayNCG/CC+ez2LKz8IaAQQ91
8gVP5KXJmR4srq40cyFmBbZaIQbEXVM1XiYtrspI3sig/pgbXbsGmscEWdZa
7grwcP5+Wt/KWbhySrxU2g5CNEmtblkkNljd2X2Qb/7HQgaDpt/iySDEeDG7
LIbqCI1Fu9mhc/GIaGwYkiAr4Lwm8iywqrNEihI1G0u0wnvVEzS4M8gx90+2
9E5laJuRLFXJ/shiidYtVyGnq5A5h6RaUabZURDsrPeurIfD8kY3UqEUJ5nX
t3+K5iV1U2+5HWTHFO8zx3dtamkHXJWb5aiPt0LUmqDKGlwigekV2mHxsNth
/BasZug4EboRB6JJP97MAnO/RtN5Kmy5q3a13f2kGjW/n6X+BwAr2iYUXjTd
BGvAPAs6Wk6B2yKiKA0udnYrDviLKgYhOxi14/2TEy2yPNh/9WpNZbeC4cRK
YjsQMZNQeUavhYGqazkIRBlyFczlIx4Ge7R7RzhPZo2j7vrmhjlInEwf1CpH
53UWhnZ8W0S5OjOIE23hnXICZIoqMkbZ9DfoasKbYKsgFAWLNp3SoLwE71fR
vDeRsjRpDDmvJ5gLm0PIvM2RGAfEfJzB9uf0F859e+WTOrUg/9s31aI+V1++
cNzkPT0TaVVmchB6Gsok5RyGQr7U+qUFaxtq+r7aVnqQAsydTygHXPTB1Elg
KCsTMUoqxWtRkO7IeYhdZqmqhU6EVwf687F3+e10+f3w6pT1ynhuRwsWKL8O
zVb/LT9uoStbQ5njeY1cYK0MChp4G1ZjNTXChGgsR1UdCj+YkK+KpgzhKnGo
AN2guDYVBgJRdlk2VmnHR4TADKJlrhND22avmWX6R1EWcrWB8uwdDgsIXQdd
2eE+U8aiM+jf5wiTsFN8/qoevs+P2TuYljIP/RrgrELS45mmzlXiHZgEyo0q
Rw6h2YGd1YGTZqClMY+Lcbcl3h4usf7FRq3cAba5pemy3Mvp1p+U/fyy4Ovi
2IhYUrvYDirat8Q+1Fzg3LiUnalAeRiZLZdPneldAVpDeaiZteNA8rPR/I2G
hzUuw92Lox33CG9sB4pAXvzw+5MDrcDXa2Nd9OYESWRZ2PckNrClgxL5K38J
PgZyaKnSstyDywExr5uCvIrcYvpm8I6xzXseK+ZUYKpPmniKbq6RAGf+oLLQ
Q9+bwFHRjio1mdSIBoD8dvldGiMjJxdOkrcC5pNfVzAbkhRRz6rb3UhDVFvO
GRc28UxlD4pWm5gt1PHYid1XnfjqzcGf0uBc/BTMTYPFPNNqHScLJdoA70XL
WuxzRdlb2Azf2pk6FnOewNvz27p/XsOTPCk+1lxHiq4DvPx1MHSEE+4SxPmI
EVqRCYsmnrHgv48BOrgtCT3YnPiNUWc5x4237M6EQQZtZT16lE6DdW8w4Ngg
TstWQqlLSxzivPgLsA6solmTU5et10+0gsSD7YuFOa9nESeiq7epdXYGYtbZ
Kg6UW1SdHXaATdOWPdlSf63pWvxtUc8WE9/lNL84I7l6MVXzj2ktwsfCQaKk
7IjJKHLphpi4XEpbiKBdIeJHoNwfpYZmWD1QNpducaqDkbxWJqeS4HvRYVuT
x/1QMauaPqNmewelulmxoN7j/yJYldJDJF9YKjkrjsVpTXCC0n6eRXmSsFio
31B9eTVj7590imwSAPTEHKkyhIuSM5tOVHVZYWwK8F58CmghZae+HaQIWQW1
+Pu0+HNwJxNo5ODXcCQg9a3qVGY0La8YX9xeJQk0gKuvtA5OB/RYKMFcohoN
Pd9RXt/2oNVtd4JQlJ3CyMri+2UsQzuB6dHqGoQm/qw+aE2ShmNBPoGhdTGP
OXtbZyShblg6WAX1vr8Qk49ZugMCqfHyjyY38nIog9YAg/anIUOTZPdBkAuR
o4Ct55CW71682v/uzJhb3r188e7o+OT8zxk5DzeV1V2J5kYtsJdetX9w/vKH
ffmrX6d9SrLC58wFUwA4I19el1BrkadxAfRLPg+3fBYqUCMfZ4tzJ0oWC0xx
qklM35vrdHYM1psNjcDux602LUQA3sJdq7Stmie8Qk+o8qMsWSN7sJ8YYBzp
xjvDDFT58rFjbHBWk7hamUkQHZwVw8B8MsvVUWwS8pXxXS/TTUBzuaI9JtK6
7N8AI8ZwzUzbFVvcGfvA3MM3r1493z/4UybLykQbsT2+5jpBWyt9ZFuDqtOF
j2FirOY9K0+vFJxf5AMRjaNkK60yz3LU21svTDw+n31cFR5Gj1kfUtfgzM+Y
g5q7w+QsAafn53kjsnJ65bH078b1AC1yaYPIOvwo+6rPv/Wf0xj/Tts5Ym4H
AMyUawC+dizuEoOCuxLjDTk60r0itCc33oNyePXuqpy+q0afdeJe1/mVTlSH
ItlJWnVKm89dFWAc6LjRSQMBWZuPVh+2eQ8nskC7E6xxAafSVS4lcm2bSYOA
HxiC85Mfn4WCG0Ecmsv1tDTF5z+g7zKp0JobDtEIi8z6Yfur6I16vND8vgYq
cXOglEWoqz8Qk/qIhEwG1RXzLoPFrJnfOWTUqY7p2iAyanw8nM1x9VHFL52w
UME4qNjeyJzqcX2roXr93FcxPuqm/BB8FDlb+FV/W5RobaeHNVj98feqjsPT
ufTRlIP6A7LwYtEp1jj00PmEgVoookdDQLWsFfiuFMgFNwhnjx5oTPObNdri
daYRL5tPl0P2n23ILFlecirSkbJdBbLDNflq5/NTTlvlK/oVxyZN+C0FI3fz
zWOgghCNfKTRSHDiYPWyq3gPXwJ/lRqhsxx4wDTNQxIiaxk3keeNFvDL+28s
A29ud0cjZxp0kwfR2gonnaoZl2mNHBIWTbPQSROtdfD83av9P795e24RGbpS
oSSL3pT5n96iQbwvkxI0rjyu3pLZjmowejaXLk/N5w8ftI4RWecZRP5QJk8S
EgwcrCcTN8pi6/ht660+ZOtYJsPFzGWWgqqxQp93x3EGFuRebKhQijGZJ71D
KuTY81bhg9dPu9vW/ha2kQf0OqSgAEpXzUSF3pW2SrKsx6QCKsp4DBGJi3XG
rlEpJFqLow2oPCaNWOnyXJ1QJM1c0+63uGJooOq7jPpyafLJMHSWTZui4tfX
ngv4rE1bxS2FjciHoshkgpowcl1edQzsqOUrX37SxQ47HuJcw2f13PFpfedw
pu3BdYmHLeo/fdsH+2ecincmWyG80qDFXLvT1I1G88VJDMk275QWT4PDHPVB
ApLJyT8ibSpjSc3Sfen/WKqhGBAwoTuBM57P2OahnCqWJmmU469M8YW1kj7N
61FxFx3E1dJAu8xo5rsM+1bdmUqR3bDJmnmfJ4Q+c5BYHeVxU9w1msy1qGlh
S7UAcDLl/kNO1RmUZr5H4mbaxnUnSCkXtnkazfYwMTRh87SGQVw/rpfa6pJu
My7uHoSv8nC+LkVb8tzoanx3dJ4uMoIei9mgCmkzlZCEDzNLvjASEG2RFkjC
3T5sbeFEdQDBRzezR7ynNdXQfC81rr+8IGufWm68z2ygcdlUjZG1UYuFrCi5
D8Ly9VzERWF8r0k2POkqE1fd+rDJvAM3acZTZCr3sIQXod03WUdA1X54J16V
2AUnCgE/1vj9b9O/O/nma5EIuC4mBLNBDWM/ZFNG3Wnotms+nZVBGW9Aol1W
H8tRn+U2GqAk8Rb60mjgcU3+xjJAQWN5er6VxePrj4TM2De5gThxJ/gkhIhA
RHDJtDSpeeb6cFTTlba0iInoyoAy6v5N5fGLUWi/RGvaKT+0iFNL7LjHtZDM
Su2Qf0INRmI2RESnPzR2V8zPNLewzANNVdc8qT3BiTnYzeGRLdhP0oRtMZ87
xZnRdGSQ/OpF0+e1MOLAsiu9vBxXjHeFZDjRLXAlM4utGmYDz9fGxE7qD8ZW
7nDSiJDwZ5yH2X3WLvBLmNVICx/cVpJ3alYQdJUGZsmAZFJee0DhO2NlYpBP
CYP4nTIgwm2xGhl96zE7RKVnP+gjrH8XZrXWbqRPBvC9nQCbM6xTfRUs5TFh
oNo+AC5ZlhATPKGzy6IBb9qG7Cx52fEBmg3u7omCcjhtkDNXjkHUqJrqoNPS
Z24hfVMSs1I8zoJMvb2WkoislGTKaX2HHIrKYY076ba1s8ODSl/V7oirsXhs
RYfYOSm7T4KLpMAKv9hfsRE/iy7GlgmwdeKmm5jMkJ3bzpKYyrT4rraHIVn4
zPjWPUfQs2b0Jk9wF3vzVAUrYrsx02PGg797XxfuUpLsjEX3DN9b0HOeNm3J
O8WD6duCO/6hhjUfsDoW8ZoVkBl+2/QwJURN6ce2l5gqqeXON7WT6nUpe5vt
pSOnIwxQHOLmqx4ezUMR/647wDdegr3Rs7cGT5EUfyiUo2EmJzz5M33tlgsm
8MsaqzDA3BIuoTlpESPp6RtcIzrdLFw2objNRQAOSu1fvxxg/RSE3qOzn3Dt
qQBpoqpsovSKRryVSmbFPLGOWErMjm1LTVUuHX3oQfkM+mbMUtl0oTwLGVSo
aTdNG1izpCw1aBhhtWhUW3QDBG4B+fw7BuQPFIr7NFaAI8tFhW+gEQWD3171
DbUbea9ErOrR+K19w4bFzXyhe+C2lSZwgLAaO1mCCI+1BUmsK1iUoScH8N5P
09In5yTWgRXaE8qRLNrXqmMAAISwBP2tUvw39/QYBqgEKkUY2oTJxRfCy/RY
e/bUN1On+ZlVQzRZFZJwX9o+LLP2Yfm69mHa7GAN0cH1DOj2m+v8+3I8vq1E
dTiurGe4u/YesVbQvQSZj0DUcNGkcY1QirGupWi7pCtzV0knjEP3n8n72Mcy
fm7+9ATNUrzWuP6GVpYNAcXymSVVasyaXzO+7NRJusvhUagzFeC43lA0yeV6
yVqm8gOlR997i4cRnACdC9Rnp4CtnuUJuDQLUk6t3MW0aTP2RPHYmmU7c4WY
f9yOmrQItUr6STFPqnrLD/X4gxosxnHQwACN9EONx5O9ntEK9ILyjVSOLJF3
2NkoCwYVw0dua3qqwzAJESO0uaE9WZnp7mnauN/LQJPVRwlZ8tsNkDH589/U
t6yPV/XFjB4DQAZWKkXPNjz1EVMdS+kiYrCaBgE7t3BCUMSZ40S88gqV5N7P
Al4NxDXN6oJWn/ZH7+kdi7FOJQv9sMgdtAE7lNoVI7+vxlrhY2uQPOz2RpYd
yu4c5c/HSApoyKYcpbIrvByyH/jRxFO4ZZttVPN7rAexgKsGYzxegr1nmfhY
uT8o8wARLzNrP3wX5Juof0hWUXjpvtBTYN4Jga0YAQ8BKk9c92OZPweeSO7/
spE/YoqfONrnpA1f3IwZVgvpZ9AG7JCbyksJU+DVdBQx3tjiGsynGW8ZOQvK
K9UfKHAGi5l470T457LE/hxTMy5aZ44DoTeU9vqkoctBrIhVmQfKZBLB8Iht
neckFKGFCWIwXl8nPXK8tGBxQ34OTVa2VvleE2+QxFxkKerZyH0+eQk+QitU
HTItu+ZbKkyN8QTf7kDANKxKZ+jITRPzSXPvm5fnSawkPReA2m3FZR+zQ2lL
pmlmkwEq8ejaIlAmVKuFDHdC5+L2jl5N4G0TbevVMpExRxaVUCuqpOgvn2mG
QSMYAqTDYmqI1cjtzhCJNaoaeynUKj2AQfT9NCy+GJQyPMsQRNqAQyOcJM9W
KEO7xSvYbTTXVF4rdMm6h5dTJUN4Gs5uf+XZpU1g7AChsPouC51jFZ0f9pNP
yVyo9BWpLv7e7JYTxrEVYohAs5ortFTWVystdcr0Osju7XU5gjJnQEVln1pe
6vzutwesGu8D5ISkX0CzyTtpaIIA8KalKol0LK+L8SWDCJahVcePh/IZLjR6
VGCOkJj3gFFgcbJygmkYti9+Qz0jwRaH5ChaByqnrJ4ZT0yz5c3+5Ial8q96
duweHSJrZs0mTD74OyDx99hPHYClhoOTuUqfrdPtIhyl9WqRI+DgVDZES5/l
90PjwtC3MF8+VLqV3RQIC+y2DH0r9sQKVDJGWeXwznF5VYjLEwD6Gny0kqkt
P/FX4E1poY1446SQ2nNAfN3UCy233TsMd3ZWAN62p2/MZokoCgLesxyD0uXu
iFQEy4PI8P4LA0EvqywFZSU9SE3jbydpHgQMGctysfGp3RGMSGotd6HSxzbJ
1opsYmByibQsT0v0pCgFuiwTFN+UDsayDVeMVVMo7RcDxVqmQCc1BUe6VOi6
/VbA0HeSjmWbzLtq9v+QNNVEhyrvqtnzQJR6zP1WPX3HYMuDwYYifDt2K+q+
0dV1SB7hernpbyBNj52GDgwlTT1RssBK+wvHnsetYGJ3S6KGCqaqwflM4zPE
GINvMTsRkBIJg0DfnjisRtsadu25rQAZl17FLTIdPkvfBDBKYL3eIG/DZP2m
FVWrtm3mGVT3U1Rr6qOAFRN/G9ULRqVCx4R0/cS2GYttaZQsWXcR6H8rtwa7
VqUi2tBSZj7xvLcOXgaYBEJddZ0zq9A6rNrCJ+igew3L/bS2a/lt0LMwderZ
8o5Se9ZdQZ8susV1WWOsIsH7ARUjW1N7i2BEdF05uMs0FLW9QstSHKnRU6Tt
mMnxFBxclr55KJKbQQfxAyduV1r+6eLAiA5aLwpbufGeBtn8trJsRvJ2L+k4
E3xh4dN53U8VtcKxV+b7kQvNwkss7xuj2sHJ207HnZtZpaEdLJ0GI5INok6p
WVrLOyNl/VBfCnjbPmjhZRCr72jAGhCZaq7kPGGhMEOlHgiqoCC8aM3rd5KH
eTF+v2qVbalILLY2QndQXysF2DFRY+li/qhZsB9N7Z0q/P9McwVLATytDuhr
KuH/x+7+34jd7X5R7C77VHi/E7KKIb5/IkTnESKVZ4ayXbbI3F0tLNmatWWQ
Av1dlhJ1g7SBnYfINuMiY6TXy6EbB8iUZu7l4VFs0WNY5q8GGTGgstew9DJW
LityP8KJcGhoD2pNnAX/4CVW0wWQxBuT4k6Uy22Z2QwnqIwqUSJMEez817G6
b+5EVtN7fgcHESBn7Vk1r8KzcKRTAd4i7hTifOSvNLRjliYmZYM+LxpLTFOa
icGGwnTDyGlyxBRpAZ95lhXaW0wWFTEMeW6llVyG+5ABA8RbLHHHBW5rZmlJ
oT8BOAqYhWKOAsbsDNPuW020puu9vnN7I/u+TGvZRc6Sv0QjveOyIJoHUdDU
vk1nl6m+byZi7JUzRKbOXdy3iKtCalDVkWj4QnXYxjKEUfUKnRAy0NXutbHS
f6UONSgTSTbnbWwj++hhv3BxxnX9Xus2uDihk0PadCULbW51Vf/n4m3nKxxs
LzMprP54sqBZrSeUP6S/BICRARQUysRYTMfr7EWEJvdDIzY5S5o0q10Gpth+
X8M17tYZgXyM4ht0yEucnKLdK9h5dRfEFenqiTCw4ydywVJnFrUmy4B7W9E5
f9r2j/zOlQUMR0BGy7bqq7wBYpVjaHPcV0ffnR6dvz197dXGq0IZADrp6lqn
yekKpzdUjmpBN0HmMUXs5odqVu1IyzJJrXDsugO5bNOhKA0aoCGFKIeY3SU8
driy6ognrEXuxnhdN/CqXeANaANHLieEXOPHGwH3QRUaypgS3HhovQhav2k9
vRM51ahnJ5oWLRpFjg+ISdfEszes7y8qfVxvTl9p5rmAMVyRfo+9JsP3sTnM
vSY2r1fQvU5SLb52iDX8NncTnrhg9WsY9AXEz2ztRivirA71Q/1eY2VyYemN
5lrAyuvacAHR/wIttUmXpPzTwpo10tvkY/Awp6/ihgnEdPyN6AcpiFsL4DUM
Z1HB89O3Z+fvzs73z4/QZOr06Ic3fzqKf2fz2LevgBxMv/DY4Scih2fOMKde
d+s+v/zSs4/bw+Jz8G3odyvu+8sv0ahs06uLUilY+YYFWb0YiVGZp0alrodK
RoMlW/Qqyfv3Vh5oQMxpMLPVpRldvnexdpfQDx7Yb60Bj1SXqcBiMrGWs5dr
K3cWKXCQi00bf5uhl15+ee1NVCrAKblFetCxIoa3LtTCwJntgKLEccRBdwBY
SlQRG6OTqmIFIhga7oNInJA5SZvrJgM/Y/5iCk6Uqc9p1NPUKU6HHmBfsDul
zfBG18/3D32xNG7043W5EkESla2prijTTfNqlHSBjhKJ6ELZnlU7JaggUNYj
evwBM/Xv2xROcXw9u0o0WtD5VL9jpGU0veQGURDqT1QR2hLIVKq5b6fOWTMl
pcKpbMX2wKyi0RJVC/eSN+sQr7Svpko50U5i9qAa2UOXX7yyCXaKRWebYrI1
pb5Zy8B4auhDpenSXvJkK450pEWCD9Ukebj4GJr60bJF187Faqh6kkfTBYvY
ZS+qMTyQ5oKSwAosg+vipqTAZ1jvanynkkDLbHQRLK47hWnHEltVqmuMq1mJ
NumlwV1JXZIr9H9Wdg2nwaLC/rfOCVSSYht8qAzGeVN5UlsPTxPVTzx2/tbV
OTMYg4Xv3V4L1rhKJTgW6QK1ysoDTkz5rIbantz3jUZyeZL9xXA+sitmsW14
WLZx8fdqfNdTGrDGtP/HeUv4yHlNZE9372uWhmutQLcWsYqaQyvkRyvWrxHY
URPAqSbl5Zo3p89WHgMm9B0MWThsPhC36UK7hLbVTq39zv37fFeNvUv224PB
mh4fK0ZRcppFiMd3FsJ+wVKDEBq3Lslq4uFw04AoZhPddQ0pqqa+tEtoPPW5
SQPnXR2KqTrTpUl7J9QJ9Y/YG9UwkMstL1/Ch1xPo2fA0TRbZlmSee3gTaPi
6nVB2E26L5ux1i4SA0J/uq+dfFWptI7LuqNSx+SOLEy//FAMF8WyoD0Vxzt6
Ig2D/yIEiAiYLbRofdOK8/P3IZwcDrAd63Qttp4FqhAfFU0n9FiXiTuj2WSt
1Uie/tbE9p0eI+8SVybiL54ZF3swpgtvs902SUjUx63SXxJQssdJ1q0G1pfF
QTrRjo00NxxML+d7VYgB0EiMavgzWgFAkkSyMG8G3Es10eoPjZewb3nruuAc
GbRojVeWsWaUYfvgvCWKhpSOd9pSEx5l4mfaqi7TO39BOmsrMXbbWalYYwHh
PBOddkWgukdiQWraQiclVDjTxuOzxVxzrbfrtHtQThFxNe/WaeLwayoNTRz7
Bi3XPdVon71Q8BUjKxkB4E2rKge/DS5oUqNN8pEu84Z6KAfu+h1pLN52wcaB
lr7k58XHjS8ELoQAbytl0A+ZS2+h8SxKiMwN0+AXdEaxGEXQb0OjT7WCxl7G
s4lyPMvWQdpXowVryvUJYj+bWk0Nz0G18xars2z+bMjgIP1ZjVTGDVI4jdkC
fNMxftJBdSSv6ar2mI5JYus1+MyjHZwm5FOiNu9HgHQitW6CUcE/ukQyox87
qD3r9ozFzlhQFtAArHO1w/U6w/qQAbIY0qXDQbX2O7J5Xnsasdumg2Ke+wWn
aGWUqUkYvG2tAW64+4wH+S/5/tDZH7UAd+3OjG29aOV9X0wmctZYDkpKhRi+
UMprAEHwawfiZh0grtmn53c35VOD3LwY303F5zqfoeD/+O79WMxL9Lg9rEag
rXkhR1++/o+ymPZP5IMZGIfZvqiSj+2Tow8I/1gUAK0q8pPiVibevK9M8Hn3
gXNvyNIhZ20nWQJJ/MTIjf3HIvHgAZHSxC3PYnxVDmaFtWSQSxnenWoNjL0W
J79sGDmMycdOt5YEDmtclqHtpJasdJ5XvLdbwxFBHqpqu8xfVyKY5OLXpBUR
5+65/Fx00UkxQylKvD3yLCBLjp0OAt7Wto1qorfTihwcygH0GsWrcE+WUkKc
cndPTBQH0yxMX7VA2tnKveEtzpAV8WCvqrui1fQ+C6/T+cxTCOtQ3GhltYol
i3t5LINNKh2uavI9ZuvyU3LAHJgXrkm45MxkYtjezn0qqU7enL38yUnyne/Z
004Jf6Gmi57lyvapcAANSLJ3vTJj+8Z01mso4WlglH8tqu87eRgW1X+uZ4O3
K9UkJef6HqcSw3wQtdgD148sJFgbxOA+r65kubPj97P58PqukH10WpHsb/ie
ZVErMoSY2Zls6Wn2oqgGVXPt6YQKKLS5UurF5Gw3M9toswVPzarVzvZtEyXx
ph9slKiKpOVjZtaip4iHUBX/uBLJfjccW+8vWDERw6KoHWpUWqOqUxX8oI/C
IHczKUjbrq3K1FAGu31mOkux+GKdWODPD0r+cloMq7rXlVCdVf5LAX/tDJ0X
Zxpl/K4GvkIWcHYNVhMlhB/lTmKFmO929r8Bf0h9BLKPCgA=

-->

</rfc>
