<?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-07" 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-07"/>
    <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 151?>

<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 162?>

<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 168?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>In Parallel NFS (pNFS) (see Section 12 of <xref 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 NOT
backward compatible: a flexible file v2 layout cannot be parsed as a flexible file v1 layout
and vice versa.  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 serialising 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 summarised 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 synchronisation 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 chunk_guard4 -- a 32-bit
per-chunk generation counter and a 32-bit owning-client
short-id -- and the data server performs a per-chunk CAS
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 8-byte
chunk_guard4 header per chunk 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 client via
CB_CHUNK_REPAIR (<xref target="sec-CB_CHUNK_REPAIR"/>) and that client
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 client is exactly one actor
holding a chunk-range lock; the data servers still do not
coordinate among themselves.  The repair-client 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 materialising 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 target="RFC8881"/> Section 12) 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 clients 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"/>.</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>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>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>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>replication of data:</dt>
        <dd>
          <t>Data replication is making and storing multiple copies of data in
different locations.</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>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>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>(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 server (DS):</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>escrow (lock escrow, MDS-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.  When the metadata
server revokes a client's stateid while the client still holds
chunk locks, the locks are not dropped (which would expose the
chunks to concurrent writers) but are transferred to the metadata
server itself, marked by the reserved cg_client_id value
CHUNK_GUARD_CLIENT_ID_MDS (see <xref target="sec-chunk_guard_mds"/>).  The
metadata server holds the locks in escrow until a repair client
adopts them via CHUNK_LOCK with CHUNK_LOCK_FLAGS_ADOPT (driven by
CB_CHUNK_REPAIR).  An "MDS-escrow owner" is the metadata server
acting in this placeholder role; "in escrow" describes a lock in
this state.  Escrow preserves the lock-continuity invariant
across stateid revocation: at no point during the revocation
sequence is a chunk simultaneously locked and unowned.</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 Section 5.12.4 of <xref 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 Section 13.3 of <xref 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 Section 12.5.2 of <xref target="RFC8881"/>).  Further,
Section 12.5.3 of <xref 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 (MDS):</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 (PS):</dt>
        <dd>
          <t>a peer of the metadata server, defined in
<xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>, 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 additionally act as a data server.</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>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>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>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 Section 2.1 of <xref 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>
    <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 Section 2.3
of <xref 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 Section 18.42 of
<xref target="RFC8881"/>) to ensure that the semantics of pNFS are respected (see
Section 3.1 of <xref 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
the result per storage device in ffdv_tightly_coupled.</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>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
<em>trusted-stateid tight coupling</em>, as three new NFSv4.2 operations:
TRUST_STATEID (<xref target="sec-TRUST_STATEID"/>), REVOKE_STATEID
(<xref target="sec-REVOKE_STATEID"/>), and BULK_REVOKE_STATEID
(<xref target="sec-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, 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 <xref target="I-D.haynes-nfsv4-flexfiles-v2-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 <xref target="I-D.haynes-nfsv4-flexfiles-v2-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_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 falls back to loose coupling
(anonymous stateid plus fencing) and sets ffdv_tightly_coupled
to false for this storage device.</t>
            </dd>
            <dt>NFS4ERR_INVAL:</dt>
            <dd>
              <t>trusted-stateid tight coupling is supported.  The anonymous
stateid was correctly rejected.  The metadata server records the
capability and sets ffdv_tightly_coupled to true 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
ff_device_versions4 entry returned by GETDEVICEINFO carries its
own ffdv_tightly_coupled flag, 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>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.  Deployments are therefore
responsible for constraining who can establish a control session
in the first place.  Two mechanisms are <bcp14>RECOMMENDED</bcp14>:</t>
          <ol spacing="normal" type="1"><li>
              <t>The control session <bcp14>SHOULD</bcp14> use 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 before accepting EXCHANGE_ID with
EXCHGID4_FLAG_USE_PNFS_MDS.</t>
            </li>
            <li>
              <t>Alternatively, the control session <bcp14>SHOULD</bcp14> run over a
network path isolated from pNFS clients (for example, a
dedicated management VLAN or mutual TLS (<xref target="RFC9289"/>) with
an allowlisted client certificate), such that only
configured metadata servers can reach the storage device on
that path.</t>
            </li>
          </ol>
          <t>Deploying neither mechanism reduces the authorization strength
of TRUST_STATEID and the revocation operations to "any host
that can reach the storage device can invoke them"; a strict
deployment <bcp14>MUST</bcp14> apply at least one of the above.</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 tight-coupling-capable storage devices in the
mirror set (those for which ffdv_tightly_coupled is true);</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, subject to the mirror-set rules
for minimum acceptable coverage.  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
ffdv_tightly_coupled for this storage device, fall back to loose
coupling, and re-issue 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,
per <xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/> -- 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 <em>storage device</em>
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)
use the metadata-server-inband 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 target="RFC8881"/> S18.35), 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 target="RFC8881"/> S18.35), 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 (Section 18.40 of <xref target="RFC8881"/>) is used by the client to
retrieve that information.</t>
      <section anchor="sec-ff_device_addr4">
        <name>ff_device_addr4</name>
        <t>The ff_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.</t>
        <t>The ff_device_versions4 and ff_device_addr4 structures are
reused unchanged from <xref target="RFC8435"/>; they are reproduced here for
reader convenience and are not part of the XDR extracted from
this document.</t>
        <figure anchor="fig-ff_device_versions4">
          <name>ff_device_versions4 (reused from RFC 8435)</name>
          <sourcecode type="xdr"><![CDATA[
   struct ff_device_versions4 {
           uint32_t        ffdv_version;
           uint32_t        ffdv_minorversion;
           uint32_t        ffdv_rsize;
           uint32_t        ffdv_wsize;
           bool            ffdv_tightly_coupled;
   };
]]></sourcecode>
        </figure>
        <figure anchor="fig-ff_device_addr4">
          <name>ff_device_addr4 (reused from RFC 8435)</name>
          <sourcecode type="xdr"><![CDATA[
   struct ff_device_addr4 {
           multipath_list4     ffda_netaddrs;
           ff_device_versions4 ffda_versions<>;
   };
]]></sourcecode>
        </figure>
        <t>The ffda_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 ffda_versions array allows the metadata server to present choices
as to NFS version, minor version, and coupling strength to the
client.  The ffdv_version and ffdv_minorversion represent the NFS
protocol to be used to access the storage device.  This layout
specification defines the semantics for ffdv_versions 3 and 4.  If
ffdv_version equals 3, then the server <bcp14>MUST</bcp14> set ffdv_minorversion to
0 and ffdv_tightly_coupled to false.  The client <bcp14>MUST</bcp14> then access the
storage device using the NFSv3 protocol <xref target="RFC1813"/>.  If ffdv_version
equals 4, then the server <bcp14>MUST</bcp14> set ffdv_minorversion to 1 or 2, and
the client <bcp14>MUST</bcp14> access the storage device using NFSv4 with the
specified minor version.</t>
        <t>Two additional constraints narrow the valid set of
(ffdv_version, ffdv_minorversion) 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<em>ENCODING_PASSTHROUGH), the corresponding storage device
<bcp14>MUST</bcp14> be advertised with ffdv_version = 4 and
ffdv_minorversion = 2.  CHUNK</em>* 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 ffdv_tightly_coupled is true (indicating trusted-stateid
tight coupling), the storage device <bcp14>MUST</bcp14> be advertised with
ffdv_version = 4 and ffdv_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>
        </ul>
        <t>PASSTHROUGH mirrors with loose coupling are the only configuration
for which (3, 0) or (4, 1) remain valid; for all other
configurations the storage device <bcp14>MUST</bcp14> be NFSv4.2.</t>
        <t>Note that while the client might determine that it cannot use any of
the configured combinations of ffdv_version, ffdv_minorversion, and
ffdv_tightly_coupled, 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 ffdv_rsize and ffdv_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 ffdv_rsize and ffdv_wsize allow the metadata server to
communicate that information on behalf of the storage device.</t>
        <t>ffdv_tightly_coupled informs the client as to whether the
metadata server is tightly coupled with this storage device.  The
flag was defined by <xref target="RFC8435"/> as a general tight-coupling
indicator; in flexible file v2 layouts the flag specifically
indicates trusted-stateid tight coupling
(<xref target="sec-tight-coupling-control"/>).  Note that even if the data
protocol is at least NFSv4.1, it may still be the case that there
is loose coupling in effect.  For an NFSv4.2 storage device, the
metadata server sets ffdv_tightly_coupled to true only after
confirming the storage device implements the TRUST_STATEID control
protocol via the capability probe described in
<xref target="sec-tight-coupling-probe"/>.  An NFSv4.2 storage device that does
not implement TRUST_STATEID (returning NFS4ERR_NOTSUPP to the
probe) <bcp14>MUST</bcp14> be advertised with ffdv_tightly_coupled set to false,
regardless of whether it implements some other (non-TRUST_STATEID)
tight-coupling control protocol; from this specification's
perspective, only trusted-stateid tight coupling is interoperable.</t>
        <t>If ffdv_tightly_coupled is not 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 Section 3.3.7 of <xref 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, ffda_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
ffda_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 ffda_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 ffda_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 ffda_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="ffv2codingtype4">
        <name>ffv2_coding_type4</name>
        <figure anchor="fig-ffv2_coding_type4">
          <name>The coding type</name>
          <sourcecode type="xdr"><![CDATA[
   /// enum ffv2_coding_type4 {
   ///     FFV2_ENCODING_PASSTHROUGH             = 1,
   ///     FFV2_ENCODING_MOJETTE_SYSTEMATIC      = 2,
   ///     FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC  = 3,
   ///     FFV2_ENCODING_RS_VANDERMONDE          = 4,
   ///     FFV2_ENCODING_MIRRORED                = 5,
   ///     FFV2_ENCODING_SNAPRAID_CAUCHY         = 6,
   ///     FFV2_ENCODING_XOR_PARITY              = 7,
   ///     FFV2_ENCODING_LINUX_MD_RAID           = 8,
   ///     FFV2_ENCODING_ISA_L_RS                = 9
   /// };
]]></sourcecode>
        </figure>
        <t>The ffv2_coding_type4 (see <xref target="fig-ffv2_coding_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 Coding 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 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>FFV2_ENCODING_MIRRORED, FFV2_ENCODING_MOJETTE_SYSTEMATIC,
FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC,
FFV2_ENCODING_RS_VANDERMONDE,
FFV2_ENCODING_SNAPRAID_CAUCHY,
FFV2_ENCODING_XOR_PARITY,
FFV2_ENCODING_LINUX_MD_RAID, and
FFV2_ENCODING_ISA_L_RS all use the new operations
defined here: in particular CHUNK_WRITE
(<xref target="sec-CHUNK_WRITE"/>) and CHUNK_READ (<xref target="sec-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
(mirrored verbatim, Reed-Solomon shards over GF(2^8) with
distinct matrix constructions, single-parity XOR, or Mojette
projections); the wire and the storage device are the same
in every case.  See the individual encoding sections
(<xref target="sec-encoding-xor-parity"/>, <xref target="sec-encoding-snapraid-cauchy"/>,
<xref target="sec-encoding-linux-md-raid"/>, <xref target="sec-encoding-isa-l-rs"/>) for
the mathematical constructions and wire-compatibility
relationships among the GF(2^8) family.</t>
          </li>
        </ul>
        <t>The 32-bit ffv2_coding_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>
        </section>
        <section anchor="sec-encoding-passthrough">
          <name>FFV2_ENCODING_PASSTHROUGH</name>
          <t>FFV2_ENCODING_PASSTHROUGH is the on-ramp from flexible file v1 layout (<xref target="RFC8435"/>)
into the flexible file v2 layout type.  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_MIRRORED for
the integrity guarantees described in
<xref target="sec-encoding-mirrored"/>.</t>
        </section>
        <section anchor="sec-encoding-mirrored">
          <name>FFV2_ENCODING_MIRRORED</name>
          <t>FFV2_ENCODING_MIRRORED 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 coding types carry.</t>
          <t>What FFV2_ENCODING_MIRRORED 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_MIRRORED 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 payload, 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 coding 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_MIRRORED 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_MIRRORED 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>
          <t>FFV2_ENCODING_XOR_PARITY is single-parity systematic RAID-5-
shape: k data shards plus one parity shard computed as the
bytewise XOR of every data shard.  Parameters: k in the range 1 to 254,
m fixed at 1.  No finite-field arithmetic is required -- the
"encoding" is a plain XOR reduction across k shards, so the
implementation footprint is trivial and the compute cost
scales at memory bandwidth.</t>
          <t>Recovery: for a missing data shard, XOR the surviving k-1
data shards with the parity shard.  For a missing parity
shard, XOR all k data shards.  The mathematics is identical
to the first parity row (P) of a Reed-Solomon Vandermonde or
Cauchy encoding at m=1, so a receiver capable of any of the
GF(2^8) codes at m=1 is also wire-compatible with
XOR_PARITY.  This is the simplest MTI-candidate encoding.</t>
        </section>
        <section anchor="sec-encoding-snapraid-cauchy">
          <name>FFV2_ENCODING_SNAPRAID_CAUCHY</name>
          <t>FFV2_ENCODING_SNAPRAID_CAUCHY is a Cauchy erasure coding over
GF(2^8) with primitive polynomial 0x1d.  Parameters: k in
the range 1 to 251, m in the range 1 to 6.  The encoding matrix is the Extended
Cauchy construction defined in the SnapRAID reference
implementation <xref target="SNAPRAID"/>: the matrix's first two rows
reproduce Linux md's P and Q parity coefficients byte-for-byte,
so a receiver that speaks FFV2_ENCODING_LINUX_MD_RAID at m&lt;=2
also correctly consumes FFV2_ENCODING_SNAPRAID_CAUCHY at m&lt;=2.</t>
          <t>Divergence from LINUX_MD_RAID begins at m&gt;=3, where
SnapRAID's Cauchy point-choice for rows 3 through 6 differs
from any of the other GF(2^8) codes registered here.  The
cap m&lt;=6 comes from SnapRAID's own precomputed coefficient
tables.</t>
          <t>Recovery uses inversion of the k x k sub-matrix built from k
surviving shards.  The SnapRAID codebase <xref target="SNAPRAID"/>
(GPL-3.0-or-later) provides the reference implementation of
the encoding, decoding, and matrix construction.</t>
        </section>
        <section anchor="sec-encoding-linux-md-raid">
          <name>FFV2_ENCODING_LINUX_MD_RAID</name>
          <t>FFV2_ENCODING_LINUX_MD_RAID is the Linux kernel md/raid6 P+Q
double-parity encoding, over GF(2^8) with primitive
polynomial 0x1d.  Parameters: k in the range 2 to 253, m fixed at 2.</t>
          <t>The P parity row is the bytewise XOR of every data shard --
identical to FFV2_ENCODING_XOR_PARITY's parity when
FFV2_ENCODING_LINUX_MD_RAID is considered at m=1.  The Q
parity row is sum(2^i * data_i) evaluated in GF(2^8), with
the exponentiation done over the RAID-6 generator (see the
Linux kernel <tt>lib/raid6</tt> sources <xref target="LINUX-RAID6"/> for the
reference implementation).</t>
          <t>Wire-compatibility with FFV2_ENCODING_SNAPRAID_CAUCHY at m=2
and with FFV2_ENCODING_ISA_L_RS at m&lt;=2 is guaranteed by
construction: all three encoders emit byte-identical P and Q
for the same (k, data) input at m&lt;=2.  This lets a client
implementing any one of them consume the others without
re-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_MIRRORED with N=3 instead.</t>
        </section>
        <section anchor="sec-encoding-isa-l-rs">
          <name>FFV2_ENCODING_ISA_L_RS</name>
          <t>FFV2_ENCODING_ISA_L_RS is Reed-Solomon erasure coding over
GF(2^8) with primitive polynomial 0x1d, using the Vandermonde
matrix construction from Intel's ISA-L (Intelligent Storage
Acceleration Library) <xref target="ISA-L"/>.  Parameters: k in the range
1 to 253, m in the range 1 to (254 - k).  The encoding matrix's top k rows form the
identity (systematic form) and the remaining m rows are
plain Vandermonde: row (k+i) column j equals <tt>2^(i*j)</tt> in
GF(2^8).</t>
          <t>Wire-compatibility properties:</t>
          <ul spacing="normal">
            <li>
              <t>At m=1, the parity row is <tt>[1, 1, ..., 1]</tt>, so
FFV2_ENCODING_ISA_L_RS at m=1 is byte-identical to
FFV2_ENCODING_XOR_PARITY and to FFV2_ENCODING_LINUX_MD_RAID's
P shard.</t>
            </li>
            <li>
              <t>At m=2, the second parity row is <tt>[1, 2, 4, 8, ...]</tt> in
GF(2^8), byte-identical to LINUX_MD_RAID's Q shard and to
the second row of SNAPRAID_CAUCHY's matrix.  So the three
GF(2^8) codes coexist at m&lt;=2.</t>
            </li>
            <li>
              <t>At m&gt;=3, the ISA-L matrix continues the Vandermonde
sequence.  SNAPRAID_CAUCHY diverges at m&gt;=3 (different
Cauchy point choice); LINUX_MD_RAID does not support
m&gt;=3.</t>
            </li>
          </ul>
          <t>Wire-incompatibility with FFV2_ENCODING_RS_VANDERMONDE (0x4):
the reffs reference RS encoding uses a normalized
Vandermonde construction (Vandermonde multiplied by the
inverse of the top k x k block to force identity on top),
whose parity coefficients differ from ISA-L's from row 0
onward.  ISA_L_RS thus requires its own registry value
despite sharing the field with RS_VANDERMONDE.</t>
          <t>The ISA-L codebase <xref target="ISA-L"/> (BSD-3-Clause) provides the
reference implementation of the encoding, decoding, and
matrix construction.  On x86-64 CPUs supporting AVX2 or
newer, the encoder achieves multi-GB/s throughput per core
via shuffle-based inner loops; a portable-C fallback is also
provided.</t>
        </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 target="RFC8881"/> Section 18.42.</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 peer data server to propagate the update to the
remaining mirrors.  When unset, the client <bcp14>MUST</bcp14> update all
mirrors.</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 to help with the stateid
issue discussed in Section 5.1 of <xref target="RFC8435"/>.  I.e., in version 1
of the Flexible File Version 2 Layout Type, there was the singleton ffv2ds_stateid
combined with the ffv2ds_fh_vers array.  I.e., each NFSv4 version
has its own stateid.  In <xref target="fig-ffv2_file_info4"/>, each NFSv4
filehandle has a one-to-one correspondence to a stateid.</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_SPARE         = 0x00000002;
   /// 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 details the
state of the data servers.  With erasure coding algorithms, there
are both Systematic and Non-Systematic approaches.  In the Systematic,
the bits for integrity are placed amongst the resulting transformed
chunk.  Such an implementation would typically see FFV2_DS_FLAGS_ACTIVE
and FFV2_DS_FLAGS_SPARE data servers.  The FFV2_DS_FLAGS_SPARE ones
allow the client to repair a payload without engaging the metadata
server.  I.e., if one of the FFV2_DS_FLAGS_ACTIVE did not respond
to a CHUNK_WRITE, the client could fail the chunk to the
FFV2_DS_FLAGS_SPARE data server.</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.  If the
implementation wanted to allow for local repair, it would also use
FFV2_DS_FLAGS_SPARE.</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.  A
REPAIR data server differs from a SPARE in two ways:</t>
        <ul spacing="normal">
          <li>
            <t>A SPARE is standing by with no payload; the client <bcp14>MAY</bcp14> fail
over to it at write time without metadata-server coordination.</t>
          </li>
          <li>
            <t>A REPAIR has been promoted by the metadata server to replace a
failed ACTIVE, and its payload was placed there by a repair
client 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>
          </li>
        </ul>
        <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 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
<xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>; this
document defines only the layout-flag surface (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>
      </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 fdp_data;    /* data shards (k) */
   ///     uint32_t fdp_parity;  /* parity/redundancy 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 (fdp_data, also known as k) and the number of parity or
redundancy shards (fdp_parity, also known as m).  This structure is
used in both layout hints and layout responses, and applies
uniformly to all coding types:</t>
        <table anchor="fig-protection-examples">
          <name>Example data protection configurations</name>
          <thead>
            <tr>
              <th align="left">Protection Mode</th>
              <th align="left">fdp_data</th>
              <th align="left">fdp_parity</th>
              <th align="left">Total DSes</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 DS 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 DS failures</td>
            </tr>
          </tbody>
        </table>
        <t>By expressing all protection modes as (fdp_data, fdp_parity) pairs,
a single structure serves mirroring, striping, and all erasure
coding types.  The coding type (<xref target="fig-ffv2_coding_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 fdp_data + fdp_parity.
The storage overhead is fdp_parity / fdp_data (e.g., 50% for 4+2,
25% for 8+2).</t>
      </section>
      <section anchor="ffv2codingtypedata4">
        <name>ffv2_coding_type_data4</name>
        <figure anchor="fig-ffv2_coding_type_data4">
          <name>The ffv2_coding_type_data4</name>
          <sourcecode type="xdr"><![CDATA[
   /// union ffv2_coding_type_data4 switch
   ///         (ffv2_coding_type4 fctd_coding) {
   ///     case FFV2_ENCODING_PASSTHROUGH:
   ///         ffv2_data_protection4   fctd_protection;
   ///     case FFV2_ENCODING_MIRRORED:
   ///         ffv2_data_protection4   fctd_protection;
   ///     default:
   ///         ffv2_data_protection4   fctd_protection;
   /// };
]]></sourcecode>
        </figure>
        <t>The ffv2_coding_type_data4 (in <xref target="fig-ffv2_coding_type_data4"/>) describes
the data protection geometry for the layout.  All coding types carry an
ffv2_data_protection4 (<xref target="fig-ffv2_data_protection4"/>) specifying the
number of data and parity shards.  The coding 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: fdp_data is 1 and fdp_parity is
the number of additional copies (e.g., fdp_parity=2 for
3-way mirroring).  The "1" data carrier is the file as
stored; the fdp_parity additional copies are the flexible file v1 layout
mirror replicas.</t>
          </li>
          <li>
            <t>FFV2_ENCODING_MIRRORED uses the N+0 notation: fdp_data is
the number of replicas (e.g., fdp_data=3 for 3-way
mirroring) and fdp_parity <bcp14>MUST</bcp14> be 0.  Every replica is a
full, independent data carrier; mirroring carries no
parity reconstruction.</t>
          </li>
          <li>
            <t>Erasure coding 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 fdp_data &gt;= 2 and fdp_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_coding_type_data4 of
FFV2_ENCODING_PASSTHROUGH or FFV2_ENCODING_MIRRORED, 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>
      </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_coding_type_data4  ffv2m_coding_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"/>) describes the Flexible
File Layout Version 2 specific fields.</t>
        <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_coding_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_coding_type_data is FFV2_ENCODING_PASSTHROUGH,
then the length of ffv2m_stripes <bcp14>MUST</bcp14> be 1.  Under
FFV2_ENCODING_MIRRORED 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 MDS and DSes</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_coding_type_data
is FFV2_ENCODING_PASSTHROUGH or FFV2_ENCODING_MIRRORED, 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 (FFV2_ENCODING_MOJETTE_SYSTEMATIC,
FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC,
FFV2_ENCODING_RS_VANDERMONDE) 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_MIRRORED, 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_coding_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 Section 5.12.4 of <xref 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> honour 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 coding 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_CODING_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
(fdp_data, fdp_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_MIRRORED,
                         FFV2_ENCODING_MOJETTE_SYSTEMATIC,
                         FFV2_ENCODING_RS_VANDERMONDE }
ffv2lh_preferred_protection = { fdp_data = 8, fdp_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 (fdp_data=4, fdp_parity=2).  A
server without erasure coding might return FFV2_ENCODING_MIRRORED
with (fdp_data=3, fdp_parity=0) for 3-way mirroring with
per-chunk integrity, or FFV2_ENCODING_PASSTHROUGH with
(fdp_data=1, fdp_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 coding-type registry is expected to grow over time
(new erasure coding types are added, older ones fall out of favour,
vendors register private codes; see <xref target="iana-considerations"/>),
neither clients nor metadata servers are required to implement
every registered encoding.  The protocol uses ffv2_layouthint4 as
the negotiation surface:</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:</dt>
            <dd>
              <t>The metadata server <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 honour it or fail its I/O
with NFS4ERR_CODING_NOT_SUPPORTED.</t>
            </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_CODING_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 MDS-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 <strong>translating proxy</strong> 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_MIRRORED for a minimal
NFSv4.2 client, or FFV2_ENCODING_PASSTHROUGH / a flat
NFSv3 surface 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 MDS-I/O
fallback loses.  The proxy registration, directive, and
credential-forwarding rules are defined in the
<xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>; this draft defines only
the layout-flag surface (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_CODING_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 surface; 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_coding_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
Section 18.43.2 of <xref 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 (fdp_data, fdp_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 ffda_versions.  Each element of the array corresponds to a
particular combination of ffdv_version, ffdv_minorversion, and
ffdv_tightly_coupled 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, 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 (ffdv_version = 3), the tight-coupling
model does not apply: <xref target="sec-ff_device_addr4"/> requires
ffdv_tightly_coupled to be FALSE whenever ffdv_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 ffdv_tightly_coupled (see <xref target="sec-ff_device_addr4"/>) is set,
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 Section 5.9 of <xref 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 prior draft's "the flag functions as a hint" language is
withdrawn; the encoding-negotiation fallback path that requires
MDS I/O to be possible is served by the metadata server clearing
NO_IO_THRU_MDS on the fallback layout, not by clients ignoring
the flag on a NO_IO_THRU_MDS layout.</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
Section 18.42.1 of <xref 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 Section 13.3 of <xref 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 ff_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 ffda_versions array in the
ff_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 ffdv_version, ffdv_minorversion,
and ffdv_tightly_coupled.  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 ffdv_version and
ffdv_minorversion combinations.  Using ffv2_ioerr4 (<xref target="sec-ffv2_ioerr4"/>)
inside either the LAYOUTRETURN (see Section 18.44 of <xref target="RFC8881"/>)
or the LAYOUTERROR (see Section 15.6 of <xref 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 ffdv_version
and ffdv_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 version 2 inherits the dense and
sparse striping dispositions defined by the file layout type in
Section 13.4 of <xref 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
Section 13.4.4 of <xref 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>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="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.  There
is 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.  However, the over-the-wire
transfer of the file contents <bcp14>MUST</bcp14> appear identical.  Note, this
is a constraint of the selected XDR representation in which each
mirrored copy of the layout segment has the same striping pattern
(see <xref target="fig-parallel-filesystem"/>).</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 <bcp14>MUST</bcp14> update that copy until
the client is presented it in a layout.  If the FF_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 <bcp14>MUST</bcp14>
update all copies of the mirror.  As seen in <xref target="sec-mds-resilvering"/>,
during the resilvering, the layout is recalled, and the client has
to make modifications via the metadata server.</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 FF_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 FF_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 FF_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.  The client would then
have to perform the I/O through the metadata server.</t>
        </section>
      </section>
      <section anchor="erasure-coding">
        <name>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 guard is an unique identifier generated by the client to describe
the current write transaction (see <xref target="sec-chunk_guard4"/>).  The
intent is to have a unique and non-opaque value for comparison.
The payload_id describes the position within the payload.  Finally,
the checksum carries 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>
        <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 coding 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
coding 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 <strong>atomic</strong> 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 <strong>integrity</strong> 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: <strong>last-writer-wins does not apply to a payload
spread across independent data servers.</strong>  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         |
   +----------------+     +----------------+     +----------------+
   | 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 |
   | 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>
            <artwork><![CDATA[
  +------------------------------------+
  | CHUNK_WRITEargs                    |
  +------------------------------------+
  | cwa_stateid: 0                     |
  | cwa_offset: 1                      |
  | cwa_stable: FILE_SYNC4             |
  | cwa_payload_id: 0                  |
  | cwa_owner:                         |
  |            co_guard:               |
  |                cg_gen_id   : 3     |
  |                cg_client_id: 6     |
  | cwa_chunk_size  :  1048            |
  | cwa_checksums:                     |
  |         [0]:  0x32ef89             |
  |         [1]:  0x56fa89             |
  |         [2]:  0x7693af             |
  | cwa_chunks  :  ......              |
  +------------------------------------+
]]></artwork>
          </figure>
          <t>This describes a 3 block write of data from an offset of 1 block
in the file.  As each block shares the cwa_owner, it is only presented
once.  The data server can construct the header
for the i'th chunk from the cwa_chunks from the cwa_payload_id, the
cwa_owner, and the i'th checksum from the 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>
            <artwork><![CDATA[
  +-------------------------------+
  | CHUNK_WRITEresok              |
  +-------------------------------+
  | cwr_count: 3                  |
  | cwr_committed: FILE_SYNC4     |
  | cwr_writeverf: 0xf1234abc     |
  | cwr_owners[0]:                |
  |        co_chunk_id: 1         |
  |        co_guard:              |
  |            cg_gen_id   : 3    |
  |            cg_client_id: 6    |
  | cwr_owners[1]:                |
  |        co_chunk_id: 2         |
  |        co_guard:              |
  |            cg_gen_id   : 3    |
  |            cg_client_id: 6    |
  | cwr_owners[2]:                |
  |        co_chunk_id: 3         |
  |        co_guard:              |
  |            cg_gen_id   : 3    |
  |            cg_client_id: 6    |
  +-------------------------------+
]]></artwork>
          </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.  Other registered checksum algorithms
(CHECKSUM_ALG_CRC32C, CHECKSUM_ALG_FLETCHER4,
CHECKSUM_ALG_SHA256, CHECKSUM_ALG_SHA512,
CHECKSUM_ALG_BLAKE3; 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>
              <artwork><![CDATA[
  +------------------------------------+
  | CHUNK_WRITEargs                    |
  +------------------------------------+
  | cwa_stateid: 0                     |
  | cwa_offset: 1                      |
  | cwa_stable: FILE_SYNC4             |
  | cwa_payload_id: 0                  |
  | cwa_owner:                         |
  |            co_guard:               |
  |                cg_gen_id   : 7     |
  |                cg_client_id: 6     |
  | cwa_chunk_size  :  1048            |
  | cwa_checksums:                     |
  |         [0]:  0x21de8              |
  | cwa_chunks  :  ......              |
  +------------------------------------+
]]></artwork>
            </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 coding 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>
              <artwork><![CDATA[
  +------------------------------------+
  | CHUNK_READresok                    |
  +------------------------------------+
  | crr_eof: false                     |
  | crr_chunks[0]:                     |
  |        cr_checksum: 0x21de8        |
  |        cr_owner:                   |
  |            co_guard:               |
  |                cg_gen_id   : 7     |
  |                cg_client_id: 6     |
  |        cr_chunk  :  ......         |
  +------------------------------------+
]]></artwork>
            </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 two basic writing modes for erasure coding and they depend
on 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.  If
it is the only writer, then CHUNK_WRITE with the cwa_guard not set
can be used to write chunks.  In this scenario, there is no write
contention, but write holes can occur as the client overwrites old
data.  Thus the client does not need guarded writes, but it does
need the ability to rollback writes.  If it is not the only writer,
then CHUNK_WRITE with the cwa_guard set <bcp14>MUST</bcp14> be used to write chunks.
In this scenario, the write holes can also be caused by multiple
clients writing to the same chunk.  Thus the client needs guarded
writes to prevent over writes and it does need the ability to
rollback writes.</t>
          <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 (<xref target="sec-CHUNK_FINALIZE"/>) and CHUNK_ROLLBACK
(<xref target="sec-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
(<xref target="sec-CHUNK_LOCK"/>) holder is signaled by NFS4ERR_CHUNK_LOCKED.
No implicit chunk-write lock is acquired by CHUNK_WRITE; the
prior draft's "as if CHUNK_LOCK had been performed" language
is not part of this specification.</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 Client</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    |       MDS       |
     |  (detects   |                  |                 |
     |  error)     |                  |                 |
     +-------------+                  +--------+--------+
                                               |
                                               | (2b)
                                               | CB_CHUNK_REPAIR
                                               | (RACE or SCRUB)
                                               v
     +-------------+      (4)         +-----------------+
     |  Repair     | ---------------> |      DSes       |
     |  client     |    CHUNK_*       |  (mirror set    |
     |  (selected  |                  |  for affected   |
     |  per (2a),  |                  |  ranges)        |
     |  adopts     |                  |                 |
     |  lock (3))  |                  |                 |
     +-------------+                  +-----------------+

     (1)   Reporting client LAYOUTERRORs the metadata server.
     (2a)  Metadata server selects a repair client (may be same
           as the reporting client).
     (2b)  Metadata server escrows the chunk lock and issues
           CB_CHUNK_REPAIR to the selected repair client.
     (3)   Repair client adopts the lock and drives the repair.
     (4)   Repair client 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 which client
(or, in a tightly coupled deployment, which data server) repairs
an non-atomic payload.  This 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-optimising 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 client <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 client <bcp14>MUST</bcp14> issue CHUNK_REPAIRED
(<xref target="sec-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 (<xref target="sec-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_CODING_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_CODING_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 (<xref target="sec-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 (<xref target="sec-CHUNK_FINALIZE"/>) and CHUNK_COMMIT
(<xref target="sec-CHUNK_COMMIT"/>) to persist the repaired shards.</t>
            </li>
            <li>
              <t>CHUNK_REPAIRED (<xref target="sec-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 (<xref target="sec-CHUNK_ROLLBACK"/>) on each affected
shard to restore the previously committed content.</t>
            </li>
            <li>
              <t>CHUNK_UNLOCK (<xref target="sec-CHUNK_UNLOCK"/>) on each shard.</t>
            </li>
          </ol>
          <t>In both paths, the repair client <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); then, if both of the above are
unreachable, a data server carrying FFV2_DS_FLAGS_SPARE.  If
none of the above are available, the client <bcp14>MUST</bcp14> return
NFS4ERR_PAYLOAD_LOST on the CB_CHUNK_REPAIR response.</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 client 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 client reconstructs the correct
data using the erasure coding algorithm (RS matrix inversion or Mojette
back-projection) from the surviving atomic chunks (treating each
chunk's payload as a shard of the stripe).</t>
              </li>
              <li>
                <t>The repair client issues CHUNK_WRITE_REPAIR (<xref target="sec-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 client issues CHUNK_FINALIZE and CHUNK_COMMIT to persist the
repaired blocks.</t>
              </li>
              <li>
                <t>The repair client issues CHUNK_REPAIRED (<xref target="sec-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
(Section 12.5.5 of <xref 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 (Section 12.5.5.2.1 of <xref 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 a chunk_guard4 in cwa_guard.cwg_guard
that uniquely identifies this write transaction across all data servers.</t>
            <t>The multiple writer write sequence is:</t>
            <ol spacing="normal" type="1"><li>
                <t>The client selects a unique chunk_guard4 for this transaction.  The
cg_client_id identifies the client (derived from the client's
clientid4); the cg_gen_id is a per-client generation counter
incremented for each new 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 guard ensures that the chunks carrying the shards of an atomic
erasure-coded stripe all carry the same chunk_guard4.  A reader that
encounters chunks with different guard values 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 client.  The repair sequence is:</t>
            <ol spacing="normal" type="1"><li>
                <t>The repair client issues CHUNK_LOCK (<xref target="sec-CHUNK_LOCK"/>) on the
affected block range of each data server.  If any lock attempt returns
NFS4ERR_CHUNK_LOCKED, the repair client 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 client 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 client 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 client 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 client 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 client 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 Coding 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 <strong>Proxy Server</strong> 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>The Proxy Server mechanism is specified in <xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>.</t>
          <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 (<xref target="sec-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-coding-types">
        <name>Mixing of Coding Types</name>
        <t>Multiple coding 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_coding_type4.  Mixing coding types in a
single file's mirror set addresses several use cases:</t>
        <ul spacing="normal">
          <li>
            <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>
          </li>
          <li>
            <t>Online migration between encodings, 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>
          </li>
          <li>
            <t>Cross-encoding recovery: 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 surface.</t>
          </li>
          <li>
            <t>Client-capability routing: a Proxy Server
(<xref target="I-D.haynes-nfsv4-flexfiles-v2-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>
          </li>
        </ul>
        <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 8 active data shards
(plus 2 parity and 2 spare 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-FFv2 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 (Section 18.22 of <xref target="RFC8881"/>) calls to index 0 (the
PASSTHROUGH mirror).</t>
          </li>
          <li>
            <t>A client that speaks the chunked path issues CHUNK_READ
(<xref target="sec-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
(<xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>).</t>
          </li>
        </ul>
        <t>All three patterns coexist during the transition.</t>
        <figure anchor="fig-example_mixing">
          <name>Example of Mixed Coding Types in a Layout</name>
          <artwork><![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  |
 |             ffv2_data_server4[6]                    |
 |                 ffv2ds_flags: FFV2_DS_FLAGS_SPARE   |
 |             ffv2_data_server4[7]                    |
 |                 ffv2ds_flags: FFV2_DS_FLAGS_SPARE   |
 |     ffv2m_coding: FFV2_ENCODING_RS_VANDERMONDE      |
 +-----------------------------------------------------+
]]></artwork>
        </figure>
        <t>When performing I/O via a FFV2<em>ENCODING_PASSTHROUGH coding type,
the non-transformed data will be used; whereas with the chunked
coding types (FFV2_ENCODING_MIRRORED, FFV2_ENCODING_MOJETTE</em>*,
FFV2_ENCODING_RS_VANDERMONDE), 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
coding 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
(<xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>), 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's I/O surface is
one 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 Flexible File v1 export speaking only NFSv3 (capable of
FFV2_ENCODING_PASSTHROUGH only); Pool B is a Flexible File v2
deployment whose data servers have implemented only
FFV2_ENCODING_RS_VANDERMONDE; Pool C similarly has data
servers that have implemented only FFV2_ENCODING_MOJETTE_SYSTEMATIC.
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.  And because each pool's data servers can only
respond to the chunk operations of its own encoding, the layout
for this file <bcp14>MUST</bcp14> name a different <tt>ffv2_coding_type4</tt> per
mirror covering each stripe segment.  The heterogeneity is
not a transition window; it is the permanent structural
consequence of striping across heterogeneous capability pools.</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").  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_coding_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-rs-encoding">
        <name>Reed-Solomon Vandermonde Encoding (FFV2_ENCODING_RS_VANDERMONDE)</name>
        <section anchor="overview">
          <name>Overview</name>
          <t>Reed-Solomon (RS) codes are Maximum Distance Separable (MDS) 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 encoding process uses a (k+m) x k Vandermonde matrix, normalized
so that its top k rows form the identity matrix:</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 V[0][0] 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.</t>
        </section>
        <section anchor="encoding">
          <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>
          <ul spacing="normal">
            <li>
              <t>Irreducible polynomial: x^8 + x^4 + x^3 + x^2 + 1 (0x11d)</t>
            </li>
            <li>
              <t>Primitive element: g = 2</t>
            </li>
            <li>
              <t>Evaluation points: shard i (i = 0, 1, ..., k+m-1) uses
alpha_i = i + 1 in GF(2^8) (values 1 through k+m, all
non-zero and distinct)</t>
            </li>
            <li>
              <t>Vandermonde entries: V[i][j] = alpha_i^j = (i+1)^j in GF(2^8)
for i = 0..k+m-1, j = 0..k-1</t>
            </li>
            <li>
              <t>Matrix normalization: E = V * T^(-1) where T is the top k x k
sub-matrix (rows for shards 0..k-1)</t>
            </li>
            <li>
              <t>Parameter bound: k + m <bcp14>MUST NOT</bcp14> exceed 255</t>
            </li>
          </ul>
          <t>These parameters fully determine the encoding matrix for any
(k, m) configuration in the permitted range.</t>
        </section>
        <section anchor="rs-interoperability-test-vector">
          <name>RS Interoperability Test Vector</name>
          <t>The following worked example pins the encoding matrix and one
end-to-end encoding for the smallest useful geometry (k=2, m=1).
An implementation whose encoded output matches this example is
using the same GF(2^8) representation, the same evaluation-point
assignment, and the same matrix normalization as required by the
interoperability parameters above.</t>
          <t>Evaluation points: <tt>alpha_0 = 1</tt>, <tt>alpha_1 = 2</tt>, <tt>alpha_2 = 3</tt>
(values 1, 2, 3 in GF(2^8)).</t>
          <t>Vandermonde matrix V (3 rows x 2 columns):</t>
          <artwork><![CDATA[
V = [ [1, 1],    // row 0: (1^0, 1^1) = (1, 1)
      [1, 2],    // row 1: (2^0, 2^1) = (1, 2)
      [1, 3] ]   // row 2: (3^0, 3^1) = (1, 3)
]]></artwork>
          <t>Top k x k sub-matrix <tt>T = [[1, 1], [1, 2]]</tt> has determinant
<tt>det(T) = 1*2 XOR 1*1 = 3</tt> in GF(2^8).  The inverse of 3 in
GF(2^8) with irreducible polynomial <tt>0x11d</tt> is
<tt>3^-1 = 0xF4</tt> (verifiable: <tt>(x+1) * (x^7+x^6+x^5+x^4+x^2) mod
(x^8+x^4+x^3+x^2+1) = 1</tt>).  Applying <tt>T_inv = (1/det) *
[[T[1][1], T[0][1]], [T[1][0], T[0][0]]]</tt> (characteristic 2, so
no sign changes):</t>
          <artwork><![CDATA[
T_inv = [ [0xF5, 0xF4],
          [0xF4, 0xF4] ]
]]></artwork>
          <t>Systematic-normalized encoding matrix <tt>E = V * T_inv</tt>:</t>
          <artwork><![CDATA[
E = [ [0x01, 0x00],    // identity block for data shard 0
      [0x00, 0x01],    // identity block for data shard 1
      [0xF4, 0xF5] ]   // parity generator P = E[2]
]]></artwork>
          <t>For k=2, m=1 the parity generator is <tt>P = [0xF4, 0xF5]</tt>; the
parity shard is computed byte-wise as
<tt>parity[j] = 0xF4 * data[0][j] XOR 0xF5 * data[1][j]</tt> 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">
            <name>RS Vandermonde test vector: k=2, m=1, single-byte shards</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>0xF4</tt></td>
                <td align="left">0xF4 * 0x01 XOR 0xF5 * 0x00 = 0xF4</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x00</tt></td>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">
                  <tt>0xF5</tt></td>
                <td align="left">0xF4 * 0x00 XOR 0xF5 * 0x01 = 0xF5</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">
                  <tt>0x01</tt></td>
                <td align="left">0xF4 XOR 0xF5 = 0x01 (the polynomial diff of adjacent bytes)</td>
              </tr>
            </tbody>
          </table>
          <t>Implementations that produce different values for any row of
<xref target="tbl-rs-test-vector"/> disagree with this specification and will
not interoperate.</t>
        </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-1">
          <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 now
removes the interop hazard the review flagged (the same shard
input, XOR'd at W = 4 vs 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 algorithm on the shard count N (N = n for
non-systematic, N = m for systematic):</t>
          <artwork><![CDATA[
If N is even (N = 2t):
    directions = { (p, 1) : p in {-t, -t+1, ..., -1, 1, 2, ..., t} }
    // Symmetric around zero; |directions| = 2t = N.
If N is odd (N = 2t + 1):
    directions = { (p, 1) : p in {-t, -t+1, ..., -1, 1, 2, ..., t, t+1} }
    // Asymmetric by including one additional positive magnitude
    // to make |directions| = 2t + 1 = N.
]]></artwork>
          <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 MDS-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>
          <t><strong>Slot-to-direction mapping.</strong>  The canonical shard layout for
Mojette is:</t>
          <ul spacing="normal">
            <li>
              <t>Systematic (FFV2_ENCODING_MOJETTE_SYSTEMATIC): 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>
            </li>
            <li>
              <t>Non-systematic (FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC): 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>
            </li>
          </ul>
          <t><strong>Bin ordering within a projection.</strong>  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>
          <t><strong>Projection sizes.</strong>  Unlike RS, Mojette parity shard sizes
vary by direction:</t>
          <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>
          <t><strong>Chunk sizing for variable-length projections.</strong>  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>
          <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">MDS 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="sec-spare-substitution">
        <name>First-Line Substitution to a Spare</name>
        <t>When a client's CHUNK_WRITE to an FFV2_DS_FLAGS_ACTIVE data server
fails with a transport-level error, NFS4ERR_IO, NFS4ERR_NOSPC, or
any other code that indicates the data server cannot accept the
shard, and the layout includes a data server flagged
FFV2_DS_FLAGS_SPARE (<xref target="sec-ffv2_ds_flags4"/>) that is not already
holding a shard for the affected payload, the client <bcp14>MAY</bcp14> substitute
the spare for the failing active data server for this write.</t>
        <t>Substitution avoids the full metadata-server repair flow.  The
client issues CHUNK_WRITE to the spare in place of the failing
ACTIVE and, if successful, proceeds with CHUNK_FINALIZE and
CHUNK_COMMIT against the full set of data servers the payload
now resides on (the k-1 healthy ACTIVE plus the substituted
SPARE).  The spare becomes the i-th shard holder for the
affected payload.</t>
        <t>The client <bcp14>MUST</bcp14> inform the metadata server of the substitution
before returning the layout.  This is done via LAYOUTERROR on
the failing ACTIVE (reporting the error code the client
encountered) in the same compound as, or before, any
LAYOUTSTATS reporting of the substitution.  The metadata server
uses the LAYOUTERROR to decide whether to update the layout in
place -- promoting the spare to ACTIVE and demoting the failing
ACTIVE to a stale-or-unreachable state -- or to push new
layouts via CB_RECALL_ANY to other clients so readers do not
continue to consult the failing ACTIVE.</t>
        <t>Substitution is optional.  A client that does not implement it,
or does not have a suitable spare in the layout, falls through
to the normal write-hole handling below.  Substitution is also
not available to clients writing with cwa_stable == FILE_SYNC
unless the client is prepared to drive FILE_SYNC semantics on
the spare as well; otherwise the substitution silently
downgrades the durability contract.</t>
        <t>Substitution <bcp14>MUST NOT</bcp14> be used when the existing PENDING state
on any shard of the affected payload carries a different
chunk_guard4 than the current transaction (the range has been
adopted by a repair client already -- the normal repair flow
applies and substitution would collide).</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> also be handled without
CHUNK_ROLLBACK by substituting the failing data server with an
FFV2_DS_FLAGS_SPARE, per <xref target="sec-spare-substitution"/>.  This
avoids engaging the metadata server's repair flow and is the
preferred path on transient single-data server failures when the layout
exposes a suitable spare.</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 substitution and CHUNK_ROLLBACK 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
spares provisioned), 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 the entire surface 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>
        <ul spacing="normal">
          <li>
            <t><strong>Atomicity.</strong>  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>
          </li>
          <li>
            <t><strong>Integrity.</strong>  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>
          </li>
          <li>
            <t><strong>Provenance.</strong>  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>
          </li>
          <li>
            <t><strong>Lifecycle state.</strong>  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>
          </li>
          <li>
            <t><strong>Lock continuity across revocation.</strong>  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 client 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>
          </li>
        </ul>
        <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 surface with optional integrity bolted on; they are a
chunk-protocol surface 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 client via CB_CHUNK_REPAIR.</t>
          </dd>
          <dt>Metadata server (MDS):</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 client 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 (DS):</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 MDS-escrow owner), and the chunk state machine
(EMPTY / PENDING / FINALIZED / COMMITTED).  Has no
coordinator role.  Has no knowledge of the erasure coding 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<em>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</em>* 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 MDS-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 client by an
MDS-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 <xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>).
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>
        <t>Each file is owned by exactly one metadata server at any given
instant.  Ownership transfer between metadata servers (for
example, during metadata server failover) is implementation-defined and out
of scope for this document; see <xref target="sec-system-model-consensus"/>.</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 (possibly against a spare, see
<xref target="sec-spare-substitution"/>).  An 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-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 client,
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
             |                                   |  (MDS invalidates
             |                                   |   writer stateid;
             |                                   |   lock transfers
             |                                   |   to MDS escrow)
             |                                   v
             |        CHUNK_UNLOCK     +-------------------+
             |       or CHUNK_REPAIRED |   LOCKED by MDS   |
             |      (repair client     |       escrow      |
             |       releases after    +-------------------+
             |       repair completes)           |
             |                                   | CHUNK_LOCK with
             |                                   | CHUNK_LOCK_FLAGS_ADOPT
             |                                   |  (repair client
             |                                   |   adopts MDS-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-consistency">
        <name>Consistency Guarantees</name>
        <t>The protocol provides <strong>per-chunk linearizability on COMMITTED
state</strong>:</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 MDS-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 <strong>no multi-chunk
atomicity or ordering guarantee</strong>.  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>
        <t><strong>The chunk is the unit of atomicity.</strong>  Two properties follow:</t>
        <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, which this revision does
not.</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 chunk exists.
A corollary of this rule is the <strong>lowest-guard-recoverable</strong>
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 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-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 client 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
an MDS-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>
          </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 client
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-MDS-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 target="RFC8881"/> Section 18.15): runway pool directory
traversal.</t>
          </li>
          <li>
            <t>GETATTR (<xref target="RFC8881"/> Section 18.7): reflected GETATTR after a
write layout is returned, and any other attribute queries the
metadata server needs to reconcile its cached view.</t>
          </li>
          <li>
            <t>SETATTR (<xref target="RFC8881"/> Section 18.30): data file truncate for
MDS-level SETATTR(size) fan-out, synthetic uid/gid rotation
for fencing, and mode-bit initialisation on runway assignment.</t>
          </li>
          <li>
            <t>CREATE (<xref target="RFC8881"/> Section 18.4): runway pool file creation.</t>
          </li>
          <li>
            <t>REMOVE (<xref target="RFC8881"/> Section 18.25): 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 InBand or proxy I/O.</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 (<xref target="sec-TRUST_STATEID"/>), REVOKE_STATEID
(<xref target="sec-REVOKE_STATEID"/>), BULK_REVOKE_STATEID
(<xref target="sec-BULK_REVOKE_STATEID"/>): the MDS-to-DS 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 <bcp14>MUST</bcp14> reject any other operation on
a data file with NFS4ERR_NOTSUPP.</t>
        <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 target="RFC8881"/> Section 18.51).</t>
            </li>
            <li>
              <t>SECINFO, SECINFO_NO_NAME (<xref target="RFC8881"/> Sections 18.29, 18.45):
discovery of acceptable security flavours 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 <strong>layout
stateid</strong> returned by a prior LAYOUTGET against the metadata
server (see Section 18.43 of <xref 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
Section 18.32 of <xref 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 target="RFC8881"/> Section 18.16) 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 (<xref target="sec-CHUNK_LOCK"/>), and the lock holder
is identified by chunk_owner4 (the {cg_client_id,
cg_gen_id} pair) 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 target="RFC8881"/> Section 12 byte-range locking applies.</t>
            </dd>
            <dt>I/O authorization on the data server:</dt>
            <dd>
              <t>The layout stateid carried on CHUNK_* operations.  Under
tight coupling (<xref target="sec-tight-coupling-control"/>), the
metadata server registers each issued layout stateid
with the data server via TRUST_STATEID
(<xref target="sec-TRUST_STATEID"/>) and the data server validates
subsequent CHUNK_* stateids against the trust table.
Under loose coupling, the data server treats the layout
stateid as an opaque per-client token and authorizes 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 target="RFC8881"/>
Section 8.2.2 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 client selected by
CB_CHUNK_REPAIR (<xref target="sec-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
<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 erasure-coded 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>MDS-Driven Truncate on Erasure-Coded Files</name>
          <t>A client that wants to truncate an erasure-coded 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.</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
(<xref target="I-D.haynes-nfsv4-flexfiles-v2-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_coding_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 target="RFC8881"/> Section 13.6 and the
Flexible File Version 1 Layout Type in <xref target="RFC8435"/>:</t>
          <t>Required:</t>
          <ul spacing="normal">
            <li>
              <t>READ (<xref target="RFC8881"/> Section 18.22).</t>
            </li>
            <li>
              <t>WRITE (<xref target="RFC8881"/> Section 18.32).</t>
            </li>
            <li>
              <t>COMMIT (<xref target="RFC8881"/> Section 18.3).</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 target="RFC7862"/> Section 15.10): hole-aware reads.</t>
            </li>
            <li>
              <t>SEEK (<xref target="RFC7862"/> Section 15.11): hole and data detection.</t>
            </li>
            <li>
              <t>ALLOCATE (<xref target="RFC7862"/> Section 15.1): space reservation hint.</t>
            </li>
          </ul>
          <t>The client <bcp14>MUST NOT</bcp14> send:</t>
          <ul spacing="normal">
            <li>
              <t>DEALLOCATE (<xref target="RFC7862"/> Section 15.4): 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-ffv2encodingmirrored-ffv2encodingmojette-ffv2encodingrsvandermonde">
          <name>Chunked Data Files (FFV2<em>ENCODING_MIRRORED, FFV2_ENCODING_MOJETTE</em>*, FFV2_ENCODING_RS_VANDERMONDE)</name>
          <t>For a mirror whose ffv2m_coding_type_data is any of the chunked
coding types defined in this document
(FFV2<em>ENCODING_MIRRORED, FFV2_ENCODING_MOJETTE_SYSTEMATIC,
FFV2_ENCODING_MOJETTE_NON_SYSTEMATIC,
FFV2_ENCODING_RS_VANDERMONDE), client operations use the CHUNK</em>*
operations rather than READ / WRITE / COMMIT.</t>
          <t>Required for all erasure-coded clients:</t>
          <ul spacing="normal">
            <li>
              <t>CHUNK_WRITE (<xref target="sec-CHUNK_WRITE"/>).</t>
            </li>
            <li>
              <t>CHUNK_READ (<xref target="sec-CHUNK_READ"/>).</t>
            </li>
            <li>
              <t>CHUNK_FINALIZE (<xref target="sec-CHUNK_FINALIZE"/>).</t>
            </li>
            <li>
              <t>CHUNK_COMMIT (<xref target="sec-CHUNK_COMMIT"/>).</t>
            </li>
            <li>
              <t>CHUNK_HEADER_READ (<xref target="sec-CHUNK_HEADER_READ"/>).</t>
            </li>
            <li>
              <t>CHUNK_LOCK (<xref target="sec-CHUNK_LOCK"/>) and CHUNK_UNLOCK
(<xref target="sec-CHUNK_UNLOCK"/>).</t>
            </li>
            <li>
              <t>CHUNK_ROLLBACK (<xref target="sec-CHUNK_ROLLBACK"/>).</t>
            </li>
          </ul>
          <t>Required for clients that participate in repair:</t>
          <ul spacing="normal">
            <li>
              <t>CHUNK_ERROR (<xref target="sec-CHUNK_ERROR"/>).</t>
            </li>
            <li>
              <t>CHUNK_REPAIRED (<xref target="sec-CHUNK_REPAIRED"/>).</t>
            </li>
            <li>
              <t>CHUNK_WRITE_REPAIR (<xref target="sec-CHUNK_WRITE_REPAIR"/>).</t>
            </li>
          </ul>
          <t>Clients <bcp14>MUST NOT</bcp14> send:</t>
          <ul spacing="normal">
            <li>
              <t>READ, WRITE, COMMIT against an erasure-coded 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_coding_type_data before issuing I/O.</t>
            </li>
            <li>
              <t>READ_PLUS, SEEK, ALLOCATE, DEALLOCATE against an erasure-coded data file.  Chunk-level allocation is a
metadata-server responsibility.</t>
            </li>
            <li>
              <t>SETATTR against an erasure-coded 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
<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; erasure-coded files use CHUNK_LOCK, and
mirrored files rely on metadata-server coordination.</t>
            </li>
            <li>
              <t>DELEGPURGE, DELEGRETURN, WANT_DELEGATION (<xref target="RFC8881"/> Sections
18.5, 18.6 and <xref target="RFC7862"/> Section 15.3).  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 file-creation use, not metadata server runway creation), 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 MDS-to-DS
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>
          </ul>
        </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 target="RFC8881"/> Section 20.3).</t>
          </li>
          <li>
            <t>CB_NOTIFY_DEVICEID (<xref target="RFC8881"/> Section 20.12).</t>
          </li>
          <li>
            <t>CB_RECALL_ANY (<xref target="RFC8881"/> Section 20.6).</t>
          </li>
          <li>
            <t>CB_CHUNK_REPAIR (<xref target="sec-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 target="RFC8881"/> Section 17 (<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 target="RFC8881"/> Section 17 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 target="RFC8881"/> Section 17 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 target="RFC8881"/> Section 17'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 target="RFC8881"/> Section 17; 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> (mirrored); <bcp14>MUST NOT</bcp14> (erasure-coded)</td>
              <td align="left">
                <bcp14>MAY</bcp14></td>
            </tr>
            <tr>
              <td align="left">READ_PLUS, SEEK, ALLOCATE</td>
              <td align="left">
                <bcp14>OPTIONAL</bcp14> (mirrored); <bcp14>MUST NOT</bcp14> (erasure-coded)</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> (erasure-coded); <bcp14>MUST NOT</bcp14> (mirrored)</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> (erasure-coded repair clients); <bcp14>MUST NOT</bcp14> (mirrored)</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>
          </tbody>
        </table>
      </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
Section 18.44.1 of <xref 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 Section 15.6
of <xref 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
ffv2l_read.  Both WRITE and COMMIT operations are used for the
ff_io_latency4 ffv2l_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 Section 3.3.1 of <xref 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[
   /// struct ffv2_layoutupdate4 {
   ///         netaddr4         ffv2l_addr;
   ///         nfs_fh4          ffv2l_fhandle;
   ///         ffv2_io_latency4 ffv2l_read;
   ///         ffv2_io_latency4 ffv2l_write;
   ///         nfstime4         ffv2l_duration;
   ///         bool             ffv2l_local;
   /// };
   ///
]]></sourcecode>
          </figure>
          <t>ffv2l_addr differentiates which network address the client is connected
to on the storage device.  In the case of multipathing, ffv2l_fhandle
indicates which read-only copy was selected. ffv2l_read and ffv2l_write
convey the latencies for both READ and WRITE operations, respectively.
ffv2l_duration is used to indicate the time period over which the
statistics were collected.  If true, ffv2l_local indicates that 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.</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
implementation, 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 ffv2l_addr uniquely identifies
both the storage path and the network route to it.  Finally,
ffv2l_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 Section 15.6 of <xref 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 Section 15.7 of <xref 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>
      <artwork><![CDATA[
                          {{fig-layouthint4-v1}}
]]></artwork>
      <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 coding 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 Section 12.5.5 of <xref 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.  Section
22.3 of <xref 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 Section
12.5.5 of <xref 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
FFv1-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
(<xref target="sec-TRUST_STATEID"/>), it can revoke per-client access
without rotating credentials by issuing REVOKE_STATEID
(<xref target="sec-REVOKE_STATEID"/>) to each affected data server, or
BULK_REVOKE_STATEID (<xref target="sec-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
erasure-coded layouts because it is per-client and avoids
the FFv1 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 erasure-coded
mirrors with trusted stateids.  The metadata server rotates
synthetic ids for the PASSTHROUGH mirror's data file and
issues REVOKE_STATEID for the erasure-coded 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_CODING_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;
   ///
]]></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_CODING_NOT_SUPPORTED</td>
              <td align="left">10097</td>
              <td align="left">
                <xref target="sec-NFS4ERR_CODING_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>
          </tbody>
        </table>
        <section anchor="sec-NFS4ERR_CODING_NOT_SUPPORTED">
          <name>NFS4ERR_CODING_NOT_SUPPORTED (Error Code 10097)</name>
          <t>The client requested a ffv2_coding_type4 which the metadata server
does not support.  I.e., if the client sends a layout_hint requesting
an erasure coding 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 coding 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 client 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_SPARE and
FFV2_DS_FLAGS_REPAIR data servers available in the layout.</t>
          <t>On receipt, the metadata server <bcp14>MUST NOT</bcp14> retry the repair by
selecting a different client -- the payload is damaged and the
metadata server transitions the affected file or byte range into
an implementation-defined damaged state.  Operator notification
and restore-from-snapshot are out of scope for 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 MDS-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>
      <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 Section 15 of <xref target="RFC8881"/> and Section 11 of <xref 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_IO, NFS4ERR_NOTSUPP, 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_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_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>
          </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 Section 15 of <xref target="RFC8881"/> and Section 11 of <xref 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_CODING_NOT_SUPPORTED, NFS4ERR_INVAL, NFS4ERR_IO, NFS4ERR_ISDIR, NFS4ERR_LOCKED, NFS4ERR_NOTSUPP, NFS4ERR_OLD_STATEID, 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 Section 18 of <xref target="RFC8881"/> and Section 15 of <xref 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_CODING_NOT_SUPPORTED</td>
              <td align="left">CB_CHUNK_REPAIR, LAYOUTGET</td>
            </tr>
            <tr>
              <td align="left">NFS4ERR_PAYLOAD_LOST</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 Section 18.35 of <xref 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.  Section 13.1
of <xref 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 Coding 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>
    <section anchor="new-nfsv42-common-data-structures">
      <name>New NFSv4.2 Common Data Structures</name>
      <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>On the wire, a single CHUNK_WRITE carries the 8-byte
chunk_guard4 header followed by the tagged checksum4 and
then the opaque 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 per-chunk framing only.</t>
        <figure anchor="fig-chunk-wire-layout">
          <name>Per-chunk wire layout</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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          cg_gen_id                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         cg_client_id                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       cs_algorithm                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        cs_value_len                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    cs_value ... (variable)                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    opaque payload ...                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Bytes 0-3:    cg_gen_id      (per-chunk generation counter)
   Bytes 4-7:    cg_client_id   (owning-client short id)
   Bytes 8-11:   cs_algorithm   (checksum_algorithm4)
   Bytes 12-15:  cs_value_len   (XDR opaque length prefix)
   Bytes 16-N:   cs_value       (checksum bytes; length per
                                 cs_algorithm's registered output)
   Bytes N+1-M:  opaque payload (encoded shard; variable length)

   The checksum block (cs_algorithm + cs_value_len + cs_value)
   is the XDR encoding of one checksum4 ({{fig-checksum4}}).
   For CHECKSUM_ALG_NONE the cs_value_len is zero and the
   payload follows immediately after byte 15.
]]></artwork>
        </figure>
        <t>The chunk_guard4 (see <xref target="fig-chunk_guard4"/>) is effectively a 64-bit
value identifying a specific write transaction on a specific chunk.
It has two fields:</t>
        <dl>
          <dt>cg_gen_id:</dt>
          <dd>
            <t>A per-chunk monotonic generation counter.  Each chunk's gen_id
starts at 0 when the chunk is first written and is incremented
on each successful 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.</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 two chunks were written
by the same transaction) and numeric comparison (to implement
the tiebreaker rule below).</t>
          </dd>
          <dt>Uniqueness contract:</dt>
          <dd>
            <t>The pair (cg_gen_id, cg_client_id) uniquely identifies a write
transaction on a chunk.  Neither field alone is globally
unique; two clients <bcp14>MAY</bcp14> independently write with the same
cg_gen_id on the same chunk (in particular, both may write
with cg_gen_id equal to some prior value + 1), and the
cg_client_id is what makes the resulting transactions
distinguishable.</t>
          </dd>
          <dt>Deterministic tiebreaker for concurrent writers:</dt>
          <dd>
            <t>When two or more clients race on the same chunk in the
multi-writer mode, the client whose cg_client_id compares
numerically lowest <bcp14>MUST</bcp14> ultimately be the one whose write
reaches COMMITTED on the affected data servers.  The rule is
enforced in two stages:
</t>
            <ul spacing="normal">
              <li>
                <t><strong>At CHUNK_WRITE</strong> (per data server, arrival-order): a
data server accepts the first CHUNK_WRITE whose
chunk_guard4 CAS check succeeds against its current
chunk_guard4 value.  Later writers whose CAS fails receive
NFS4ERR_CHUNK_GUARDED.  Because arrival order can differ
between data servers, different subsets of the mirror set
may accept different clients' writes in this stage; that
is expected transient divergence, not a violation of the
tiebreaker rule.</t>
              </li>
              <li>
                <t><strong>At CHUNK_FINALIZE</strong> (numeric comparison, mirror-set
convergence): CHUNK_FINALIZE against a chunk whose current
PENDING write is owned by cg_client_id C_current <bcp14>MUST</bcp14>
compare the caller's cg_client_id C_caller numerically
against C_current.  If C_caller &lt; C_current, the data
server accepts the FINALIZE against the caller's PENDING
write and discards the higher-numbered writer's
state.  If C_caller &gt; C_current, the data server rejects
the FINALIZE with NFS4ERR_CHUNK_GUARDED and the caller's
client <bcp14>MUST</bcp14> re-read the chunk.  If C_caller == C_current
(same client re-finalizing its own write), FINALIZE
proceeds normally.  This is where the "lowest cg_client_id
wins" invariant is enforced globally: after every affected
data server has processed each racing client's FINALIZE
attempt, the mirror set converges on the numerically
lowest cg_client_id's write.</t>
              </li>
            </ul>
            <t>A client that observes NFS4ERR_CHUNK_GUARDED on either
CHUNK_WRITE or CHUNK_FINALIZE <bcp14>MUST</bcp14> re-read the chunk and <bcp14>MAY</bcp14>
retry its write with a refreshed cg_gen_id.  A client that
detects no 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"/>.</t>
          </dd>
        </dl>
        <t>The numeric ordering of cg_client_id values is arbitrary with
respect to the clients' external identities -- it is a
deterministic total order over the opaque 32-bit values, not a
preference ordering over the clients themselves.  A deployment
that requires a specific client to win a race <bcp14>MUST</bcp14> arrange
cg_client_id assignment at the metadata server; the protocol does
not provide a preference mechanism at layout-grant time.</t>
        <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 client 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 any layout the data
server has been told about (via TRUST_STATEID) <bcp14>MUST</bcp14> be
rejected.  Unknown cg_client_id values are treated as stale
layouts; the data server returns the error specified in
<xref target="sec-tight-coupling-control"/> for unknown stateids.</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>Reserved cg_client_id Value: CHUNK_GUARD_CLIENT_ID_MDS</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 MDS-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 MDS-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>
        </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_guard4   co_guard;
   ///     uint32_t       co_chunk_id;
   /// };
]]></sourcecode>
        </figure>
        <t>The chunk_owner4 (see <xref target="fig-chunk_owner4"/>) is used to determine
when and by whom a block was written.  The co_chunk_id is used
to identify the chunk and <bcp14>MUST</bcp14> be the index of the chunk within
the file.  I.e., it is the offset of the start of the chunk
divided by the chunk length.  The co_guard is a chunk_guard4
(see <xref target="sec-chunk_guard4"/>), used to identify a given
transaction.</t>
        <t>The co_guard is like the change attribute (see Section 5.8.1.4 of
<xref target="RFC8881"/>) in that each chunk write by a given client has to have
an unique co_guard.  I.e., it can be determined which transaction
across all data files that a chunk corresponds.</t>
      </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>
        </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,
   ///
   /// /* MDS-to-DS control-plane operations for tight coupling */
   ///
   ///  OP_TRUST_STATEID       = 89,
   ///  OP_REVOKE_STATEID      = 90,
   ///  OP_BULK_REVOKE_STATEID = 91,
   ///
]]></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;
]]></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;
]]></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)
are sent by the metadata server to storage devices on the
MDS-to-DS control session (see
<xref target="sec-tight-coupling-control-session"/>); they <bcp14>MUST NOT</bcp14> be sent by
pNFS clients.</t>
      <t>All CHUNK_* operations <bcp14>MUST</bcp14> be issued under an active flexible
file v2 layout obtained via LAYOUTGET against the metadata
server.  A data server receiving a CHUNK_* operation from a
client that does not hold a current layout stateid for the
target file <bcp14>MUST</bcp14> reject the operation with NFS4ERR_BAD_STATEID.
In trusted-stateid tight coupling, the stateid presented <bcp14>MUST</bcp14> be
present in the data server's trust table; an unknown stateid
<bcp14>MUST</bcp14> be rejected with NFS4ERR_BAD_STATEID per
<xref target="sec-TRUST_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 outside an active layout is operating outside
this specification; the data server's behaviour in that case is
undefined.  See <xref target="sec-system-model-chunk-not-block"/> for the
distinction between the CHUNK_* surface 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>
        </tbody>
      </table>
      <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 */
   ///     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 Section 18.3 of <xref 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.  A zero cca_count, or a cca_offset beyond
the data server's highest chunk, is not an error; the
data server returns NFS4_OK with an empty ccr_status
array.</t>
            </dd>
            <dt>cca_chunks:</dt>
            <dd>
              <t>an array of chunk_owner4 entries
(<xref target="fig-chunk_owner4"/>) naming the specific
(cg_gen_id, cg_client_id, co_id) generations to
commit.  Each entry's co_id <bcp14>MUST</bcp14> fall within
[cca_offset, cca_offset + cca_count); an entry whose
co_id is outside the range 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
cg_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 would appear redundant given
cca_chunks contains explicit co_id values, but they exist
because 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
(cg_gen_id, cg_client_id) generation to advance to
COMMITTED; cca_offset and cca_count bound the work scope
so the data server can reject malformed requests that
name chunks 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 (<xref target="sec-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 (for example,
NFS4ERR_BADXDR, NFS4ERR_SERVERFAULT).</t>
            </dd>
          </dl>
          <t>Unlike CHUNK_READ (<xref target="sec-CHUNK_READ"/>) and CHUNK_WRITE
(<xref target="sec-CHUNK_WRITE"/>), CHUNK_COMMIT has no explicit
stateid field in its arguments.  The data server
authorizes CHUNK_COMMIT against the stateid context the
compound has already established, typically the stateid
carried on an immediately preceding PUTFH or an earlier
CHUNK_* operation in the same compound.  Under
trusted-stateid tight coupling (<xref target="sec-TRUST_STATEID"/>),
the data server applies the trust-table check to
whichever layout stateid the compound has presented; if
no layout stateid has been presented or the presented
stateid is not in the trust table, the data server
rejects CHUNK_COMMIT with NFS4ERR_BAD_STATEID.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned.  If the current filehandle
represents an object of type NF4DIR, NFS4ERR_ISDIR is
returned.  If the current filehandle designates a
symbolic link, NFS4ERR_SYMLINK is returned.  In all
other cases of non-regular-file filehandles,
NFS4ERR_WRONG_TYPE is returned.</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>
              <li>
                <t>If the target chunk is already COMMITTED at the generation
identified by the cca_chunks entry's cg_gen_id, 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 Section 12.8 of <xref 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_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 (Section 2.10.6.4
of <xref 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 MDS-escrow owner
(CHUNK_GUARD_CLIENT_ID_MDS, see <xref target="sec-chunk_guard_mds"/>)
holds the lock while the repair client 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 (<xref target="sec-CHUNK_WRITE_REPAIR"/>) and the
repair is confirmed via CHUNK_REPAIRED (<xref target="sec-CHUNK_REPAIRED"/>).</t>
          <t>CHUNK_ERROR has no direct analog in <xref target="RFC8881"/>.  The closest
parallel is LAYOUTERROR (<xref target="RFC7862"/> Section 15.6), 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 (cg_gen_id, cg_client_id) 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).</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 */
   ///     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 (<xref target="sec-CHUNK_COMMIT"/>); the FINALIZED transition
is the writer's signal that it will issue no further
CHUNK_WRITEs for the named (cg_gen_id, cg_client_id)
generation of each chunk.</t>
          <t>CHUNK_FINALIZE has no direct analog in <xref target="RFC8881"/>: the COMMIT
operation in <xref target="RFC8881"/> Section 18.3 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.  A zero cfa_count, or a cfa_offset beyond
the data server's highest chunk, is not an error; the
data server returns NFS4_OK with an empty cfr_status
array.</t>
            </dd>
            <dt>cfa_chunks:</dt>
            <dd>
              <t>an array of chunk_owner4 entries
(<xref target="fig-chunk_owner4"/>) naming the specific
(cg_gen_id, cg_client_id, co_id) generations to
finalize.  Each entry's co_id <bcp14>MUST</bcp14> fall within
[cfa_offset, cfa_offset + cfa_count); an entry whose
co_id is outside the range 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
cg_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
(<xref target="sec-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 this offset (the chunk is EMPTY,
FINALIZED at a different generation, or COMMITTED),
or the entry's co_id is outside the
[cfa_offset, cfa_offset + cfa_count) range.</t>
                </li>
                <li>
                  <t>NFS4ERR_CHUNK_GUARDED -- the chunk is PENDING but
at a different (cg_gen_id, cg_client_id) than the
one named in the cfa_chunks entry.  A client that
sees this has lost a race; see <xref target="sec-chunk_guard4"/>.</t>
                </li>
                <li>
                  <t>NFS4ERR_CHUNK_LOCKED -- the chunk is locked by a
CHUNK_LOCK (<xref target="sec-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 (for example,
NFS4ERR_BADXDR, NFS4ERR_SERVERFAULT).</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 (<xref target="sec-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 has no explicit stateid
field in its arguments.  The data server authorizes
CHUNK_FINALIZE against the stateid context the compound
has already established, typically the stateid carried on
an immediately preceding PUTFH or an earlier CHUNK_*
operation in the same compound.  Under trusted-stateid
tight coupling (<xref target="sec-TRUST_STATEID"/>), the data server
applies the trust-table check to whichever layout stateid
the compound has presented; if no layout stateid has been
presented or the presented stateid is not in the trust
table, the data server rejects CHUNK_FINALIZE with
NFS4ERR_BAD_STATEID.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned.  If the current filehandle
represents an object of type NF4DIR, NFS4ERR_ISDIR is
returned.  If the current filehandle designates a
symbolic link, NFS4ERR_SYMLINK is returned.  In all
other cases of non-regular-file filehandles,
NFS4ERR_WRONG_TYPE is returned.</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[
   /// struct CHUNK_HEADER_READ4resok {
   ///     bool            chrr_eof;
   ///     nfsstat4        chrr_status<>;
   ///     bool            chrr_locked<>;
   ///     chunk_owner4    chrr_chunks<>;
   /// };
]]></sourcecode>
          </figure>
          <figure anchor="fig-CHUNK_HEADER_READ4res">
            <name>XDR for CHUNK_HEADER_READ4resok</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, 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 (<xref target="sec-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.</t>
            </dd>
          </dl>
          <t>The CHUNK_HEADER_READ result returns four 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
(<xref target="sec-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 boolean.  TRUE if the chunk currently has a
CHUNK_LOCK (<xref target="sec-CHUNK_LOCK"/>) held by some
chunk_owner4; FALSE otherwise.  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_chunks:</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>
          </dl>
          <t>The operation has several uses:</t>
          <dl>
            <dt>Whole-file repair scan:</dt>
            <dd>
              <t>A repair client selected via CB_CHUNK_REPAIR
(<xref target="sec-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 (cg_client_id,
cg_gen_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 chunk_guard4 (the
cohort-atomicity property in
<xref target="sec-system-model-consistency"/>).  If the guards
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>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
(<xref target="sec-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).</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_chunks 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_chunks 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_chunks 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;
   ///
   /// struct CHUNK_LOCK4args {
   ///     /* CURRENT_FH: file */
   ///     stateid4        cla_stateid;
   ///     offset4         cla_offset;
   ///     count4          cla_count;
   ///     uint32_t        cla_flags;
   ///     chunk_owner4    cla_owner;
   /// };
]]></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 (<xref target="sec-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 target="RFC8881"/>
Section 18.10) 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 client 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.  Currently
defined: CHUNK_LOCK_FLAGS_ADOPT (lock-ownership
transfer; see "Lock Transfer via
CHUNK_LOCK_FLAGS_ADOPT" below).  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 sentinels
CHUNK_GUARD_CLIENT_ID_NONE and
CHUNK_GUARD_CLIENT_ID_MDS <bcp14>MUST NOT</bcp14> appear as the
cg_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 cg_client_id, not the MDS-escrow sentinel,
even when adopting from an MDS-escrow holder.)</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
(<xref target="sec-CHUNK_UNLOCK"/>) or implicitly when the holder's
lease expires; on lease expiry without explicit
release, the data server transitions the lock to the
MDS-escrow owner if the metadata server has revoked
the holder's stateid via REVOKE_STATEID
(<xref target="sec-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).</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 client for the range by the metadata server,
typically via CB_CHUNK_REPAIR (<xref target="sec-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.  The mechanism by which the data server determines
designation is coupling-model dependent:</t>
            <ul spacing="normal">
              <li>
                <t>In a tightly coupled deployment, the metadata server notifies the
data server via the control protocol (e.g., TRUST_STATEID with
the new client's stateid or a similar facility).</t>
              </li>
              <li>
                <t>In a loosely coupled deployment, the data server <bcp14>MAY</bcp14> rely on the
metadata server's authentication of the client and accept ADOPT
from any authenticated client holding a current layout that
includes the range.  The write-hole exposure cost is that a misbehaving
client can trigger spurious ownership transfers; the write-hole
exposure is bounded by the chunk_guard4 checks that subsequent
CHUNK_WRITEs from displaced writers experience.</t>
              </li>
            </ul>
            <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 client'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 cg_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>
        <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;
   ///     uint32_t        cr_payload_id;
   ///     bool            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 Section 18.22 of <xref 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
computed over the chunk payload (cr_chunk) at
CHUNK_FINALIZE or CHUNK_COMMIT time and persisted with
the chunk metadata.  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 chunk_owner4 carrying the chunk_guard4 and chunk-id
of the COMMITTED generation being returned.  A client
reading from multiple data servers in an erasure-coded
layout <bcp14>MUST</bcp14> compare cr_owner.co_guard across data
servers; agreement of the chunk_guard4 across the k
data shards is the atomicity invariant on which
reconstruction depends.  See
<xref target="sec-system-model-consistency"/>.</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>TRUE if the chunk currently has a CHUNK_LOCK
(<xref target="sec-CHUNK_LOCK"/>) held against it; FALSE otherwise.
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 cg_client_id
= CHUNK_GUARD_CLIENT_ID_NONE, see <xref target="sec-chunk_guard_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 surviving
shards' chunk_owner4 values, not from any single data
server's crr_eof.</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 Section 18.43
of <xref 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 behaviours 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 target="RFC8881"/> Section 12.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned.  If the current filehandle
represents an object of type NF4DIR, NFS4ERR_ISDIR is
returned.  If the current filehandle designates a symbolic
link, NFS4ERR_SYMLINK is returned.  In all other cases of
non-regular-file filehandles, NFS4ERR_WRONG_TYPE is
returned.</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>
            <artwork><![CDATA[
        Data Server 2
  +--------------------------------+
  | CHUNK_READ4resok               |
  +--------------------------------+
  | crr_eof: true                  |
  | crr_chunks[0]:                 |
  |     cr_checksum: 0x3faddace    |
  |     cr_owner:                  |
  |         co_chunk_id: 2         |
  |         co_guard:              |
  |             cg_gen_id   : 3    |
  |             cg_client_id: 6    |
  |     cr_payload_id: 1           |
  |     cr_chunk: ....             |
  | crr_chunks[0]:                 |
  |     cr_checksum: 0xdeade4e5    |
  |     cr_owner:                  |
  |         co_chunk_id: 3         |
  |         co_guard:              |
  |             cg_gen_id   : 0    |
  |             cg_client_id: 0    |
  |     cr_payload_id: 1           |
  |     cr_chunk: 0000...00000     |
  | crr_chunks[0]:                 |
  |     cr_checksum: 0x7778abcd    |
  |     cr_owner:                  |
  |         co_chunk_id: 4         |
  |         co_guard:              |
  |             cg_gen_id   : 3    |
  |             cg_client_id: 6    |
  |     cr_payload_id: 1           |
  |     cr_chunk: ....             |
  +--------------------------------+
]]></artwork>
          </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
(<xref target="sec-CHUNK_WRITE_REPAIR"/>), advances the new chunks
through CHUNK_FINALIZE (<xref target="sec-CHUNK_FINALIZE"/>) and
CHUNK_COMMIT (<xref target="sec-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 client.  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 client.  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 client that sees NFS4ERR_INVAL <bcp14>SHOULD</bcp14> verify the
chunks via CHUNK_HEADER_READ (<xref target="sec-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).</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 */
   ///     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;
   /// };
]]></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 (<xref target="sec-CHUNK_WRITE"/>) that has not
yet reached COMMITTED via CHUNK_COMMIT
(<xref target="sec-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
(cg_gen_id, cg_client_id, co_id) generations to roll
back.  Each entry's co_id <bcp14>MUST</bcp14> fall within
[cra_offset, cra_offset + cra_count); entries outside
the range are rejected with NFS4ERR_INVAL in the
corresponding crr_status slot (the result struct is
sized to match cra_chunks).  The reserved sentinels
CHUNK_GUARD_CLIENT_ID_NONE and
CHUNK_GUARD_CLIENT_ID_MDS <bcp14>MUST NOT</bcp14> appear as the
cg_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>
          </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 client that wrote reconstructed data via
CHUNK_WRITE_REPAIR (<xref target="sec-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>
          <ul spacing="normal">
            <li>
              <t>Chunks in PENDING with a matching chunk_owner4: 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>
            </li>
            <li>
              <t>Chunks in FINALIZED with a matching chunk_owner4: the
data server deletes the FINALIZED payload and the
persisted finalization metadata, restoring the chunk
to its prior state.</t>
            </li>
            <li>
              <t>Chunks not in PENDING or FINALIZED at the named
generation, or whose chunk_owner4 does not match: the
corresponding crr_status slot reports NFS4ERR_INVAL
and the chunk is left unchanged.</t>
            </li>
          </ul>
          <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 client is
restoring a prior COMMITTED generation that another
client incorrectly advanced.  In this case the data
server replaces the current COMMITTED generation with
the chunk_owner4 named in the cra_chunks entry, which
<bcp14>MUST</bcp14> itself name a generation already persisted at the
data server (typically the prior COMMITTED kept under
the rollback invariant).  A non-repair CHUNK_ROLLBACK
against a COMMITTED chunk is rejected with
NFS4ERR_INVAL.</t>
          </section>
          <section anchor="stateid-and-authorization">
            <name>Stateid and Authorization</name>
            <t>Like CHUNK_COMMIT, CHUNK_ROLLBACK has no explicit
stateid field in its arguments.  The data server
authorizes CHUNK_ROLLBACK against the stateid context
the compound has already established, typically the
stateid carried on an immediately preceding PUTFH or an
earlier CHUNK_* operation.  Under trusted-stateid tight
coupling (<xref target="sec-TRUST_STATEID"/>), the data server
applies the trust-table check to whichever layout
stateid the compound has presented; if no layout
stateid has been presented or the presented stateid is
not in the trust table, the data server rejects
CHUNK_ROLLBACK with NFS4ERR_BAD_STATEID.</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).</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_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 (<xref target="sec-CHUNK_LOCK"/>).
CHUNK_UNLOCK is loosely analogous to LOCKU (<xref target="RFC8881"/>
Section 18.12) 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 cg_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 sentinels CHUNK_GUARD_CLIENT_ID_NONE and
CHUNK_GUARD_CLIENT_ID_MDS <bcp14>MUST NOT</bcp14> appear as the
cg_client_id of cua_owner; see
<xref target="sec-chunk_guard_none"/> and <xref target="sec-chunk_guard_mds"/>.
In particular, a repair client releasing a lock it
adopted from the MDS-escrow owner uses its own
cg_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 (<xref target="sec-REVOKE_STATEID"/>) before the
lease lapses, the lock transitions to the MDS-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).</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_owner4       cwa_owner;
   ///     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 Section 18.32 of <xref 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
(<xref target="sec-CHUNK_FINALIZE"/>) and CHUNK_COMMIT
(<xref target="sec-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>cwa_owner (<xref target="fig-chunk_owner4"/>) names the writer's
chunk_owner4: cg_gen_id is the writer's per-chunk
generation counter, cg_client_id is the writer's
metadata-server-assigned client identifier (the reserved
sentinels CHUNK_GUARD_CLIENT_ID_NONE and
CHUNK_GUARD_CLIENT_ID_MDS <bcp14>MUST NOT</bcp14> appear in cwa_owner;
see <xref target="sec-chunk_guard_none"/> and <xref target="sec-chunk_guard_mds"/>),
and co_id is the chunk-index identifier of the first
chunk in the payload (redundant with cwa_offset for a
single-chunk write; the data server <bcp14>MUST</bcp14> treat them as
the same value and <bcp14>MAY</bcp14> reject a mismatch with
NFS4ERR_INVAL).</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.  In
normal operation this matches cwa_owner with cg_gen_id
incremented for each chunk; the field is reported
explicitly so a client that lost track of its
per-chunk gen counter can recover the data server's
view.</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 Section 18.43 of
<xref 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
behaviours 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 target="RFC8881"/> Section 12.</t>
          <t>If the current filehandle is not an ordinary file, an
error <bcp14>MUST</bcp14> be returned.  If the current filehandle
represents an object of type NF4DIR, NFS4ERR_ISDIR is
returned.  If the current filehandle designates a
symbolic link, NFS4ERR_SYMLINK is returned.  In all other
cases of non-regular-file filehandles, NFS4ERR_WRONG_TYPE
is returned.</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:</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>Two clients racing on a chunk in multiple-writer mode
each see chunk_guard4 contention.  One client wins the
per-chunk CAS; if its CHUNK_WRITE had
CHUNK_WRITE_FLAGS_ACTIVATE_IF_EMPTY set and stable was
FILE_SYNC4 or DATA_SYNC4, the winning chunk becomes
COMMITTED.  The losing client sees NFS4ERR_CHUNK_GUARDED
in the corresponding cwr_block_status slot.</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 (for example, NFS4ERR_BADXDR, NFS4ERR_SERVERFAULT).</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_owner4       cwra_owner;
   ///     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_status<>;
   /// };
]]></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
(<xref target="sec-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 client
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 (RS matrix inversion or
Mojette corner-peeling, see <xref target="sec-rs-encoding"/> and
<xref target="sec-mojette-encoding"/>).</t>
          <t>The repair workflow that invokes CHUNK_WRITE_REPAIR is:</t>
          <ol spacing="normal" type="1"><li>
              <t>The repair client (selected per
<xref target="sec-repair-selection"/>) reads surviving chunks from
the remaining data servers via CHUNK_READ
(<xref target="sec-CHUNK_READ"/>).</t>
            </li>
            <li>
              <t>The repair client reconstructs the missing chunks
using the erasure-coding algorithm of the file's
layout.</t>
            </li>
            <li>
              <t>The repair client acquires a CHUNK_LOCK
(<xref target="sec-CHUNK_LOCK"/>) on the target data server to
prevent concurrent writes during repair.  For repair
that adopts an MDS-escrow lock, the CHUNK_LOCK
carries CHUNK_LOCK_FLAGS_ADOPT
(<xref target="sec-chunk_guard_mds"/>).</t>
            </li>
            <li>
              <t>The repair client writes the reconstructed data via
CHUNK_WRITE_REPAIR.</t>
            </li>
            <li>
              <t>The repair client issues CHUNK_FINALIZE
(<xref target="sec-CHUNK_FINALIZE"/>) and CHUNK_COMMIT
(<xref target="sec-CHUNK_COMMIT"/>) to persist the repair.</t>
            </li>
            <li>
              <t>The repair client issues CHUNK_REPAIRED
(<xref target="sec-CHUNK_REPAIRED"/>) to clear the errored state.</t>
            </li>
            <li>
              <t>The repair client releases the lock via CHUNK_UNLOCK
(<xref target="sec-CHUNK_UNLOCK"/>).</t>
            </li>
          </ol>
          <t>The arguments mirror CHUNK_WRITE except that
CHUNK_WRITE_REPAIR has no cwa_flags field (the
activation-shortcut behaviour 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 client.  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_owner:</dt>
            <dd>
              <t>the chunk_owner4 (<xref target="fig-chunk_owner4"/>) the repair
client uses for the reconstructed payload.  The
cg_client_id <bcp14>MUST</bcp14> be the repair client's own
ffv2m_client_id (not CHUNK_GUARD_CLIENT_ID_MDS); the
cg_gen_id is the repair client's locally chosen
per-chunk generation counter.  The reserved sentinels
CHUNK_GUARD_CLIENT_ID_NONE and
CHUNK_GUARD_CLIENT_ID_MDS <bcp14>MUST NOT</bcp14> appear in
cwra_owner; see <xref target="sec-chunk_guard_none"/> and
<xref target="sec-chunk_guard_mds"/>.</t>
            </dd>
            <dt>cwra_payload_id:</dt>
            <dd>
              <t>the payload-id the repair client 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_status:</dt>
            <dd>
              <t>per-chunk acceptance status, one entry per chunk in
the payload, co-indexed.  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_status rather than by
failing the whole operation.</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_status slot to prevent overwriting good data; the
repair client <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).</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;
   ///     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.  It 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
RFC 8881 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 MDS-
to-DS 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 an MDS-to-DS operation; pNFS clients <bcp14>MUST
NOT</bcp14> send it.  The data server <bcp14>MUST</bcp14> verify that the
operation arrived on a session whose owning client presented
EXCHGID4_FLAG_USE_PNFS_MDS at EXCHANGE_ID and reject any
TRUST_STATEID received on a regular client session with
NFS4ERR_PERM.  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_iomode:</dt>
            <dd>
              <t>the iomode of the layout (LAYOUTIOMODE4<em>READ or
LAYOUTIOMODE4_RW).  The data server <bcp14>MAY</bcp14> enforce this
against the CHUNK</em>* operation presented later: a
READ-iomode trust entry does not authorize
CHUNK_WRITE.</t>
            </dd>
            <dt>tsa_expire:</dt>
            <dd>
              <t>the absolute wall-clock time at which the trust
entry becomes invalid if not renewed (see
<xref target="sec-tight-coupling-lease"/>).  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 (<xref target="sec-REVOKE_STATEID"/>) and
BULK_REVOKE_STATEID (<xref target="sec-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).</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 (<xref target="sec-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"/>.  RFC 8881
revokes pNFS layouts via LAYOUTRETURN with a special
all-files marker or via implicit lease expiry;
REVOKE_STATEID is the new MDS-to-DS surface 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 an MDS-to-DS operation; pNFS clients
<bcp14>MUST NOT</bcp14> send it.  The data server <bcp14>MUST</bcp14> verify that the
operation arrived on a session whose owning client
presented EXCHGID4_FLAG_USE_PNFS_MDS at EXCHANGE_ID and
reject any REVOKE_STATEID received on a regular client
session with NFS4ERR_PERM.  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>
          <ul spacing="normal">
            <li>
              <t>CB_LAYOUTRECALL timeout: 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>
            </li>
            <li>
              <t>LAYOUTERROR with NFS4ERR_ACCESS or NFS4ERR_PERM: 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>
            </li>
            <li>
              <t>Explicit LAYOUTRETURN: 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>
            </li>
          </ul>
          <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
MDS-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).</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 (<xref target="sec-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 MDS).</t>
          <t>BULK_REVOKE_STATEID has no analog in <xref target="RFC8881"/>.  RFC 8881
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 an MDS-to-DS operation; pNFS
clients <bcp14>MUST NOT</bcp14> send it.  The data server <bcp14>MUST</bcp14> verify
that the operation arrived on a session whose owning
client presented EXCHGID4_FLAG_USE_PNFS_MDS at EXCHANGE_ID
and reject any BULK_REVOKE_STATEID received on a regular
client session with NFS4ERR_PERM.  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-MDS table clear.</t>
            </dd>
          </dl>
          <t>The metadata server calls BULK_REVOKE_STATEID in any of
the following situations:</t>
          <ul spacing="normal">
            <li>
              <t>Client lease expiry: 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>
            </li>
            <li>
              <t>CB_LAYOUTRECALL with LAYOUTRECALL4_ALL: the metadata
server is recalling all layouts for a client.
BULK_REVOKE_STATEID is the data-server-side
complement.</t>
            </li>
            <li>
              <t>Metadata server restart cleanup: 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>
            </li>
          </ul>
          <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 MDS-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>
    <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-14">
          <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;
   /// };
   ///
   /// struct CB_CHUNK_REPAIR4args {
   ///     nfs_fh4                     ccra_fh;
   ///     stateid4                    ccra_layout_stateid;
   ///     nfstime4                    ccra_deadline;
   ///     cb_chunk_repair_reason4     ccra_reason;
   ///     cb_chunk_range4             ccra_ranges<>;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="results-14">
          <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;
   /// };
]]></sourcecode>
          </figure>
        </section>
        <section anchor="description-14">
          <name>DESCRIPTION</name>
          <t>CB_CHUNK_REPAIR is sent by the metadata server to a
selected pNFS client to request that the client repair one
or more non-atomic chunk ranges on the file's data
servers.  CB_CHUNK_REPAIR is the back-channel companion to
the chunk repair flow: the metadata server selects a
repair client per <xref target="sec-repair-selection"/> (those rules
are normative for how the client <bcp14>MUST</bcp14> respond on receipt
of this callback) and uses CB_CHUNK_REPAIR to deliver the
work item.</t>
          <t>CB_CHUNK_REPAIR has no analog in <xref target="RFC8881"/>.  RFC 8881
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>a wall-clock nfstime4 (seconds and nanoseconds since
the epoch, as defined in Section 3.3.1 of <xref 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 client 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 client
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> prioritise 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
behaviour differs.</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.</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
Section 18.36.3 of <xref 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 fact that a range appears in ccra_ranges implies the
data server holds a chunk lock on the range (the failure
occurred in or around a PENDING or FINALIZED state that
established the lock).  The repair client <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.</t>
          <t>CB_CHUNK_REPAIR returns only a top-level status in
ccrr_status; see "RESPONSE CODES" below for the normative
meanings the metadata server attaches to each returned
nfsstat4.</t>
        </section>
        <section anchor="response-codes-14">
          <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_CODING_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>
          </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="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>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>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>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 surface differs per
authentication model:</t>
        <ul spacing="normal">
          <li>
            <t>Under AUTH_SYS with loose coupling, the residual surface 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 surface 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 attack
surface is 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>
      </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 Section
4.9.1 of <xref 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 honour them.  Deployment defence 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
defences 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-MDS-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 surface 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 client reconstructs and writes shards on behalf of other
clients via CHUNK_WRITE_REPAIR.  A malicious or buggy repair client
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 target="RFC8881"/> Section 18.35.3.  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 introduces the 'Flexible File Version 2 Layout Type
Erasure Coding 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 Coding 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 (uninitialised)</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_coding_type4</tt> value in the reserved
region <bcp14>MUST</bcp14> treat it as an unsupported encoding type
(NFS4ERR_CODING_NOT_SUPPORTED).  Value 0x0000 is reserved as the
uninitialised-field sentinel and <bcp14>MUST NOT</bcp14> be allocated to an
encoding.</t>
      <dl>
        <dt>Standards Track (0x0000-0x00FF):</dt>
        <dd>
          <t>Encoding 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>Encoding 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>Encoding 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>Encoding 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_CODING_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 five encoding types: the flexible file v1 layout-compatible
PASSTHROUGH (see <xref target="sec-encoding-passthrough"/>), the chunked
MIRRORED (see <xref target="sec-encoding-mirrored"/>), and three chunked
erasure coding 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_MIRRORED</td>
            <td align="left">5</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;
covered bytes are the shard payload in transmission order
(no length or type prefix).  The 4-byte <tt>cs_value</tt> carries
the CRC as a big-endian integer.  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 target="RFC3720"/> Section
12.1 and adopted by <xref target="RFC4960"/> Section 6.4 (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; covered bytes are the shard
payload in transmission order.  The 4-byte <tt>cs_value</tt>
carries the CRC as a big-endian integer.</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"/>.  Concrete parameters:
input is processed as a sequence of little-endian 32-bit
words (the shard payload <bcp14>MUST</bcp14> be a multiple of 4 bytes;
implementations that need to checksum non-multiple-of-4
payloads pad with zero bytes and register the padded
variant separately); 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 are the shard payload in
transmission order.</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 are the shard payload in transmission order;
<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>
    <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="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="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>
      </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">
          <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="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="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="SNAPRAID" target="https://www.snapraid.it/">
          <front>
            <title>SnapRAID -- backup program for disk arrays</title>
            <author initials="A." surname="Mazzoleni" fullname="A. Mazzoleni">
              <organization/>
            </author>
            <date/>
          </front>
        </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="ISA-L" target="https://github.com/intel/isa-l">
          <front>
            <title>Intel(R) Intelligent Storage Acceleration Library</title>
            <author>
              <organization>Intel Corporation</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="25" month="May" 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 (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 codecs 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-02"/>
        </reference>
      </references>
    </references>
    <?line 10926?>

<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-and-data-server-and-ecdemo-client">
        <name>reffs (metadata server and 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 (MDS) and a data server (DS) in a flexible file v2 layout
deployment.  <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 with all three erasure coding types defined in this
document.</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 the three encoding families (Reed-Solomon
Vandermonde, Mojette systematic, Mojette non-systematic).</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>The repair data path (CHUNK_LOCK with CHUNK_LOCK_FLAGS_ADOPT,
CHUNK_WRITE_REPAIR, CHUNK_REPAIRED, CHUNK_ROLLBACK, and
CB_CHUNK_REPAIR) is <strong>specified but not yet implemented</strong> in the
prototype.  The corresponding operations currently return
NFS4ERR_NOTSUPP.  A fault-injection test harness is in place to
drive the repair path once it is implemented.</t>
          </li>
          <li>
            <t>The tight-coupling control protocol (TRUST_STATEID,
REVOKE_STATEID, BULK_REVOKE_STATEID) is <strong>specified but not yet
implemented</strong>.  Data servers advertise loose coupling via
<tt>ffdv_tightly_coupled = false</tt>, and synthetic AUTH_SYS
credentials with fencing are used for access control.</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 summarised below.
It is not production-ready; in particular, it does not yet
implement the repair path required to tolerate concurrent-writer
races or multi-data server failure reconstruction.</t>
          </dd>
          <dt>Contact:</dt>
          <dd>
            <t>loghyr@gmail.com.</t>
          </dd>
          <dt>Last update:</dt>
          <dd>
            <t>April 2026.</t>
          </dd>
        </dl>
      </section>
      <section numbered="false" anchor="interoperability-and-benchmarks">
        <name>Interoperability and Benchmarks</name>
        <t>The reffs + ec_demo implementation has been benchmarked against
itself (no second flexible file v2 layout implementation is known to the
authors at the time of writing).  The benchmark suite exercises
four I/O strategies -- plain mirroring, pure striping, Reed-Solomon
Vandermonde, Mojette systematic, and Mojette non-systematic -- at
five file sizes (4 KB, 16 KB, 64 KB, 256 KB, and 1 MB), at two
parity geometries (4+2 and 8+2), and on two platforms (an Apple M4
host running macOS with a Rocky Linux 8.10 Docker container, and a
Fedora 43 native Linux host on aarch64).  Each data point is the
mean of five measured runs.  Data servers run as Docker containers
on a single-host bridge network, so absolute latency numbers
reflect encoding and RPC fan-out cost with near-zero network
latency; real deployments will see higher absolute values but
similar overhead ratios.</t>
        <t>Selected findings:</t>
        <dl>
          <dt>Erasure-coded write overhead is modest at small and mid sizes:</dt>
          <dd>
            <t>At 4 KB to 64 KB payloads, all three encodings add 14% to 21%
write latency relative to plain mirroring.  Above 64 KB the
encoding cost begins to dominate; at 1 MB Reed-Solomon and Mojette
systematic reach approximately +54%, Mojette non-systematic
approximately +62%.</t>
          </dd>
          <dt>The dominant write cost is encoding, not fan-out:</dt>
          <dd>
            <t>A pure-striping variant (6 data shards, no parity) isolates the two
costs.  At 1 MB, plain mirroring writes in 64 ms, striping in
71 ms (+11%), Reed-Solomon in 103 ms (+60%).  Of the 39 ms
Reed-Solomon penalty, only 7 ms comes from parallel fan-out; the
remaining 32 ms is encoding plus two additional parity RPCs.</t>
          </dd>
          <dt>Reconstruction of a missing data shard is essentially free for systematic encodings at 4+2:</dt>
          <dd>
            <t>Reed-Solomon and Mojette systematic
add 1% to 6% to read latency in degraded-1 mode (one data shard
missing, reconstructed from the remaining five).  A client that
discovers a failed data server at read time can reconstruct transparently
with no user-visible latency impact.</t>
          </dd>
          <dt>At 8+2, systematic-encoding reconstruction diverges:</dt>
          <dd>
            <t>Mojette
systematic reconstruction overhead stays at approximately +4% at
1 MB, while Reed-Solomon grows to approximately +54% due to the
O(k^3) cost of inverting a k x k matrix in GF(2^8).  Mojette
systematic's back-projection algorithm scales with m (parity
count) rather than k (data count), so its reconstruction
overhead does not exhibit the same growth at wider geometries.</t>
          </dd>
          <dt>Mojette non-systematic applies a full inverse transform on every read:</dt>
          <dd>
            <t>Regardless of whether any shard is missing.  At
1 MB this produces approximately 4x read overhead at 4+2 and
approximately 7x at 8+2.  The read cost is independent of
failure count, which is the algorithmic trade-off of the
non-systematic form.</t>
          </dd>
          <dt>Results are platform-independent:</dt>
          <dd>
            <t>The largest absolute
latency delta between macOS M4 and Fedora 43 at 1 MB is 20 ms
on writes.  Encoding ordering, overhead percentages, and
qualitative scaling behavior are reproducible across operating
systems and Docker implementations.</t>
          </dd>
        </dl>
        <t>The benchmarks confirm that the protocol's central design claims
hold in practice: client-side erasure coding is affordable at
typical payload sizes; systematic encodings reconstruct missing
shards cheaply; and the scaling properties of the three encoding
families follow directly from their published algorithmic
complexities.</t>
        <t>The benchmarks quantify the algorithmic trade-offs each encoding
family makes: Mojette non-systematic's constant decode cost comes
at a higher baseline read cost, and Reed-Solomon's matrix-
inversion reconstruction grows as O(k^3) at wider geometries.
The choice of default encoding and geometry in a given deployment
follows from these properties applied to the workload's read /
write mix, fault-tolerance target, and acceptable encoding cost.</t>
        <t>A full benchmark report with per-size tables, figures, and the
platform comparison is available alongside the source code.</t>
      </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
<strong>essentially zero</strong>.  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 minimise 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 coding 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 (see <xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>) 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
surface 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
localises 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
organisation 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, defined in
<xref target="I-D.haynes-nfsv4-flexfiles-v2-proxy-server"/>, 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_coding_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_coding_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 serialising 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 localised
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 DS-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:
H4sIAJihY2oAA9y9e3PbWHYv+v/+FDiaumVpQlKWLHfbciaJWpLdSsuSI8nd
0zl1rgKSIIk2CDDYoGT2lPNZzme5n+yu534AoOxOTp37cE31UCQe+7H2eq/f
Gg6HpsmbIjtOPqR1WhRZkVy9vU12V/DfveRtkX3Ox0WWvM3hP5fpplo3yc9Z
bfOqTA5NOh7X2cMxXRZd8nBoptWkTJfw3GmdzprhIt2UmR2WM/twNJzB9TO4
3A4fDofPvzeTtMnmVb05TmwzNVP46zj529nJ3fkXM6lKm5V2bY+Tpl5nJl/V
9Mk2h8+fv34OY6iz9Dh5l5UZDN88VvWneV2tV8fJVdbgXzyu241tsqUb+pH5
lG3g1+lxclE2WV1mzfAMx2mMbdJyep8WVQmD2GTWrPLj5L831WSQ2Kpu6mxm
4dNmyR9glst0tcrL+SCZVMtlVjb2fxjzkJXr7NgkyTeNJUmazQre9gtcAk9K
3uFN8O0yzYvjhJbsn/KsmY2qeg5fp/VkcZwsmmZlj/f38SL8Jn/IRnrRPn6x
P66rR5vt0/37OJa8WazHxwleNXyc817sh3sBFxWw+Lbxj48uHvEjRnkV3bb/
lS0eLZplYUy6bhZVDasyhPckSV7Cnt6Nkh/pNvqKCeZuUS1TG34PU0rL/Pe0
gfU6hh9gnWu7SicZ/ZrxOhXVfLGp/2mOf41gL4wpq3oJ9zzQTty8PT06ODzQ
jy+ffycfX758od++/O67Q/n4/csXz/Xjq+8O/MdD//GFfHx18P0r/Xj04sh/
fKkfX73SJ7w+fPX62Ji8nIWD+1Ck5afX3x/TfOQ8niR366aq87RIgEpusmw6
vK2Kagl/nFZTpBN4RPI2XRfN8K4qgPzLSQarmtycXJwNi/yTUho/NK3nmewr
bOtjNh5l2cSO1s2nUTZd7//Hbyscw778N13BCu+f3g5ffzd88YJ2kB7j9hD+
DXkL/3nEw6fvdA+jL/lA32YrGMw4q5OD16+/hx8uTq5Ohh/Or6JZ73yo8we4
PjnHc7mqc5slV2u8ze50JoIE+vj4OMrTMmW6tzafl3QK9zP3gGHJD9jvTAEn
Afcd01iCsc7Swma8YQevDnSfD16/VJo4fP5Kv33x/eFzR1UHr/Xj6+/025ev
nyshfP/66NARzSFR4NuLD7fDg1fPh0fROtxmk3WdAa3bRXKLLCmtp8nu7Y+3
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
bz6t3n71j1HZXZ+nqzj1e5DUmcRDuF88OCmwz+LhMYkHu1H3JYr81st26et9
Fzi59DKy8k2axhe9tk6K333TpEl73MEo9WWn/GPIuxhPapyUtvoSXTprdx2/
Zxy4TNlEqj1pL3y6jUoLkXmzUEN6k/pMoPA8FYQkUvThLKKLKFuyf52357xo
/ypR6T5uWIxhSk08TUmGYdPepLrAnwZ5o7y29wseklqL2djTKd+a5RNNkjmk
kTPqt/sBE5oghY79odGqaSiYDAmbFlaEcVAfPqwHUpdp2nfFWakiUYE9GwBb
SK6ADd/78lho3KjMTeIsJYnGKXJ3NO2B91EHQIrRjlmDbj9iTqS7BBQdZo2s
Z5Po0Si8pBilI5OYbcdngarZ0aVrqh4HLxxhZEwtGUTxSdE2IbFsMI3wqdff
PVbDfVTa2AoWgsZyk0sZYy9QvMUrYn+9jjFxiKVOnQsjEpNF+4u4vebxiMe+
TF9WO/jPeXtFhqm4m8NhtK7niu/9sj1f1su73Xhu8AriNZvlVnjk5NZQrdmJ
NkI1rd7vjqs3xHnS3cYmcaWy6/w6MRfGU55sHvrrbsokAZ4iWuKXqSaazQc3
LQesDL//qqXrd76+WVT/pviz/7r//+60X/7b7r+SmiaTP370JTjRaiz8UPRk
p+CL0PvX/xV/jv9vb28v/u+//Cvp0tsqL0xtLg71auQtZxrWHETccjTYjfVW
DA/r9L6AepJXYzbW9/jAk0n1LUbwL5iZ2IzJ6kEvq+KjUSnks849NP8ff48+
FOVKITa/6GUzkI+JzRmIPfdlUZ2i1oNYuCl4Mixob/Qe7/F0FIhhTTQRf1ZQ
7MH8OPTNQooLU68phtWOZXTDreuUQvEN7D4rNEvjixAYCOS+xqZ0eyVIyo13
S1FbuPPw05PdA3HYXV72TrOK+8hOFTQ/gold3tTz9i/RXvAmXyYcdvxfBFyo
TWWorD4aSDafUlIgz5nwvKsYHMSOKpCEbok9Psvm9LYBz6OIJVqqL0TTpY3x
MHSLj2wl2/kgEBILOYG2jRRhq95D0QKlnN1SSIY2nkpG9j1gWvOJlIuKN4rT
aUXUVTvfnz6fPp4ezYkvKFdmNyoMOkcblNkx0Uz0SYvq07dPp0+fVEdvf+x1
p9AADv/0T/tkni+aj4pNJBpARbE5oJKyH+7333/dqxlC1/wtQPyjIKT86/56
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
byzngpN6MpSKflA/BsN3o+iVExHUmvyhoyF1IHCA1cV64TuhS053529FwPSz
VgP/QfkpC78b7j2K3lQ1iB+IAR++Omgeoc56aLccYBMhkyW3E/ycdjTMsO2P
INoFmju1Zhmgk3mmEy3sB5+hZKfnFqJus9dbW+xtT5Tv8FtQuvtq60WDTbwL
6cyWjS8SOGodUT0JzTuh1DGd07adPISjbStFlKMHpehFVm3QWTrmFEhrixCO
6wyttC73lDax6LzFwSNl1q5WiyicLMwlhERWm2nTvjoZhn38A4VVswYffOiA
tigiaj6a1q0dEjWASAoQjyD7N4kWy9QFGzQe1VBUg9H2MKhnk4dQUdbKDGuE
15yas9USda1ZOsB4Uq13QVlP7jAee7Yem4l+8YKkP/a5+AsxifH0BAbhlZOW
lcPK4RbAEdnnZItFCNPUGr1Uy5Y7c3rrWc9+peaaft0Jv947K+Luotl9z20A
HEethm/nnpyKv5c7YbWMV5Np3VUt6IfQ6M/lz6Gx7V960GDu3KF1fPdBsEt/
xe7/lboyjNTtrtq+uHwnu3w7XL6Dy3fS5Tv+8nu/lL+ky3fC5fdw+b10+b2u
aEAnbfbA2Qn6ad2U5/9yJnF63SvgAzoLv3RO0OL27R04E8O/2xy2XHWiJjwV
yqkg6TGIha2WSLezLm3LM4pUmLrF2b1f+2j67u9Pd4NFxXqfI8jyMJud34Ns
ChKl8/uvf/n691+/Cf/fD//vhv93uvAWFuGbb/WTe/j0aw7D9hn1OmMRPjOL
pLN9J7xYaLH4+eeTn7d/+RmDcPLzXfyA4eBnd+2zu79gaDpBSYeNFfoVZOwF
1ko9QxUWOptEg4+rwB4UVkJ4n/s9vtUvPXN1YA7xiX5eqq56HK2FfvKBrQmH
s8wmOtMnHtjT7m6j1bt343JqWCiXWohGj6W7RezP3bu8c/sz79wumm9yP67J
3LwK9x2F7h38vKMvCmXDpFSLOcYiwuUZ7vGNn+1JeCwzGEgFCn1zQM2vT693
FZaTWg40G9CI2QZ3aUpgKaNR+3Qbn54lj1bTrytQpGxJry9jAQFdLEgTjs4I
7c8SUlq1V955lgworNEwgx+sb+UH60/4Sd80/HQ4g0/5Q/Gh3+9n/4c7zzBz
Z7iq7SdxZ00h5b/8jzW/vd48Nmn4SUcW1/gxxZU27p9sPXU5Pufp/Ubrdxut
q6S4/yV9b/7E1mOzD6XZjnhu49RCh6TNMfitIt8hTd5uaB6ZAsvzMcKUmOG+
zrBmCgTNwB8dbg08iEu/Z3FqWsyi99z6uIFvQrVip9TquWWkzzgHZpfFH3+s
d+rjR2iGoo9rQC+xYhiLPULWo6BSMvHYqfRJ1TnmljsOUqmOkb2mwVx6g9lA
Hw2HgfrAkRwbdlhkvG2Uho4QjwfKCQqruwElEeZb2uPRN6uwiS3sqseZKvdB
IG94gfBzepvwywns5vJYsXkfGGlGUoPuudDU7tc74fPd8u+Pwj/b8s838s/9
u/+Dy00u2S5f4ENELeXarfvyiV32rW8J8S/+K7/u3PfXaFPbO99aUzv3rfX/
kS9BnYe0+tLIyBJhDu40V2652kCJodQHJ5a7sTFSvw7H25Q/cvjy0F1lMf2J
PGlzYB+axHp3RrUjkIg5MhaDkpLPsDTDKqf4LaI2HF70jVAQwg69Gp4vqnB4
S/A3xc2EQVdPkqAKPilS0SlhFS93npRXixGK7KLwcywENhgt9LLQhvjchJDM
t9AoycZ2lFgk51DSpe0BS3x/3YoMIl4C+xPOuUHYx+9JbCxBhaGEyy30W0Cy
9fviqGGQ+B1K+sxWc7zPWQdnWbf7a+fH29927eD70fDvFqWWp4zSvuW6UK4q
kL/JLzTFVhJu3issesvEDeBhY4haIO1Q8YPsYqb3dGAU6U7TZ/YFuq9cRsIS
G1SsEWqg1hEpaRpnJyhi4mypR4NVxSLI9Ier/bZerjfyTljmTBjl96zeenGx
Ckc/V0VXbBaUGGGJlrByrt4s9UrInxnGZ7goGJwFhifIwcODl4e98hjFPvd/
+Df+1Q97vBtL1YiFA49hI8SfAR/c0hR1qWkI9dpkeDIo/fyBne/sx3DAfXsm
81h2vtnFMqmlIAMQYMWntjmdoZ+z0yPqHkUca+FHDWfFGo1QXDPs2R7yflbL
lVRW4X2AQ7pobbEYXoUf6UtLPBjX82GXBUnCOWIMbr9zJwxQrblaqq9MY7rI
kwm7hb4lAO/6BoOPZiWzV5jy9yOqWoenTmYae7I5CMvyP0mk/UY6O3xPuver
8NhOchFD/BZUvHpYy1+xMjDedbd8V8tL95KrK53qYSfryS7ESUpVcUvRemCv
XQQJdEtIa6zu3zDuxq5BciBkjhWSOyyKJ0ZZvqADQ7EyR8Ew/IcIJCCRphLB
jlvX8B499aMfmRfH0WaK/cut8o/1r2Enb4nCn0VAwlfHuhrptqXo+lE0IXuq
mjawA47LO2HM5E/HHjknPu59t/gHgk9O9xNn0kP/QDWG6bKPIjtoMUmAa50U
sG7xtYDZGdpIhD0zRzj5n6ejblRf1vceCa5j85iif9Kltx03WqxumK3h0HwK
FWmiw7SfPurGoh1uVx2GS1ZTWAh4iGqD2Avn7LaRt9MVKnurSBHeDZtJpc2U
AwovGwMKUcuzk7nZO4Q8VPMrmte667S2ShxxZYeP3jl0tsjdxBMEzkkVmwpH
KhhINByW5ygPg+QNfSZyuch71yvxzUR8i6kvurieXYavoVTi5GYbO0uNPbmJ
fFj+ERYAPDblg3LO/LF+2Nf95dfmzIVv1AE3lh/Lj2wkGMPH1xOFQAh+ljbZ
Xvkhtf+Bjw1/HW7FDs0GA+sP/MH/J/oU/vt623Vsv449Q22ICGBAEMtDrRlJ
AV9LdRWW20rCxWgA0SwUWVx/FXiw+TrcdU/SjI9nCtVeIlxWS411BLvngDxU
IHcTvRNZSv3p8Ep46+dW7p0fxx7Nw7FbL7sksDbOzKBYzaY822OvCsLnrNZQ
2vDSH0GNANIoFQIkfKUgBFXhiuiZlls62B0jbku3caGrEUHcuBphzcaq5LVQ
qMTbKhRshzweOliLXcxpmOL+TprHj3rJN41L7oVLdvx037Mr74VDdDAIF+qV
jYbuN75uNlKctESEeCrFWrysodTcmDgAD4sYJEvaVrb16VJJ33GkBOeoJOAL
qfniLuGQKnm8h8t5neLw5UmQc0EzvLKyNXkntTBqWHPi3nZxomI5Csb4QpOt
wJDImcRWPPQanMhOu1n1k6YcxVHzVNXKZMl0zLLqFilinoYlnTI9jZdJA8kU
iEZKlZsphoyF/hD0DUVf4WCPGRKSNzoaaikas5XGEhdJ3FW4y3BqDSfBYDbX
OpDhOYWDG5FB6fDlqxf7h08+fgQuVKycIbKKlzyRUdVhDG1tzpMRDVA8AD4K
58XtsAq/xjXhp3+WfdS78jH88CvdfQhgTCOmLQuFkElS4n+jqYJFwy13iw5u
fghsj8AHcE67LimW4B/AuuGHo66qLnmfEFABG/0mTVYSXtKYmPWVkPjFLU4k
iNgGt/ylZxgEecw8vLo8+p/h0aHjZy4iWuSKIrcL12E0pMrckNIQFBKZ19eS
2LJ+9YW111UlbmrqV1xinfOgsfKKhzTP2oaSc+X83NmfDbMcmjvfdAtgrmEh
/Rxu/eXncJd6kE8yJfMcutcj4d9IO0KqFuHyR3yxMK+c44flh/kHRBP+ER6/
Dbzyh3/y9yP7fTu5qf8p0Ccxtpy/amZNI4x6Xnfm3azFo9RNce7BzaQx8KyH
odu3yx9VXPy9Wv5n+Sq3Vh+TRh9HUNH4RvndtErL2fSs9E4L1mtQbnIW9AFb
PcoiSif4qAtrO+zdv++f/PvHj1reQ9ESsDhCu96Voa99/PpFZ/Rwe2tr2g2j
dzr6ACTcPzBhYV2EP9n3c/1eB+VHqPqmF89HTN8lcSfzZ9xqBFUG+uoUdtbN
1OqNCP+pmPxnH+iebH6CLoguqUJLo2T9AO6F1zNVVzB9jU4UVC/R3nsz+eKg
WZpHHEQZOw3QFqjkAQ9ySk8SUu4+6z9IXUQ9MLNjUdDpQltNErcV847RuNVg
YFEsULnuKbJJSZszrxVbqMOr1pfXMt0RA8MDmvJ5EPoyrTm0He4ON15rY0WD
t1LWeZpYwBxWdXHLP5f5kkmiPAzy9J8Pt7u3HnD7ny0IbD2TTf0LBx3nSNBC
z3msnf1ToLZuxGV2Z20LV0xL0umej4JgW8jIRPZRibeEZzLRCh2QgRNsZn2m
0SRXY94u6OitYWnUwGBOznStOYrsoZTFRYU8QkOD4D5zo9Ph4X6mS/2sa4DQ
flmfmbXkRg7Fe4ceMA++5PNrBYCZS0sD8nHIzEOJD60LqYtMui4VxBVRSdaH
dJ2Gmvw8KuVhecvcarfC4tjZSuFU6cYiKHn9+XA45jGUVEFba9EpJ8ThHoqF
eVFQlfoJimOAWnesrGStkqu8QXIlgVX4V4uPzZbmFSqHL/Xh4bA/OitXU6Zp
QLL0VfEJYx10uqVyxGZ7XlJSKGAKeRSkTHiPDhcpIzoXw8zq1+RFGeAkWAwO
oc/ns8WBsuhCiFJzCObX7Iq5o9wCIMeVDOe14QVdqWajC2bMzOa0F+PkKMeI
6edh6U7ys0NLXCZcN6OIc/UxCC9Vo0cCkUsS0GRUthMLv5322oRMmdR+ZBUP
4Xp78eSYmW2WcHetGXPodXR9x/2dYlBuUxeyqfWYfaZ+Y6eV28brakWZWB/J
fMxpZeNgXbH2RzX1aXOkKQV5a8HSQ1KRye6vY/yOgeFk0szHrB7w+zLtTlbC
M/AhsqxGVoOgJ2pv7J/6x8EQ9gah7wXpFIKU2KLl9j4o331JQordr+FQjBGG
TdtXZM5julbehEFlHQ5dqcmeSGKb+dZqfVBIPB2BGzfchM5zOVnUDs6FeCOS
bSUGupxNg3i5t0X1xxa3PokOVDpvQR1klgqzWZz0BHL01XA+ZA1olIjBBY3s
cAVjMlCPNy/tzRerKc3Rl51p0MeOwv//6PoMSqoWQx7JnNdC57XNCN3/CRUT
kGVrtXgiOEtLShQOK+OsJkuTmDNf06y88AvJby+GUagW6jdxp1awnud6rL2v
xm/Vq0rTDsvyAWtoKeZWGaBYAbGMwx+Os2oBiDeQlRgO6FrLSrmuysuqZuWz
qYEwFJOnNRy0qCAJ7Y1gRKou7Rh3UOIZCYfLm9HVG5cI0SsQStH8eaR/c80g
9iPk6lYQVp3HC4vb5OGzuJmMficJF3O7CrXEutz5ZJzTDHK4oYq3Hhycxfac
bhQLMFi5kYm7q3Hwfz8MVuKba61hZcnnSCQZRnx/Q/0PI22HZ3po1Bu0VEyx
+YDODXZu+OesGelqUTaVAu5tU0XWdRCrkuBUIDufZHM/Tr1pKgdRM2hoBK/a
UdIvO5OwSd92YWTDvR2WEfdg2PaDd2HRIozP5l4dFxUDYSkXDdod83i+tWAJ
XOk3LJYWy2HTgmmEvXuF1Dz9Opv8Mp/8g0QcoDPvGOVNVESr3TwzxoIvqWDg
59C0aqZCLYZXiFIi6XJ2WRihP60ZSRcD/07Yg0DVVvWQgoI94AAzXJ7eWEfJ
PPoOB8JVLpSXRXH79vF4tgRiNSkdk3DcYPnevq3WUvTOemce3fbW/EicoW4+
Pr05Hzh3K9DUZwIfPnMFZt9myzIcaovoAF509zRgV6qH+uytIp59C5M2NTnW
oW/xO6s709WiapizhEBnBm2wEjNneTkqZxcXqzkWbXpFvCE90GdhBfe5fOtP
DldjaT5ovvLdlldOgaDWV9fiFJtfffPbFGXmIcdOvH37kfdp4QhouHS4jH5c
/1xxQOqXlD1WD5FjSQglro6RhXBBX1yDfFLRgYpy1+IL+OVRf1viCukYuqrm
JdnRKgkkmKtV+FZo0WYRdsgbUXDzmCapPGLHCiArQEMYelYJyMLGLZrpyiep
+YpUcTWd0aTtkuVS9Tm5x3c0lXE9cooCti3H8fWUfBGvjntxZ2fYSl4ZXjAs
hXNnRxCu+KTpM/xQPsLAdx4JpuDo4f3tnV75j4e7QFrB+dXRTLMfH37bTaiq
DoIX27j9/s42UFHb33xLAFQHwQj5YvtbfrG7q19sxy/u84udu/LFps83NdT6
ZINUGVAJa6wvKCrFVsWxaowp33v36/C03b8/illz4XUBsrp9m2UscaWB+MPA
Et/cHw+nV8CTujOBy5wVZwr/GIO8aiE+HvJnjq/zrLxTnOXVqMNHdolUoz7r
ueApgq8jnCIM+c8KLbWniUc+CitSvCyfD5eGX5WV/lA8mGHhD4uGd5OXfVVr
DDn5QTvi0H+UowUKc+Qab9UjHrSrcWWSUaCN6zPz8aMQC4zgOwvWzWg4yBTG
r+pizcdt2lnDC1aKF6zLE+gsdOxUh+RheTEcjTv+ze84XGL3DIVmOMVnv50J
UYCmyqRGkA3jitjJFGi+mtTEOvv5tzCYqVnwOE47nd8E/u4/dx3pds9wCNDP
Tx1UOMg68o9/iT69UErJWL+BESHQOJwnqfUzuFr8JJ9ZbKFKlYtnl42b9iTP
i3C7VDgy2n3+0qJUQJlYodmjo0CtHE9YwucI8EzZUUU4Kamcw5GvgfdcUawe
Q/0FQnka7vJISTSopCdKRCxY7zVnHbNoecvZMZ09j8Lf2Ae9Jj5GhoI8b7bn
zriWcF++hrj0edWe1prS6smJ5E355S4v4fY/CzrsMeLmSThEYrvirK02W1ia
eMaN5fSsRi8XiKmlrO9nyUC2r0FozW0tIkzYn5D/GYarFhMl0ctJlbUPqFMi
mf0fcqKoD0m/TKpM+rChoscT5MWT45TDH67/CUB5/t2Bp7Db+KUw4K9M3odw
Co6oz38of1CBnP1YfGgGZKggf7DUSxn22bz+1/PF3zrNVM0uL5zcfnv76PY/
uoqzmgNMJPbYZ3wfOuCNQ3v8v8MjF/95ivieAMB4x3dPPeWSjoBlNTGfQP+K
551FKfoXafr0wMsn1EC4OX4JZ1w2mxTIKx1bv8Owfy2PwqMc1+FCycKB+7HP
F3+T2clcqHaOFuvKy15rjq0COitnRApKuKDZIxOLEnutYCfNnVOGn8ywq3PM
r3Sf7LJmoekUsRuZhRaLJQqcCbi/LzDP1LSiU7CoJjPZp7WKUcfvCloqYiu1
tGk46K0uepHnN8lExQmiI30E10FkeXsKhbn/HD1LDnPJt67KY1blUm5j/Nyv
3TVWG6FKXMqedVzKC7bW9/AVTDFkVlC81Lj6YqlJN0McG71Yn/LZy/Tz4cvj
o8eA6RRwUOqBRa42Ug05HvycqlO5OMHCNF+m7IOU2ai2rFZrr63uttWvFIxo
0VbvQqtASVUNrYyBogDaJT18xwtW5tIK8KUlYllGqNVXzQp2R9L+cOjHKRBN
TSqn2d0YTaFodXXXtOdGPktKQ0Rp/HyTsis5LCKvdmQwlEqmqMqsdDuRvt+V
w4ozn3oG7meUD46549LDQpdCGHWypTJWVNfh2b3k/uKqyDVhRhq9JpyFg9h1
DaVnFL6iVnBAiym8BnBZCRKfRtrbYCyaVNKesUydhAptwAcFJ9pyJeUFDYtM
Z2w/dFjmE/MbRz3s58a0bmVF7wk+GU0jI9ZaMfXLvCcwls8lwJLqBaTF6yrU
DeCph4WRFXSfFn6x6At3cv1gqHzDg6FbgcRHrabEnHbNFUILFycOcZFVTfCc
dI9UjIU8+/hk/+TYKSEtL2XsPfnrFzyGcK1/ieVM69YDrcLtHz5ZzQdWOyLu
YykDzorQixmY0k0B4vSFm9JSDC26CxpLlSIxnADB2Jst+mAqMJxS5D8XlzYq
a6NcRaEYN47/40enrw4e7z9/frp/+BNJ8JepjH2NkJBoirWWjSw8bABHD9hy
1metuY+BOZ2LrCeXuy9kEMsRJO7V0bJXICHUviGZd3jL1UjY8uIeTiPaQ8WR
cSK+sfIczHUV4dJnUXmW6xVKXpEazY4i2Cjk1G0VvNGSOZDKi/fVaS1deviw
fPrsOfyGh4+L1XRsjKhRHmVFZaQKe7whkdPaJpA3RN2d4Xi8J7PC9NPm2gzK
yJgkuMVg9n56tagGdrqsYl47femM3OWzElkOtNpPZLkvWUQPr3l0cAg/n6yl
YqYc6KKXXraeDHTwjXKGDbH9T6FKD3ZFw+DYSOFFOV81paYjQBAYrIhAom5H
QWSgoc2tNLuMq55bBofT6XbHQiFGu6gc2cAJG/HFbDwOu1Wc9eX3tjikKAQW
DIH86Vf6GBe11ezVbpwPr+BdsMVRGQU6nOHRoEyHSTBZpUXqeYk/UIVnZRob
VmeQ4tmhUbDkERE7qD0jJZtYq5OLBMlE8QL8L4V9JEIsaD6ihavlbAI1OJP7
/ri8Y6VQXj5//mj/8d9dAexU7Rkn95a5k0wYr5+9vTV9J5wPFZ2pSIa4Tui1
4bsRIAniPWa4HVIylT5mG7rxs7UpRevT6pTxpRonmII2xSC+m4WYfRcpnNTi
DedHkb1PeH/w7MVyJdpv7LREeW87QqJ0daFj7gh8IFq/ogEPLOxSYOZWhbkX
awDom0rNq9q70FF9yO8t8XA0CtnIYVyrtKyXhegoJwdPcDSYDvNEU/F1Zdvo
yocUCFDO9y2vWIbZrxgLBEEdJGLjXKWtZg8ijtMY9/Nrtyfz8y2bC1HEp236
ba9MTocWa+CjZdSoKjmcXlVXkYa/WabFSw4Xooc7PEiyhRVbNbpuKXsv45Ep
tTISdRKoVgcg1knOz7KtGA6MPjAu4AXLZI9RD82JoItKITGwnIf6kPfxjCqI
R6guxKkq1tvaEpkpian4fAQzQnSj5LR5kfx+MUPkbMmT2zmO4BEc1OaEUlyP
IYj5MGWMZxLOhWK7k/CxOsvDEXWOhYVPgctydXmV7Hxkks2VbWFykKhuddn0
OIWD7XT/5OWLZ48toN/UX1lIa3R1FQ2JLbUds3PCbSZbtlSwkXC1mkYloWeZ
Be4gnMbqWR5JYLsapV8mUWJJNZSChaqE0s0VnMcCCIZj2LuL2TxMkNZJbllz
FlUquK40kguzPGjGirJ0SxytBDMfgCMlZpEA0/JN0ebA20NF8uImBx+O0VKd
bOULrF0ZP0G2TKEVqeHOS/pc3lqGSCCs0Y9Qx2xP44LHKe8J7i9ms8VAid4K
n2TQmOhe+Xj/2OlYUHz9lugV8yELHJF8ReRdfYFomBIhypCJMa4+qr6QHEnZ
MUFLYybJ4C5iAcFXdnkAvc+qIl0btDqSSjNxTqBOgz6LmwStuo4MBVphvC6P
qt9nhKe8qi7NliosvsszsHboExEcpeCs05Di3CqVV4mVVJBtMr24NvZCqYYU
fZ6RL1W6Ep1m4BFdSA6pCajpgGiu7PrFcCzdmoE0VfXLEU5VqGQFfJg5tzZf
XRLmyYqyFF75ymgv4yoKQy5FPdb45YW8DZmz4be9pBVKgYrRAlss7LSREME0
wudARw2lmF9EpUAvLH8EZOY4raC6Ac1qWdXEzOnSjiMiz6ulMkdckT1aOc6x
0choVjHu3K4uBzOYkrIjgzLQn80RsepkukruqrDfRQfoNU5k+/b5yyDmTAV8
fYhfe06liLcdHO0/Y6FP+Z02sP3yfbjw4FV2PXukdyGz7kpM5FgIAFEZOZHE
eNXyL4X6sLLh5XVSagLeLHOUZWdd2Pd2r/+c1xt5fJiBxTDWWkNkCK6Nc05E
mP6TXHP9SpblYipmhuMqI0gJrvl6KTU/pMY9TUk59weGycfsq2vv/czPezP/
R7aYAe2jVyNfPVS45OSNUHWU9BvRlBwtUoetipLqGxBLowvwKfTyfUuTRenv
iJFjyNKq6k37QWK9NU8GmPn7sWF4LOcozNIHrFrJq/tU4vuxSGQvtKs9mp3D
p80CKeHjt8Prvqgn8gGpgwXvS+Om23B7igdmZsOuqsie9FWWVn6DYIhNtcUE
JO1X9RgCT1JYL6i/5yU5EsoswTlMDp8DmVc1TBtdFY55RvbTUvQEhoZXAo8p
g/KCMqDqKNVjJ1jyw8Xm1/jKQnVIsZMcr/PhNUqAqfNRubBd9TMceUHNQKkV
MSJ65W+zFaaghjFDpe1CMVy1jTtMsz5qtKhrlt47hBlWc2ro/G08OhcqH0rt
8XDZODOqC7LDwAFWKAtDPQkLL1Ne5OivcVqmVGH7UF3nqNRKmTBDKAOMBTCj
ITms7B0gvMC76C3mG9BTqxStEyULsRx7qkNpNC0pnBfXvXLmNk2DGabfLyxZ
051zomPFwMxwEPe526cCzWQlHJYMezwT/B2qmeZryEO/wdsBcqXlrJiPiFEe
NiUPX/ccR/vlSMefJ7TkUujwFEEisWKydP4SzA8iXuBioMNKeXwatI4a+yGe
o64A2xhGR7F4Xanf0IZHisFKKxtaCqVgx2snbYvokRJ6+HgiV6mEGp025qQK
OrRIZAbjFH/qz8MxpG4s51X5Nl2Yo0iNoMbhxRt1kvZc5ZoybMHV+TlDa8HU
CbuiVziJD94fQ5H1GrKQ2Y354BUDODpECfbuNq1eNShXc3LGQsd4LAJof4GA
9LJ8JMZ+i2IhJ194nz738kfLK6AlVwt4jQtT41Wu8JmJMFVCeT/OOPM55Ap3
r7zFK26JiJAqKhKVFxedAhS1NKdVgpKCW/Tk0fsmCb5f1ayc2t0rb7GrrlGa
TXo3JwfUE+pIjFTFIkhvu1k3smJlax+G3QSkum4HGT5xW9NxIQNk7slL5vgL
XmBklal1RKLPTs6927f3zWBNWFOvZkhce9gPs9yv31fzJN43KB9WwLBes3NF
g5Vspt/EaJ4tVASXSHeZzJmeztXBKrFGZMQ+cH+Em+OU7/knqIOHhZrN7I6I
wVJLhIW7TaCGZQ1dSIXheAg3/GqKOjSjCxxm11s6Ps9iHe00PsMw/Kg7kDka
tJi7o1bkWWNJGa7Wu1nR+FkIO8knEklrE5U+Y9f0y+hoJz01jHU2Vjb505lo
JtrrcDJf7YkeBhtjxVCFei00KhD2Hfgi6L63IizrMpYVElcsK4yNeM6y9DpG
R+FkGE4BoG4sIp72u/lSkc9C9y2vDQ4C0b+8a2ZuRkDUfP3rsqBFfGMq17KO
5rEre7bkUe+YyDPGWmR8ohiJTEbyuIW90vPR5fDi+sJiTXwv22dmTA5jTCa6
MUPT/b85zSv8kjySjErlwdU7mcnittUN9kDLFsGN47zHdXx/8rTIjjDsK86j
bAaf4zoNgNF5JeCwcPrPRMTlE/tVTV+C62/SBSEEcCQSeC+exfa637JOTTFU
36xEcb/Sih2jgZQqezd7a3UeNGLCQhPrQZM0xOiKgSCevDw6aa4elS1YOTJK
+Ms4ASh04mDE8MAel508yZxSFB01z+Wo+suoTyMlMFXMg1RYqc7E8wiDWQ36
50FtMbufikvSPcI51J4d9JXWu1JXB6sxPlgzFgs4iWRL44GiHaoX1nketE63
ibd4gyfUjoJlL/MmpcZtPrwDS1eTTWlaVZrM6A1i1xTe2wyaO25T3XF7yo79
qCuGzY8SbMViNh4z8U28JvSBuvKeNLxiYdiJhcxoEhbvTb+LajD80qnkDY7c
+JU8Va1JrTQstJ610yfq6L2MZ7nU3ua+dFVba1VMsE5vcaOGT5hzGhR8tgtm
Nagwt2hTtLBXbCIr/aou1jUNdcCsfxHrlYta1OdrFL54Ox9jwW935JzPxlKW
mtMrhc8rCZT2ne9PK8BPTfhTh9axieWM9KxXPXL/giXeMKWvEMBsUyFR+lPK
v8O0qOQO8QeMUFSupE35phoLQW1YB1cEdWHiglI0P3x6rHucFf+euahao0Bx
BnjJ6iPxzN6T4ke8XXAU3x2c9PTHVwcnr18d9jzAQuTb8cE/Xh8cPj5wh/Ea
OEVjzLA04LoMz4K1sQofMj1W/ZKqQzTvhojcf33yPZJaeuWro8fHB49Pvzs+
pml48vwYED5CnakuGWFnVbfL2ken3l2GoomNx7F2qI6k7HbGeUw8zBYJSjUi
g+V32GQ03afD93Uv6Yw4BGqjMdqzkT15FWyPU0BdDp5BNLw6+OHl3w/SB7j3
0evn6GH2hcVFl2Cn7NPwj+VG2PM9ffnapiF/e4op+XyFlSjOFTkM5cq+1oRB
qG4Pjg+rKipWMi6Xsfvu9f6rJ6ePnz87ODw5ffbkFNhclauRS5zO4Gn/cozu
ppjOEz/SNtBH4jOK8Sv69qda5dd8kZRTywXYLpLzhqpRdFTy8GCAoeNPEw22
pOsorgRGAYUguTlwGdLQve+n28v9mQ13KBo4eHF08lOYyk/IfihC30f1x68o
iID4JetJhrm9SlXAG4S41/Oh6iKIXVkaPuVBdv3SE+vGYqx0ddH2R2770kFj
0pv6DUH/X6zKJlW5aJKnYKPAqOB9CFa5DiTPVIbgGauelrowiFB09XFDJwiQ
YC0l4lHSMVcPOTQ13Tx4NCLzYvmKDMwiS5J/jj3CasqsIsKLEx9iLYUJGT5d
C0HiXAwCU6EQlFWF3iDPzMSEqqZ424N/e/z9d8+e7FJ9O319fHB6FIQytgVy
UvHt/uF3B2GnMGine87tY8Fj84F9fSDMjTaB0WvIC5myNnnBOFwVX3lP2MBq
ls5b2oz3a6Zj60u6dyrW3wl5hXivrqsE0hxDwxtI31sPacPL9mkmSjc4H17T
jv6ZKrQzSUWz1x4YMbP1zNbNKEhADb/vIcIlk3+1GtVvlGWCNCOuT/TAuAHx
lVbV4+EmkQjfyMUSFwh6qBZekXnEJKKk7WiCBy2GZ0fRTYPUl6BL48AfU1tr
DipS+KTmAal4kneOKoEgBUkCo/cETSuLWdNa8Yfj+gEB62RaYHwkiypc1zwt
w5mYir1H1NmFibAekdaxVKuNMcFzMfFACtZ2sECwd3SJ+CGXx0M4KXDX6y3E
GcTGVlM2V3T0doqeFHz2Jdb78AfQa0Agzp1SkDJYhUVSZ0Gv+cf/fNZ/svWm
ug42Rn96Wb/b7cOaYU37/rudvm8V5i2o01wld9IGKhW9mfyiK6r8vqjmCgcE
CGUMZ9Y4mCfy2qXT52hJDquxitNUvG9Wk+aVPFi8O3trr/RBneVe3GpGPy2u
JBQyw5boSXSfivBvOf0wF3o82NknpwKdyU3/K9YxDiwexLLmQmtEAHFseynU
4wJXJNmAf6RIeVqVsv71vESLgHT1XPFyLHDFPBWVOSIlP6wq83CZRb58lKto
8+5b3MBANBbRTtEFcip9plag8CX1osaBdmHTnigsN3k74sldJKtG7OLuls8a
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
hdYkVufL5Wy1KMZVeMPIYCfYfXlnEjFlMnpVV1dDV0O9AHMdRFuiAzeemQt5
A+e9geWtg7G5qIhPjPV5I9JU5M56ga4N63Yf7l/CSP8D3lAd4fanJb9n/rA9
racLURbDNgy7RH/UxWy8mkylw0LjoqqY4//Ttj+nt6iBXsRFEHu7+ZmZNRQ7
HnXjNRevs+hHy3Z8h+T4x3hjWnHOvjTWyvbX0GpJQjZT/T5ylltc1o299UCz
FFIdwAlZR+FCOB8NBkPOPEgqGNvpJIHgXq8r1bckLqeOHeZ9SPJRZy0kkt/N
CTLl04okhpunUppEUtAwPfs/bWQgxFoyR2BatISSUuf//Mw3cuUtlVW9fZz3
Gjtsza0MHcOsPVMXJTY2XduQ5YdkmJcb/nyw9LT+37JltXZZc1g2Xf8Bj+33
+/jn0xlaH8ooQtv61vIl2/+iBK3Pzc5yj/NP5gPXMq8+r7OffpONGVqf2zCW
Z/NDNGx21uY/H9Ip1QGXeAZJ7LY9V3v86YajcPiSoRCSgUSLovnm//2G29yn
G+/tmPOhu5ee1smcF10d9th4q6+xdZy/sHHnrfxzY71pdTgndM9FFXqN6EEv
ixD01uMAvcx94z33vabP3o9x/sZ+LOIAhethatDJ5bqspmzudO+1uds3Pi8H
Q9ef+fjPdwm2TolfBJFqoGsL/3N8dRtnuv15snw+0x/W3vbmhlsdUF+0Ljc0
/Ge9M75JWfWd3NFiQ/3lbpQv8KHknYg/4sHOGaaS+c5x8oTVf34nf7knJHuS
3yV5shFG7I8H5b8sz8dMU6+MD2y0HA8f3mphBbArMt/crY8FCMY+h7AKVWPh
khckpiBrEP4PLcgvYlmeot3d6AFX28ZPoLfiZlKg5Vqb6CN41I9KlqYV2KV0
uFv+nRRbTeFqn7+6u7u1vZbByjyB+g3Y5xituRxd9X23xD7/r//6r/L3gZU0
uHObxOhLwkr5PpcxW1hfphKbN/NH3LaSBEyn0Ot3w0SfwKsQ5PdzPTEeltt7
N196/OyJXbpz86V4sF16b6/Qa4fT1aTM5gdDvFv+UeSr1b/TrvTwYWvHezff
iP623Bg+vvlG9n79xvCx3vZRXkmyU8qWFZe90ezysh4ud+Pv48XlqXy25y8b
D6dXyzf5ZfJZdplGeXb9ZVab1l8Xlot0TMY4rmPut7gopIOS5pY9+Xw2uP7X
v7FFfdvVFCvav2xoNRiRF286LXM6XpzK7/i1mw8Ig7/rk/ygMSnSl/XB1T6e
ylfZS4ctCD7Y1pbezXSE8tnL+lEtruq8r9h1r1+FU+zk9On3DyT4mo/eOTiQ
2no+Q5UxrQ2RTbSblrUb5EsOYstNoxmilLvNm+TjluttnlofIl/akARhQyHe
FEUmxVX6quD9tyevIK61Gmmz556cHpLRdtLT5wf/xqk+Pv1hJ+LrsqWSLvdL
gw4YxVvr4rRVyxSqwonf82tiAE7zEXD4wvVvzUNPmuQxcJxtfkfoYeqo9IdB
qhBAtxgZCEgjX8dSV20e0Mr1WElUDqUid7UspJB4cuBwqa4WynZ7vhqNWZUe
GTbkLRrBhaCl6KeFHriCe5WqqiwiNUKKHEvzSXoNQgJrU3cxA62GURusj1W3
1CGSTDQl1dheh5zOirBeWTrA3kN9rRjGAw7jK44r/L9ykI9mfY7vR8EKyNNH
s/DZrl7hPvmYHZB37tyxHZ3dZd/Zn4YwxrWjoRfH/uKGSNaLnVD2FzcEs17s
RbO/ejB8N7oYnvJ1d+PV/LVWuYvLP9pP2f70b6jb032EjakxFbrSfQTOSDvz
x0vlElFDsm8IZXWjrCOc3/1HLoHxVRqGwfDUPsrk0/SyxtDspvs4VKu6edXp
bB7Uht14FX9tE1p5p3RYsg9vKW2LH764taKWyP1OIWd7fRCjUgDJe14kDK/W
Cwh3yuxZniGvE+T/kOmiMQJYvBlZalCLYDBCk4VEC7UoTW0hrPCl8NcAaslM
Gz62ly+hLTfuvXyVC8Y0W8tFJEtRIEkQCldDnUteDn4DLaDpsrk1jVNAWoVk
PGDICFdhRY+sU6XjZGn4SHEUBOmDXHBeq3k7pBa7bKw3yvqU7evhFt8UpmnL
etfijiWSzZV0tfFyE1oy50TQk/+COQrCJyzlcySyRVEuH+vL6PRZRnsW+kpx
+fGQ+bOTaj7XrBDN6kDJm/kCWRYuWR3s1oyB8XTQHbFVPB+9HSJPUZ4ivWiU
rtOyP3iO/JLKHkj7DpKqclhP9Nc4tUiEpKeWN6pIe1QneRy2zSkQJ9OL691P
yN943boQXoX1/83u6dKLynHY2fWpMu4M1wVm+z1Yl19+F55k9We/7El/7q7p
bHmK8gNhe7fcGYQcUpR38zvJkX56vqqvT/HtZ95VXV0tiGyxnob5zu/fdKJk
MxYPFf8pxOej2dKxMMMDQIIllRB1lHfMBgvS6y3qLGl+aeMZqpGtP120sX1Q
OEol8/C1rMbVHAkuu0WmzOXfKaPi/hN2SlDSOaVYEcdoUFqhQyax8q4G/Vi0
synu8uWPIR+fIukBQDcMjDwu0YXf1FpzOKQ1pq+H5m69siV9SwZZcnghhN7r
+VAkaaNxbwqYWTmYiYi/FRdrexsobDOYTZUWItbO0ejZJCtLaYj3KYuTUBuO
rReSDF9bltG7YardE3dmaRfFfChpJtyuVRmLYvOe8YezvAHDrDaRqQxOIcsw
PRbcKHDPXq7G4bQCfHWwogA2xEE43VUotm88Cwamh/HTYE8b8yKqf4AhCJmp
r44eEzcRzvtP7cjItrBixTmoa6lmUEEmB0Gm2ziXqXGS69u5d2/r3pqLSU6K
KCN8kQUhtkyFg2ok6g9kE0+r6cx+r0dTno+DKY/I0BPk3JbhJF2U/6uarqrF
dQHE51//crd8bBCd8IDX05GQOJcneMvO65PH3fw4T92aNneBIBtxRts4sxcK
byWvuGoei5oGWRHXk/GekP9ZcFCWh6lMW8H0mCoX5fvQXwnr10EgLIZ6fA6G
4vevqMUl3YT8W8o5LwoRK5Ujq1VNNu8I5l6/WE2AzQxj0StHW8Otnqb8gUmU
ahtfb+l53kuy608lpZHVAH2jTpaYQGKKG9mSWaKvwdajqYueZw/XOzI/o04M
qogqP5Vj/2EH2xGqzh5HvTqEsLUyrQw3qgcYuYl+qST/KGOFyYFw4fySYaWI
5qFoGZlIj6ZfQ9LfqH80Wlg7PfE+g0XyjIj4xWdtJ+3ppXPM6bWXyufQvHxN
/UnnxOdey1PgUye+9cMW6tr1a44puZ6V8j6tDuQDmBSC7HOoBGnkysHoMpz9
SPRgHqrkboShDrvtLSobsRRpriiH1TGV3GGUZJi2qOiybQWPIfJDCgBVMEOu
evlsFGqtxadj2Ps8ti5m82sWC7Fs5S03M9Em0sEvJBSgy1nJWrjvznHQb1Qw
etT8xeECcFk+Rf4Ys44K3ApbQct5zYSgXNNevDuJdUIuZmPrPqXEYjXs+Zkt
0wjY6U0COnnzBUY04s5joTAy2FuBj8txdVWu+cEK9hlur3Z31jlkz603s+Ut
NaUkFUNMxHBSzlbjQQERODV2JhhdqXKMahUxW1G0LZofn7I05KJP+nqimlx/
pr/H3fB5Ph93wya/T9jsGMWWO1oFxObL22VE0/2Srs+8MGsyKN/t9tLuw8+x
H3QevPEgH0FMtHmh4tt5B5S7jwb8uvsp3pZ5nhoGWDkanVLr3fvERdQY2xxK
8TH6QvY73uZHKH6AMfcafh7x2UhpdCibhno2WnLsHdxXuCN4XebVppMjaa2d
vwDZ/Kx0iQf4dH5RkLDlszwMuqSAoZMnwtNAyqWC6RzkurGCWFHkUJokT7fs
ce04HrCcBeUlyC7v5I1vMk71bv3qUMY6X6Ch1dH+mW701Xw2LRKO2Gl7RXFM
3ZHM5mIDDCuh5TL9ae3BQxJY89XghhdZHZvMnDwsmGNciyL3kpNMjgp1i214
LdWJuRdGpmneEZskLD89MorJEFj2UU0jgXabnJooOAjLSEWuLSNy6l3mBpZz
3mF1MotCLiHOQH7xgMCyfBpTYoscttjTKoxi3FX1bEqksAbeTOeT+irlTHkI
isVq2ucZl6pQSLWhSyTxS+SdyTriH3O8NKO6qFdXVzTmtF+xHkAE7YeVrDJF
lqF2JpGyFuRzXFnwPqy/7fLFI8gcDpiNHpiUa1DZyvwtYngiLHS9546YRzCH
tu82d9mcFI74fqtI/tk0/L38/EmOWDtgyswRW9DkYYKjXG8TK1OpndbsOrl/
JKy+Zs3KqbJlorBXNj7ltb3sSHEXw//Z/Mrsa+8vTrYkpjEsXVTpMxVJiqhh
pOrU5WEqobpuw6+7kgrnc7ZV7YbVSB8YudKg3GXz3HMaHnXV1XT0zxXSBVMx
kYK6nZfGxMtar02RDVb6kot2xJ0yYsWsXpHpoV5/akMee0XZzoYiFrbMlFYS
YpnVKyWnoonW0JTFr9sS/XTBszzw+Rk2VGxjg/HCMIr9Pl7IJ6cyTS6S1bhL
TwN3Fz9Zv++GCFjePx8Iy765ZQXAUvp0Y99eVqNxr73/TmXXWIDKqDwK0BLd
RUGOxaIixcVQJGhNrltEWd3YbUlJTbvGUEpyr2ex14BUYeWCGWJZp8DJ2bc3
RoW2ELyfzuw9kg/ENlhv7UBpHaBCOkrXBY9SeIn0bHNHZawUs2G+3TFZSR2W
8NCGHrBhUEsd1MKpGZ87qK51xPYqn/LuBIwkMtvZbinLIPutwilm0ZdiMKp/
m41Uq9OC16B7ZRQRx5mUJ/xMjJtPsJIN7D5J4ItkS0tRbIPb8VSdTFZTMTNj
BlyjkoS6ckA4ADsYSkY14qHDAH8OMLPEKlmILZC45j5wnvoY3IeHfiTVIVd1
/pp5VYv7W9+UeTyv23gr2QuuH6oicLW2l8Hpia6DghRaxNx1QABAcEJSKR4k
SVvV2Z79wkmkB+//6ozBVeoW+6enK4v/yZQVluDi3ZLNKfvL/3dTxg5wyrbG
dZWZq6zKHd4IjNGOgZZzWSjXd61mZ4u1+/nz+9iy5r8fIQ32JBoLiPHvRgRU
RmU0zMCg7EQhtq+7tf9ue4P569uPFnALqGw8e5PjyJo4P70mh/r5Uzbvjp2w
/vnvtnG6ljf+aX+19bFah2JkbiomDqPAcUWmL7FGCTrgIIdVZ5Ue1dsUjpG3
WpjQmJW8eFfalmeXhUDY3nwmdM1j0XT0Co9FK3MsmgYO1xZF5912gdBOWD2S
vN9Vh97mzhStOLqW/pQb+lPE/kQdyfcoh8h5WLUkg5eNF8kWp+DJwgXKj37K
SRKAaNmhL/rycnJxygoPDhBKp+7Jq9c5/BN+mns74qfhbdrqXnbb0/3nx/l9
G0CejQmID292lx+N32Qftm2MvL1+kFRNB7k8KExymU9ywiBlF46sorCuVLg8
3pOUNLtdMv8bYnJbl0mtknSDFK17Mfn5+PuXr58/iepY3mXzwuWfs+yinDi9
QrzT4ghghCeStpWR7TOR+zmOHaOfVAQUoDZ8EK47TdflvWh+GVejgNyE011k
MhR9vHSqzLJ1f+t+E34PIOSqrmnHwoMBATwImtoUmnORBIlo6nQEpAd5V9CG
kS5441p9zTcUStKWDxrb/EScROQ1wiJX1rdIj6vk4rGs2nw2Hl1cGy2zxRr3
Hz+vtezHZJRqgKKIEZNISPc7hDLa0rbVK7EmFxgZYtpaes3M1il3tWstjEu9
9O+GBzru+2U6kg29NIRKIAQyVkLHlf/4c207LEMtmcEgfxLfVT0aK2tw1QCU
JQordxUPY/JheDqGdi5Y+KMiI2DG3mCcCi7dObw6qS+aZ52CEOvZxKpkYB1j
8tJ213Ve7OxsNeu/RSc77R6Ls5BXUc05SczRXUTeg5fnTA4/4VWvWAhocX1r
a81JIEkfrx7v756e/HR0cPpi//jvp0+f7mjmyemLZ4cUrw/Lnbt7n33T/r/Z
TdutNv90+L6/uKiipY+myklVvxVv3budWx/b1KV8BkTDF73ETgF/2PBsWVSm
Tdany9np2+FwHg8eYclP8RVeTJ45dKXtsGh5vr5ByzcKrA9TAPc7uDbyBUR+
EvOfSyVqrAxjeon1U6jUtJStRjYCq9usFjHM0HgHfcVCU0Z0CZmSFe+V8KLw
vqIPw8QsW7SNoGojqdU35JZIHKDWTPN8iwdYw3hywUO0b1TveAOEMOvi8maz
gn13sJgYgUITfTbR1MCxjpnFxIPp4vxU+nwa3kKGLnOSscrw06enjTVPzyi2
Ru9zLv5Rt8TN/rDU5bg7ZGG8QK+e8ou0SaiA8LPckSt5JM35cPLm2dSQrcNe
4WZDFQoVWTZdzXa0eTEAl4UuS+it4RgORypmkfJ4KTiR1lWUTWZhXZN3umnA
GdUWjqHhen4HacBdv7WrIpqevXzx8snBLtvJS1FgrW+euE8/Mh6iGx/545ae
evRNp8VtJ3ivAQXUxw3Wn0GXmVCky6NEiYp5Pe+MsRKbWKuSEWdGLURL4RlN
KtGM02TW05Uvm3+0+N/svWt3G0eSNvg9f0UdvR9M2gCsm22ZHPdZmqJtnZYl
rSh1T2+fXU4RKJA1AlEYFCCaM/Z/34xrRmZlAaBEt+3p5nveaYusysprZFye
eALXs8IIZfXTApg4kD4eCaqkAXC5mj6me41R5q7ktggb0cPkjo629807nV+Z
VSKRour27LY14qthLJh0yXoyXFZzRBxbU5RgZZBuO26Wy/WCmKmwdpSjnkw0
NAURkfmaoZlU5uPZ5y+zIyHul2kliLekKYVxKUt+SEUYsR4iscL3JRaugvKL
UhGQiqsSVBfWYkWsxLJ5gt4nADK/fv6mQVIxKgloHSnGH9V2y/55nfU5lN+b
8fdhB6znWKcPULf0gV4eFa/qa02SbkW9wGOZmQdDQdoprMekX6gGRhNrvcFe
sCDM0g8WwzMzoSJDXrXWsq4dHR+fnJ6GZbHMcwylqbVA/XffvX8wbFc3ILio
Y2G1DsFlQQohjyB485nLRwnVJqT7ruv2UjEFEXcxhC/DkZ8LEZBCBUFUAqDT
Lk1uYdQoyAAP7I4oi2T/kOpFWyhXJDKzXeCVniqR6CoGfZpPuKnFSDAjeFeq
CeLGQcPBLN/5jbL+9vL8dQj70CCBAEK8x8QBS7Uychnze5toAEkzkw2IV91s
FmpaEpkhi4qkQGM9eYxbnqrulMlmOw2VMiFmYjDWuNHhTQ2VL5c3gpSQcyDL
ldvl3zJzgh9BvKvh2DDSP8gdriISs2jIbjznqpaEyLArCXABEKqtbFc4LsXM
X7SrEM/lYxPUXS4UpIcFt8IlskUhDWwVNN9zHSxwONU/VbTJj7KXCadAktp7
3YThtdQ88jnHtjKX72jpmraFLdiVBFWrK+J+DbONBpYiA4nVGqs1E+t5NIto
v3NbdKziQyu6fI8wxQ+rLK0nAUTc7ewnbVcAMZ1fstuljXi9o1bww3TwSeF4
UV1rxIPSQKmUYKpoi8L7+adShKs4JkeTQveJDOEQoKWk8WhWISrpn36eNEUm
qOxsZvd/8dLLm7evXr18/cYQAn1TPLh//+uvDvOvvjr6G1KKwLtHb17++OzY
+CDp1Sc9rwYWnAxNE7369cZXv3979Ppp91141b+8pcPPX552SUPo1Qc9r7J5
fvzDyfGfT9/+mMwXvfswa5RQaHnol1SMkhPav2DkFmyHQLkny/6Iem3MjBHa
EScM7ZunCp1qkcKMftv783PxgiAmP/s3wd2zYLozYEdhHrIte+Nn2hXwHyTn
Nz3/yy/Eu7Jh01B7T7rtdZ9NW4v2EbXzdaZf5ql8C7Kdfqb909cEP9Y3JtxX
1MSD/tHAU2kLm7cXNfmw0+LGt/ATQkgDjuNm3MyGAtgwO9HuoHuc5LhxB+zR
a1AMkHbCPkfmN+6DqCZNSE1i37cpVfDYlDtIbQPVAIVR0lvj6Oqto6Byi9SM
4qamqAZ/Euy5UFIg8tprnld6e6RfBavfX1XhwKJuhrcr1YGNkR+UXYspYRKI
Bn3Ydq4FzCUUHcSEp05BVQzicvIsQeCcMsXnhiIVVTccunQRn6SLmDl80RJC
gSpMp8NF5LrEcbGKc2K7R8Q+Muatmqt6jAapv6BuzO8o1dGsIEwozPiq8oqO
X1xmsLTpfpxegMVuMQeiloh6HnHGAE9Hywbqt8E89OgN0A0MLAJmBhCGoNox
H5qBoyXTHUmldKK/7pwWK52iKV5h0XtLC8qM1ljsUVI7IKMwBNWNSWqhm5rC
SK966wXWBnaq+R66VWG4bkOOg+BkN0xjp7BrbhqLHadRRHM8j34m8/MoIjo3
kYhVAiXJVg/qzKjUVsH0TfTv4WuCMaNH6wRwNsJU3fX4knwa9gOQYUqEs6Hs
ogoqCYdNAXNr28dKdZSSMuk5zXjdpNPyoO8c47UDnBi2VHVc55xHmLJni7PT
7Y3HyyXn4+8n6Tu8vwzujnFiWtOYz42ZhDVE1GY3yhNBqbdg/lHyIog9CMmM
3HGJZajZwDjw3268KXRtCpJz9UqoCFFVBBy2xdNxaIxrLvb+XK7+25vH9Qoc
anNbjhS89zfu3bCZDvfefXa1TyVyqY7Pa29HDU+bWXPl3/lLCZ33/zWpwDyf
lxybBoRkI3TvaMF6C/F93axb9DVcUVF0lZdiDXLFJfylkxrqswYcwgj2vvRP
iQ0Ith/W5np6evbd86PvT89OXx29xpRrF/+eFzCukSYVIeParUARzcz5i9WG
YpHAgrfE4olkO+P+Ob9xHPLG6LACe2VjDYdkK8slAUbRVXlhypB24MFakLyN
vX2E/rW4RCzQC3d6D7WwfApNRComQ+WYLNc+e0kx53YInoNhOy8XfrusbLYA
ZQqQvVcHdm+pL5c9oDBYdFeN2XkpTz09eQ68izTSCiAWOTOceKZJ2FTlZAYq
AQpPLilKRjI0rJ9/9rLYi8nRwc/sVYTDHq8xrCbea9ImzBJ4D/oGRLpJOUsE
02YtNpVUD1NJtVmdjUWXkaF+fCnYryOXWNkKlbEuK6+ZrK/OytlFgyV+3Z4B
/ZDtjnAPLCODN0T6xmN5Rf6Ez6dkAao76u4cxYowjKk1B1HchbGCSfXzHNbP
M0QHXGnPwrjJUwhfRDgC4fi2Hm0g9AZsAfnmSzRIuT+dPGuYk+Sgo2+tO0Od
2WCttS32SGE3PiSGcCBWYxWVRdT2okxM8QdLvc5D2MIwBH8D3dj5ZMV/EHRT
KipsoNlQfBwcdhQYmpZGfkOdEi0EjIh50atAMQNAKXr6YKEYToqVxToyYfPZ
SIWEvvbt0VN6s9hDiqV6XNzDvSFhisuSIHrr+boFqX5v/4A4iH6CXvjNgB5G
XpqhTmUB0SBvcMyqVawti+5oedKKe0Er/2SFiRmF7QRfYk7LWNLXwsLdI8nX
04wzG42AHrgMBEu6x5EHUEEmWOEXoStSs8JUUoPn3mDk7S+w8ckR0pIe2MSP
UYAOz4eF/nMIhPjj/ud/lMl1PmG7GcMnR1iZMvhqMCDRV6TTRtcjlqYUqALd
0r8+SODDveT07O5pIxr5qEqlen38hjp7+edBErgZWBf3vz99Pci5vAfxnRX+
+d0PJ//+ihil9fJ58Zej5+afL8N/c3mF8IvTk9d/OXn93dHb52/ML98cPT/p
UFgXdzyQpJubumb7omVC/+iTamuT/iMH8vE9xxqpd70drA3+0ZuEJvUff/I2
zW3Xm3Pbedc6rr+DY6gk+b+DvhB9/+9DPJHD4Vc5G+xX2XZkbrtNT18d7zbM
DTszKWPw25y3jxtIFPDvXb4P6XhnJ0HGxA9HL54Cn3C/uDh5/eOG3ZYEQH/v
3c3gEHbobtKzW300KgSg6qOEXbYqrRSGCUUHd9Ryu7jq26q74/PflcbbnQBV
eHf7idTixK354Tv26KlWRerZLLkI2E7q3LPTp89MB1Lx2tmEL59nemjdNTvK
INmwnQ2gKO2d9yJvXl4n8fWmJa/fQsLTZXX1kfYZR8Whv77fulstL+yHbNYn
GzfrF9nNuiXwXlgLLrN/7VbdtI24qWQ3S9mV70/eFBuC03F30hMRd0e2RDzF
CYhh2/LiZsD6Y98/e/oY3dJnb09PvFF3dPr29cnZ09OevIpNr1APvynu/3Qf
AkH3AfBhIRcb3+X+w67b9BxCMxD+F5egZao2JvZK/WgM04PKoKbmWpIe/GT0
qIOp5aQF8HxhXdhlA2GPNzFoUFNqNg4QC9wSZmTTc4zvi12ltXHRgXtubmBK
1sdomfbjIxXycYoHj0YPXCcfh1KMyOmEfABU7E+cfYDZBeYUnYXWAd6bvL7x
eBBhDsBz/80fmuuKs8JL43RFqDjAMTfNhIIINk6rn3snKSf1POJZQY8tpyZh
nAP6jgD1kaa7R0lw4HTb+DFmT4clsPvIlLfEcGq9iguFmj6YCtEIIYpQICIq
v1svwdXGqeXSCmSN+983F8BaxF5Nl6DP3oQ0R4U7RAcBPJLlNcZOpgIJAHoK
2CrLQEr67POXCIizeLij1cpvkTXg9eAi0X8WT74+KKal/+djwYsgwuAM6TmY
3aXnz12OF+iNF/0dMrTw09fWYRZQx/XXWWR/Czf32Sm6ir7xHc/zt/SNhWWU
10XQKdr3XAQfK3Waeps1kqF3niDDFRlGtP6a3wCyMvoNTn7FzXdeFQGMwjic
TtqnESrKKOD6GQWQa6T4r3VFMN06Zh0jpisGyDg9XTgK4mohcO2KyFYo5YLR
MdHD8IjDgHvb2YXHzRXEeanSt5YewR2Jb5whKkBYheyvunuNdogxpLmKpj/T
/nJ/ccJ32X2+y3Z460e4BeGt7/gn3ZSc9xd31aZamXy/8cXZRTU/S2gR4wdo
6u0zSYJf9KVkA9u/4aZ9SaHn63qJDGYM8rZODIBoS8LQkyFEe130hcuqnECs
puH8N44JrsoLiPVqSA6D4iul6SVGAI5DDyDfTVCWfC7wG0PoF2f+S8aEBq+F
Y6zlLk5c4E+XkLoZCCU0jq/LM9pn//anop01K6wb7SZ1ebEsr7ATDCfHaA0g
QKZLirIBjJvy7zD58n5GsXyQ+d3DzO8ecQsP/F8fFY+LL4ovi6+KJ8XXt/kd
tPHZ8CP/n0P9s/dHN2T/I6jl/uo9sRv/t+zJuA1R1d94TnxXMIcVyPp+u55I
L4rRaFTsgdIIwc/936AnsUzB/vzKc4JZN8gOeH/46ABnIz4ve0GKcF0eLVNR
LffD64+HX8nrdpfveYkIOWMBowZK4cS8+GT44MFB0dmWexkIgHnrwcPhgy8O
OjtoD24JnkUWrpBUU/9kX/1y+OLALjsPVEPNxF+r71dSL3LDj+38J1E2lxf7
i/XKfP7FZw+GPx501noPMLCAJ0Tw2WEh25C7sY8r9cZGxElF2Yvm7bN4QsI/
9ynlBO8FmCP8GhFhYl5PuOT25PIKQBQs5Q5EKIo4OHr+PSkbqEnZT/pvYFUD
AWP5N2WIdL96i++KQRD+kqPiAgjAevDFqKsE2OtTNIFXuiPhjwwckCzs6GI3
FVEipYoUUy3kBv0ovnw8PK9Xjhl+mIeWoCla6hFJOwlPJpbm3P4dPzJyzwhw
CZlO07qaTYBxRI8Vp0mFY+U1Q29Kzf3r3QMmrHv4pN9Y1ATnPIEO7A3U+6SU
Grxny9UcoLurivKPa0Q8EnMH5T75r2BCXrvGtL/pesbjAzTn/IYV5JGVCL4R
wOxhChLCy1fl1UIReWwRBot5WWHWGIBlZ815CVlmfstikj7VgCCjfQFEPWK3
h49heYhrb4YO8TXlXsLRi5EQdU+4cv2mgG4i0Q+CPiXLT3AxBDECFeoQOldD
RatolJjvBvRofgPgxAS6VMTt4fxNTUohTjxtBvoNY5CtOOSVf/QQNhoPB6bw
fFa3l0Ht7DBfEuoJ5luS+dIEY9/jCyROnHQ4pxR+JnlnDFqTTu33oNXRHONE
72jarHznCUf+VUYcdVNnoaYiMGsSzoq2WEinTXJpkw/AUpCcRJ6mohCmW+TA
Y/w+ntXVDezD2L8mIFNi1OGdhn4xouxpBX0GFdaWzMgjA6jnCN/1rwJscgnu
i7aat1zcR7g31Bb1Z904tWD/II1W9V/rErG8tBnrFkpEck6GH4VmjfvXaUNS
hgOfXGiBdwUVEAmSh7Ca8/UV4riS1hUfKBtmVVfny6p8B1Co9ayiAplA+vQW
SXvnUF0AGaN945pFjnDcPT0Xg2hp9nN8v3BgsdgDfDaVkiQcIV2RoXEgGoty
BtcPbGAUEbMbpj7zTR/StPB6ID14YJXiZI0qYSKMFBi7u+iE7kE6qDLWDYQD
4iZ0G5sLTeD6YaoNgMkWy7rhMiz+bn2wP7DXXLpxkVr8ys95y/BmSK5Av0GY
GRRmJgOdEOruKTskkFvSLh6VL5LzRL1etia9HLbh0l8phlliCYzg3amoNesf
WZKH1BaSGkQOkuvLpq3iwdFuoxRY3oFYfwKs55bdiNDmFd3x55x4NK+4MZ3s
JVxAfn4IXwYBCe5nLklc8nFxA9M1wAxX5Dm+hjJH5QXye4FONiw+/fRoZe3n
Tz9FdTbOPAfD26/oEAXA/gFdbrAqVgSPqSosJZcs21WclAGD4rci9eP46JQU
K7pjIXO6vIDKPSSEjFRM38QtNgIuEVgTXmaePWgVQNitZJdzA1mMBTi/OC2A
B0qSjvxeCLnl14X7wM74wMDvKXlBOWjoXgH3M78Pp4jmqYPZbz+hIbTq4ceF
OsRLgl8HfeynBS26wth9S74bF8DfQdWeyuJ93cxK4+Tn1xMBN8psAcHbwS7o
ys0Bj2gYRoQVa+jrfl8koD1ZyJDvg8ckWtJXJy/AgcuCqsZaEHTPR8fp+EzO
s4CH8eN4xugkApMLpH+nr+Hv7RHkl6Vz2jIxYeob/xb+MgiZXvRuZst3Bh11
ikfJr9NYkaqwbseUR+OfvqwvvMwfEiU90J7glv6klY9yPoXt5J9yndQkfEyC
ktejTqIEzx6GkDHFfZe5DtBtSIZgMHGlN5bt1TffhG7x63skVQWEP5xCOkP9
3+RspgIgOFx/XUgn+U0sEwZiQUr4GEIIogeCbtxjuWpXX2bbL8c9ZAv01iLl
MqpMlAv1gI0sKsUhkjUj5cBmCYXL0Dbwd0fQifxaJ/3n7IFBIhH05KiC192i
mTH59qkqAh7eI024Q3b2c+xk27OwYMugVgFvRhl5y/Tg5ldZCMbpVoIkFlg6
o2GUklgHHmFRD0ZJN/E2R80Os8/8QgDlKEzqBVbqooUovdoB6WoTU6EBvlnT
jYodrPzZgTJZaVKkqfhA2XZSJ5AJKad+XgPjIj00VApRhBe8CesRtF6yvDqa
PYRvll5ZXpZLpko1+ndQEryAVyWZ1XHQBr1CTsGT0k1ijQYqQvJF1FCJZnWo
W/OoZanviBkFeZxCl+XFYHJUV36o75GF78gvxGLW3KAWjFuIqSvbyGBX+rBr
0PdJVyLTh7JLIwOO7SHkv8+ndx92LWEs0cXMrpTBJyMJJC+lMGwN0YyTWoiQ
D/Ujf2B4Sof0KHTh9XomFS2tZHBvmmK9QNOLEiM7Gn5/Sh5TpcLfW9K0hKEF
P4uywE7IHkX6/TohEc+iWWCJRmBOj83M7BD3KU/ojdHyodtMVBopuTmLURJ+
5EijMmQs0e5+NueVLCO2UdngLymPhI1qpFGldFMePuQYBoV9zJuUiFTfkIoP
UznBmpP1vJptCtPthSjdvh57cFvYzwEwxLpiXuMXYILuYy4oUcfN2WYC4gW4
eUhEhcGTpYVpM8D3zQytONqZYTJChpw5ROZbzhHssUL2EnHOshwuo/3g/SGH
ZsHJlJQ/BPYTWMMAaoH7I2xmL4Du334mIXS5FwKXu04kfuconiQuo7WsLFF6
xxcDAlyMarIGYf+gHsTbRknepusZ1vblRMM9HnOUX4gJYMIT2OeKIS5InC/k
yYMukmMyGgD7qNQDZXn+sMvePsKVmN4UECycN22N6jyRtJGGTlOTuwomyKoL
7QEpsHjUpK9DJtXA6xN9k34wx2KBEkuqZRgOoBTwXI1tP+Ug420Lp1LWkDqS
EbHqbGS3Jqz0Aq94KnFrtpkmebN4fWpE67GXfTXiB36AkkPI1ni0wQGCF7Bm
JWbkrCPWfExBg2rzzPvMjzIvxRw8QDN6zX/fnxigqEir2XVoROq29DpFxSXk
qDBatGwW40CS1M8lCjtMA4ePiCgMFXH8zdg000R+ZCA5rGQSsEuGiwXqQOHE
PZTBKgkbmv9O1n6Og/JlG1wW/YsAgkzfLcoZSHCMnbNZEnTupzju4GpAmwM1
zRdPeU8JJFQiFmTIRiW2iVLehDW6tglfR8j8jMgE1SJdn5lOmFDhfJWiSLQj
WqoGI1In3Qk51gywsOvVWonQcIb0yBgTeo5eGah8J3Y9qe4tFcBVD1FKgQbF
32Aha6gJF8j3UI3zU0alu/VmCcIR6VpMdn/MGYEcDvDaBu2VdpYWqtOt238/
lG3XOzc3t8FQ6zpPElBcQrfWWdiQFB/ZnAjJJoCUjsVs7bOrSUuM+91LKEUc
QqkH6KkEwLp90utmBQofSYO9Dh/kvsCrSMD+p0Dt3s6hzuU8K/DR+8C1Pkqm
8sTbnkT4YeZ4h/xzgvgLNTWCrHUuVsBhNBQa1SFXKvzlF1Rl19wjJeEjOf1a
FIKop8hzd7BJy+ogqs5A4nKskBy5/9H/+n9EWhrVlKB+YJAvcIhW8wa9Hjuo
ah+op4ms/iAljTU0BxraoAgRojQoukF3c1Z3yyhucter9iU02BsWp+T7w84B
RNWyRzO6HJolI7jAo4YV346ircgGH183wKUDrkNcbkyJLxOfz05H+sO3Ioih
7k4EObDDRvQv/0ek5Hb3IW6/UJ6aL0OMmvpnL2FX5RVaV6+8eJ0inwGgqb3p
x5pZmfMwFMSJOlb4Z15M72c0hgWBvOEuilYyMFTEymwPWS6zQQtfaqSAK0cu
VixR4w4goytgo0Llx4W5YRFG4E1rNUyWzWLBhDIkBbVwJlzE8BJQOfCE4RaU
Ui6jfP0KPVi6oW0GsjqpUB9y/nNTcE7YAsIVlhwxOnV6ztymC5A2RfeYua3H
rNh0zNyWY1b0HTO35Zi9yc4w7Ho0aiZkriPrlJlG0dJEdxZIOUqsTo6L8Pa6
0AIzHR09ffnqDeYeiJwMjwhfpp2W6GjTr3rLgMbvWYhsNPHg/6f/7oPRUoyA
gKBbkbT8vSySlv6m8O/ohQ5+hkdH+BmpmBHg0+QqEkJ03ACEUgKSOI5pC59h
6Lu0BYVbtAB04pllcPgKEz0m1U+qrjIOCLntKTxHRciIyXElmKe43i+ZhbYJ
N6nBQRf4gEhKIPYq9JjI2+pWoj68XG6v90od6CzpyBhw4kwYWOvthi9gqTXq
CRUnVkh+lAD0xejJ6MHoMbA4RilAGGjzh7NS9JAB9wjihY4JGloNckoC85UY
p9wXO5fMTKnrPZFkjDASJ3zaXt4aEnmqbMIdAYp/4mBp5TAJ+ExOkmDPNmZa
CKC8CxTMZ1V00Wv4803RhcmbB49fHz96yA+mjL7dB4/pwYebHvzu+ckb/4vX
j/2DjzY9ePrD0cMvvqQWH2958IsHD+nBLzY9+O3zoz+fPKIHv9QHP/+0OJpM
aiotLup/WqPg2dGLIyuM7C68dyygxCOFImq1I9b9+TXY0tBUccwV1wkxM+py
S6vE1M0Ri8suQ1SMw4wkZ6ZSYxEgoP/25eM/9UtQ+X5HfPIfjOxUEKUVnIbR
C0UH5RU4BXLShWmlKdyScKbQEWAqYgCEC9joaqopBFTkGLnBY8X+CHByn2Co
T0FpcCciVBIVmhV66DQpojTdBjDOBXoDvOIRa9jO2blFxInB/awsMFWfslAp
NMKhDHGFVipUN8FCR7rJUPCa5D8kIec9Ce8aq5Rq3qusxu3E3O83andv25P6
KoYMo80IteDEIdsVGpLlqNT6IdAECkrNUU9ZPwCvgjn25vnpoHj2yjeNXmqw
jqnWOD8AALULNLBMHdpSvTbDmTchcSICclRmnBYHJwgXJloNql5PKxHyTabA
2I+VMcISoIc5rDD889PMBBx4g5YazT6CYvCgeLz1meMtD6mYPCi8AKYS9nvT
Zr0UqC6d4XLs9wtEnRrAq6DLRFxR/893p5Ag5n8Dygz5LfbzHyNRG77U+5SX
swe+A5ueIiFre81iFyv9+TuVe07QcAF4a9RbTyNDSgSmzouXeIdWUoBFDxI/
hyLKYsNFhxL3j6Ldctp39zBzvVdSHaguehtU7PMb14NdDbnkEPJDEcTJTgWr
bOzc6kWu7nfC7F0iREKNaV9LDeIh5SJ7puzXopFvJNQTasadHva9Ja9pOhMA
j1phKQ1wKYcOErjABchUkJ5pFqHJiyc9Cer3QfrthkIP8L7BpcIaJtm3pAsj
2KRzBRcvX51lGOC88vDVk0H3oRPLrgYPfZ15KKI9g3zW+5mHIkoxeOhB5qGI
vQseeph5KCLQgoceZR8yfFTw0OPcQ5YoCh76IvNQxOAED32ZeSiiVoKHvup7
SNkU/EM642Z5wUheNUNIKScv6nAxK+dVuuTocQ2Fq7LrnKENwmzjqGsZsh7/
0NfxEuaq+PiHdAkj9QoYQkw9C7PHbU2LUMHVn+f5BE88Z90aUtv51Mu75UWz
oFRN+CdEKvw/vca0QHGJRZWj6uHCvfHol1/4MALpO3Czo+3ERuI8Pkd9JCAk
qfwT4Hsl9wjXvmnjBz/BjkPUzLcCGqXCmH1vCuiOg98i/yfpV4DglLG3RQg6
NvNPeBIwULRoagxwJ3aT3yt2duJJzNR1gdBxcvjFuUn/olzUZoGaCHFRH+bf
RqkgL+M/oncxUtDzqsiKFH0ZNcBwu6qnDSNKDqxF0Plr1CilBEMwsadZOOYH
xvsUvQ2T2vMe9sOQ+0XvbfieiKjwLv07eZ9Y0fvaYAmmbfC/4zYaIufpaYME
nLRA/4reX883jB6F2oH1dkbvooti06s87MxC2j9326SJ6bQcl9iLQ2bSCFaF
Ytdyp4FYyh0kZGbSBPuse9rIiMtofJm/S8Pn69m7pPGovq+e+CGeeBGy/ZLg
XtfjwpKDBeldSA4IXX2g4DCvfpDcMO/fmdgwbd5eapiXbyM0zGsfIjOi1z9M
ZNgmPkBimNdvKzDMq3clL9ImP0RcUBsfIy2ohbsXFtTuDrKCznhXVuTPPsgK
o6599cRrJMtmfXHpVVUAhkqIyzLK73OVXWhDok/ofWZfiFes3tfjgBtHC8pr
bpdaawG/9eRrJ9/6+kGxFy3EIJnWQW5O9p3pRxZW09sn19G5JTpng6J5jMOQ
nxQr8SYKO8q0IOUTz43X5ICDLsPNL+Y8suxPCDsDAXuqZaRVnV1Sors5JwST
wQ2BbW4zOxL69k5wnQJ+FCTudEyq9lrwvprrCEouBY+Wlsfl4gDOG6QXUCbF
QHu3xedtTU2osMylHIfSdGwADSQIhH8LsC/ByAh0wRbmobF7VRubLiBrtzos
MF4SAVZc6mbp7SgyC2RrtI5MKK6o5u+rmR82BLjLabUCaCPMAiLs96jklUBq
0+yzgfEqwnqLV2dA2AAppby6YTinM2DUglItYdcnIM8YEuANJC5Ti8DudsAl
jkIyO2VJ4hcpoJv6c7gWpsvsckAa1YRE4Y0dUp75MUgFoKdct5JKB6X0CcCl
LkuoorPUKBlK17p1cIjQsIuiv+2N30tXQyz3zKwEfjMPUQgyammFBDyECodJ
kWQ6KwXb9XIKSFd0whdSgYHUKKj9gBnK8AR5ArMc/UURVV18QyeF8av0R1uJ
8WdqCJkgizybP73khTf9hz3ne7RE+/qUDYZTI1R7MDQde4Co6a9v2zQ2krYc
u43wD0/u37ZlaSRtPHY3UeMPbtu4aSRtP/ZUUfsPb9s+wQ/ihmPvFjX86LYN
53oce8So4ce3b5ga6TQeedKo8S9u3Tg3kjYee+Co8S9v2zg1kjYd++2o6a9u
2zQ2km3ZUqf+DErUh7TMjYQP5Px69IHsweyU2yPNZT98LLms5Ds51yD+4evs
Md3+nbTYt3wo516kD2WP7PYPZUuL5wqeGsraVwKmfvlKSIqDuP7qSWzxFsPi
CC4vhH1hFb7iGO92JAQkX34kVQloePT6+7c/nrx406W15dB41x8Xhci95X78
9vVrQIJ998MB6VOffm6fIFTMY12s8bg8o99FwXMkowlP4WP4u/gpixySp5in
ri+43h1BEmTvPIAuYYRhnpy+fb7j3IAB8y6eHL8VIHS9fKxjWp6h7ef/MI3G
pSWwzZNUt3DHcdHXNw0Mn8CRJYNB/27Xe9J6nXJ8Wexp10Kf9hOYBGg2zE0e
GYrwk+klDQ//+3E0C14xKtezVacNyEjadRa2zYGu7dOT0+PXz5A0lFTh6DQF
G8Bre+eIB1wv2GCkWNkDTvMwOMMObXKHNRlzE+qrelYuZ942Rc9UaysuCp0S
ShO0D5FbSMxENg+X1QVwi3CINJSwFGAZ2z7w50tIM6oG6vvXKOCY4auZYQfb
mHBrqov7jqCeWkj+mlCjFgk1KuP3HZWBK7AMHDeJPFydFoXlpBSQKXeonLwv
52AYY6AEIq0MH1VHQOgmUVJflRCcZ3Co5uXAXGpajtuz5Jn42pBfg0WynS4p
iwTJZZDUk0o4wmxirkkRvY2Cv/ppNYqquXJibmtEH4WoRcRB5zBdm5ClODz8
ziA8R8Q9/sE5kvSAbck2iNuzUnHfGEVt4JQCRA72HDiNcNsBX5j2ByEdGKXF
xFgmbwEMJNunuNP2iB4DV5DeA0SBDgMbCenm0uVLqXuJ9VEhN0C+Q8nsoRdo
syGzm7aJ+VSlnbnz6qYhlqmu1YUMEC0jYAdUnxXr3pEjV4AMuYQSll8cnvNv
XC2AUUllHgJXlsvyRkaMo8Mhl1Qn+EYHLReUX3xJuN/LI1yZGypaTni6JxVt
AJBJyEiza0xpW7SowuUGX74BMo8G007BXYBVAhnE6p//e5jSgZ3ez8Lc76Pv
AZsy+XONcGax1RzWF8HTxiEBj8f5SryZAjgTd5vOMTLNIhFgNj+3LwGL8jxo
T/Qj1NULVi4WlZednBhSFDnQuj1zOAGHRW+qFSb7UMWFnjyskT1qydGn9E3u
07KaeCkAqesE3zW9AMkC7rNQKJFWQjgMzil168b/vW5XTur0ltFhhvxjrOuO
dEyLWSWpttXE2S0lxAPNVciuEYEMDD/Eu1DOHaU+hHxHwy4oaYxaj1Nc+C5Q
iezlnB8Ak/P/no9v8MZUuGAJ7P7+a0GmM6tgA+5DM1UEGGo5YbU/rdN0FlK3
6aaB46TjOewX2Sqv/Qou3zFjX9t0EtYAz8y+xatyBlXKodQ0lfgkzLKbK2FW
fKrAWYMUHnS2Ifd90lyPMtoK8X5xVieD0derMdKJVUvdAk5zXYkWo2wLK8pc
pJ+SaFMdNqKr7Ereej4ul4EixPAJ8onHEQDh0KyitED1zlmmr6gHyv9xbX+5
jKvqIloRc3Ss/byXsYb3DfK17F4DhFHCmxLqWBdvX3g77dvnJ485ax3esC63
QEIUBnhIisJV3UbAuYT7h2rWBrcddfm8mjYIn70J4pxQbyuGpI4ZQAqUZWsu
NN6ZM4LyowJHZDyZUdLlSQOtoPBB+BqRJNFWIKGM+8DgQWkl6W8DTO2lGwI3
mu4m+AT+Hq6sIUofXHW5ZhXgGhLKULlzYuTBbRJRttG6Q4wGtTPoEX4A3uB6
0VzuiYrkUN0OyQq998yU7sA7PvbWUdlW+5RCF8vieTN+J/b0PeI1ZLDrqlkE
0Gx0JPlGq4Nm4U8byDJJlUpybMd4D1QgzkGLpZyK9BLCzR4Y12nULaOcpaLB
3N6oXIeZFnwOZwbekjPsb/WZiXfkBiXtsJpUApvA0I8GczcxRUrT6Fiq0faF
0TCxiQwKceGghexNsUZ8CcJgYLWEtJ6VKQFFRJKYsWLckntdHyMZWTbXLSsM
BvFyQYLKvNHL1Wm8CNNla8qSK5cXCKxqu7mHrlx7i2BZ/3fVJvelCXpJo2wl
kLbvpR9eJdADoRYwjK0DSEfhDFvThhN8KyL2I7rjBcTOULN69fbNdz+gAg00
vEsvhZbd+IcoZUQwxr3BtG1IlN8c5JL5T9x1+wOXXoMGZEbRrSEZtkRd6O9c
vKxBYqURO5auYZI0lnZY1FPnFy15QbPVQ9CNNRD9hS4vWwg8BSbs1mFccMwG
F69uf4BQ6uh0bXFjlpAR7IUn/BWMPUc57SG+R3fdSKkuus35jgVuDd/kOeoa
ACmEkjcvvnscFWjDem0QhtqlaZCiUHYbLyDX3lydQ83zwq/8O3NG//bj82cv
/kzaf2hzDifdUWVscBAhCwzIDvZdDNGiDN9qB1pD/K+vX774/uzN316dRI2i
2+b/FFsEuYv9B0TzyFptIZUqNngG2k0hOdw2ChbHxnCpMK/NeHGILEE/XXHC
vXA1+i+Gz0NMNQk/sSoQDQSyepAusZpE3CccyNY7U76xV2NGnWoqy2JeMXkO
R/Pjj+5v5RjpXHF075N6X0oXUsOvW8g3awWKImMNQRKy3PuIu7NhJj4aSuiY
zqDV50VohhRojQ2R6Vye+x3I3imZvmAbjDbN9smPr978DfwiiTFBWhLNaapq
2mmN5Ed3qlC3ieZ3Y2/k+gh6E6tWoXO4/l2HYaJoEA2oWE25tQf+yEnlpfJK
GIS4sBdy0IIAkL+OWUWvmFxRPajcTWUywpFO4GIBxXBotAkgLvRnyavV7bYF
CecKk0FDykM8BagMoZk0Z8VTd2UyFd2LoCj6l9C4H5AXN4YgeNnCCV3AmID6
ILK7LiVkr+w8KXNkL9ELlU4gyfiqXlReNsO9HOeakcW4ulxWlRdh1SKyO4Z/
Sg+P/oYd3ErIwPRlC/pO1aUDkywSua9d7BF/OErrVGISMb0ck0MjMylc7nSD
8N/QmC75UCvvT9CIjbR3YpnZscKTXHWL5Az57cRuBnXWIcHUUC0KvLr2euom
QyVUdOn7fs5hHU79VhqqtrIIC8JVDV6fwJx6GeM3qB+5uGF47A7GPorJRaVv
oets2SPRMZjG7J/MarlQegC5yP2Q2FuinoE9pBtnc03ulgFNeNsDLYr2Nxm7
sIcdLMo+sMHJCRdib/GTe8UEWezXc0ACeQkJtNwrvulcidpnmLhkQ34eyx5l
tGXd2uiOfHIvwZ+GgvhcRbpm2NM32MLpmmmSboFRLXGjhdm3RpezRhcqmP6x
ZpFsLhtNQCVEeuCwC+SbHsAeIrGos4CFbIbjejlee4t7T47Rw9GD+6MvR49d
epQUAtd6C44VWjb2mkXbSXC7LinJA8Bdw2Y5nCNNV3Xlf12PWyXfE08hTy0y
eILtBuEOGXN0pqyDBs1Ya4uxagP3thihsTc4Xnp/pKAmDLHHcwoyS582c4AC
s7xfGriDyX+2AA7h5ZxL7LWYG00WAcrEAmSiDFgNshZWBPtvZlGu+HLM4gLO
gBRVQBd5sL70aaaNWUcnw5p7fhOTZnNAddOOZQccHRTF6cn//fbkxfEJW3Nm
MvfK/fDot5sfPd9PZjZ6+Xjzy+POy+eYX7zhxx7Y6FNPN39q0vnU+Faf8h0b
jeIaP7ze3oglJV42kESKT+XvekNCpDXebMVebqftAyrjGZe4kX0z6Nw6vFni
E0khSysqS4YpV3N/3a4hHewnKruXikMJ0rpQ8kJo+81Xt+01hxe3GC3affvF
TFCYv+fs94LWveWTaGs6ZM5MhQZVqKUt8kIvvZJxnjOQRM2SzUkWwVEFCdbh
6YhpZQdWnoKJpZp/9L3PHoBtAFTYy329sqr3bF+AdRItnb2XaIZAc60p6utl
jIibcjKhoi1BpCCQFWMb6ksupfCSCx5lrNxAjtY9kMoSQgn88yWUGDV/cuKQ
KNHsgGiQhp2T+1ilNog9x4ujaX1CYU1xm+R2MHLYcbUFwoSjR2vO5lLeTI/d
qFqrWjX3Gf0VeZQCoNHY4xahuD9wqTmyAL4Y9GHHXsl2fY6/XwLFE8X8cONh
RSlDLB176IJ3zfqfHLr1eUqxlQ4x2F6zpIK0PZxPQ0v0xeBoAkMfKDMx1bMT
pReL0mDIwA750AAfiiLyc2zwb4QiAMwMCR4Z/lwcpSB+3Fjvg7Gg4irR982B
XKklh7tbCoZTQZdmxYGKCXXkKRHCUU4MHeyUmwvj4r3h3R7GQebBhHeJg1sX
TgjcAss9C5JJAyUpgB2euJTzyzhK7GHDNUydpvABBOwym5MDW8wcx+m/+GWK
gEAPRZpwKRoq9bMtXopVJ1p3Lw+9NzzQ9w5IzotGXb/303FROamfF+aJxeFF
uUApTWxMpWwcjVwsCVTOqLlXL1+cnvjWn56cOqfQMH/1U0wqwvFYN5ndqyOn
HsGj4+OT01PlHUkcvkBC4U8TyJ9yRtEQv8E4VsLTrj4ZOtLIToIlXOLQAwU9
xc0fhzEmFRZPjN8JCVKAfWmSBII464Q/CiICyRAT3zoeqg05JL2+6n3KJAj+
AeFs+MX09enJ86O/6Qwmpc+hwkazLJe135vrOTrm/YRxnQ457OyQMW1+98PJ
v7/C5D9lhOn6kEETqH5awJViXkU8SDLbZlfEgXBozUsQIuugmNkK+aXnvBHp
mtLgZTDPBZ/z7POXTBfbjLGPwuDI+IdgiyCKJjThjXbg3chOXIYhxMoE04qJ
Y2VbAo0mdImmnZ2i+Zn3u+75yaZZh7BIM78IcXukYYIG35czjGvN6LhaSPHX
USJsMSxeE030Cc3cfAuwmHIqboUrNqn6t4QV86kIiNmqPEsTGuGnAz+udoMf
Vzn4cQem65+Kc4TxtylIGT4J/9qMYTVzkcWwhr/fDp8cspr/Z/NY5PbepZu9
SFv9cx5oa/dXSVdNGflIQVwQSAP1I6Ul8we/npu7jg4/XyFNTGg+J04vuWZN
niG6WRRxkOJ0rsrlu4wB0ToQYbDMaMKc0H+JoILrpvppPFtPJMyDVczAZSpY
VgxVk6JEeItVPSOwFkfuMTvaRIKiVI2uY0/zL/a1NiArMTUCxaY1ooyCKq2Z
Nnv51BlwXdqV4Wj4xHcLwDLzctZcKI8JuZtEu0MIycpBEdTZrJpBD2wpoT2h
PnnolRN1BH8x+nJ/wPgssfW4covxibWygEl6xSjqax3gFEPI4pWytuD2PAA9
To1JQtbyF0LS4rQm9ZVGG7QzuzvaxgXiY9qU8Q74L69tlghTnEj4bpVhaIKJ
vQTPPgKjGouDphW01WM4GmB1fxpypoNS0wZ+f15OHHctcbfZlemb2xxyGbBh
Qb726WGZ5rRk7LRZauSD6VMRYLAli5ahs1mMQSFV/vA9TVXWkpMbUmpDtYxM
cEcC/Rge2iEV2IUrpR9GLTq+CBZCzBpAtdO7ap+b3IKpTprqA1dr37hVPFm6
gnoJkHKEoB5Kp2b8FH1LDwsGJOm8gAAgZIoW8pqjFNwS/d1Tu5VCNwQ/1bRh
nIcl+30m9SSmoWMeS+PRkKDwfgQkevaSvyMxokgQs3+a9EJEquHomdsZGJTC
juD6q0ndBd5iMozoxu92WvoIr5g4sXjYUa1tc4TmYPqDI3upeHcoBjwDz4RZ
sHrO+xScWI1XH8D7I8opzqdud1uh2HgQROrilir24B7UafFTKzKWSigjnugm
6D5aoUr1HEMQaYme8xB4s5bgLkS7GdwxtRbkI8kSwiSZq5vOLUwUG6g7oX6v
qWyHRnEADyvCfdQHQu9HmX8YDp28KUFH7HFkBJR5HoUuQHN7TwTQHsdnFdln
3a5G71shRR8amiaqGoWzJCKWCk4GZNiSnqyTifOSwIYkrZqQeFG60CtcY4B4
QrS5LFKVBGE1IVIJhzDR1Iw3AfZ6E3aOYFsDMtRpCcN+pM+hUeaMDHGGPSAA
/JBJk7pBg3PbQTAGWBs5zxwpiaVg3KFAfKLLaVh+PPP7iDybMtTprLy4Ywxa
CIIThuzzDgLs8wyCa38Hn1AkqJmQArvAG0iXnk545Ee4E88Qf4eVzn9SB1Hw
yISzq046PbXm2rku9YKBhbmYQ7GZj3WdUH2pX8FzEnk6ntzv1FoeFm+C6Dim
U0ygPao0haA9pvOaRG4PJXy4lecjphn82Jzq6W5OjelOOdXTXXOq4zFk3QHR
I7fzW1hCta2Z1dOdM6unu2ZWJ9/fPLydsqsjirhufvX0w/Ork77SMO80wzrq
+9a52OT8CeFiE7MamxO3MjhMurP3oGD6+Y2Nb9uATzfNxwZLn3JicG1Smos4
V3hjPvDIHZlomsYr39ctZj5ziJCDaFaggzqruKyNOW5zFN7VrL7AJsFYjqJL
kdtGWHGI3ssG+nQ+HSvsUgG9QBj3jAOeEAaezdivACWk10vQ3azvqVWtjZzy
veq0SRsE+zSUAhl1lnsHp5INSrkoQ8E8FGfYG+rbqrjn278CQBkFp+/JuAUL
eO+qfFdJ8hT+VgqYy3LecwiQRN2xsSTHPNk9+e4Uh53VXhm9GUO+fgUOMUpv
qq7AaCkVyJxHLTlwQKJvHjZmrBqSyotoZsVY8fV8fmOXTfw9nM+FboD5TfCS
ysiZToDgmfd6caNYViO79foS3KdxtuR0xwT36d0muAvtJritpneS4j79yBT3
aSbFfZqkuE9/oxT3aTbFffr7S3GXZb1NkvvUJLlPbZL79B+c5D79PSa5T+82
yf1NF6v2EZnJU5uZPP21MpN5U9FFY/OTTwUJC2+RLy9ORK7nVh8xnupYHTlI
Alzs1GqlzLskKISGEWbX8TuwKoD4WzS5NucRY1VVuQDI+2zPUAhetCGZ2IVd
mmT9RrOUzf0VMRfnTuyQ+ytizmJCokSOTu6vZMFy/pFF6mtFmfhIItZLPmE0
lshiZphprHnidsES5ig4gvNas38G/N4OmSdxceh9eZM1rVicxcKHn9xFnpGc
GqUTESP3eUI6WWPnay15Ew+i358qqTQymE5CTbIpOjh0eg9yY4pcYkyPQ/Qx
SpzcGBmllg6R8YVQm85Z04lghhmIodY0NfMgnWWggZUg0dVAXQN5GJybiWTs
TRBHKdWmkiyfID7t5Nsf7pQgHt35NkNhlwRxPLGpJ3mHBHESW+iQ+ZUSxNMp
ZkFLk3n8+lgUbJT1EHAiyCvYW2GvqBafCchwSBY5VERZn7hg9aADU6oamcxv
Cltp8AYzd2Dp6NHWKQ8XY7f97RRbd9axzUGz1ijTGnbd86McEGByQNt0P0Mj
5u0RyHFfL98jl0uZI4mAczoP/jmatB+P/uYm1RQj4lcm2itxPCJQSVIFtdRY
sj6HMTdubMwqXBR8i++lepvfxLNS7rPkosfEreI/G78N/f/6214G4pwk6yrC
BN3J4WMQMIO9eONlacDKwmDPibcGvl6O31lIhSDJY0iFEoZ66U6RKFuxXA0x
+AfljrKDo1nyrx2TmWQodby2P6VLFyh+WtjwzwMfAr0xSMVMQmyg/AG7EhsU
gdggPV5bqA0Cavp21AYGfO1uQ20gJMhuN2qDjnd9R2qDTuRrG7VB0Udt4Owk
dakNin5qA9dPbbApGuDy1AZFTG0QkgzAvPkXucE/jtzgY5DTCcGAsxrpXcfL
VOP5Jw2V/dGw1DxU2R2A5WUye+5OBLAuCCz0wSDqOB3lgwOCwdFhkkH/WIDq
Jw8kzGjJ3wFWXQqI+ges5sMpO9BZG1m0bO+3Ci52Ko59BLh6fLncjqzGh7ZE
IPGZOPyYjTR1Op+NNqVP3S62mNRWSsOL500zK8yP7/ryrGq2RBbhoU5osbc5
skeTJzuxWHhyt2Bsd0hb522noGVahqobtwzjvn3gsttrHfadhi/TUdxibnrC
mPZIWx0/mN9a4yaKX3BdFDxRFP5IkVb7hLFjquEQZpDbiihPUNzh2ZUULeqF
pKtyAnMo2P0mwrNWeDW1UgMIXcuSCSegZIZgc4poah5TpXAYU3tZL0DdLRez
m4F2R2SyZjz6httVMAN7CdxGmc0BV5/bEj08hNBmbSwtZdV3BhNOJa9hpofI
JjctW4xgnVNAkGwrgbkJjho0oWm99Lr9eFa2jDoennvLAzP9z/+TCUchfqBT
0l1pEyAUTB1pWGzkorZAxY0wBDVk/56/rZY3/dBsI6H/hc1OsNnhYtoKztb4
oWx4CgbCd9N4oF5l/QFBk1gdxQZdUdjwoL06oxBKLF84ikJiBguUB9e6w9Bc
l4yTR2g1HoWL13POhuAdRmEX3HrRlDm5+nCgfp1PwDLNtUg1csmH58XXomxX
+dWelRK+jHV50Ly91irefVsMyrCSeIlFHQrxF0RkFkVelvAIslGN+DjC3KFV
gjQtc73fsWkKlPs3SW07peN7Ai/4dWRSUP0a3e3J10ALqEr0oZppZPAnKZze
ZEBfSdB9t3unwRGnWHS+Yw6L746eezNSz5L/6HOVRZyErQ5h/38vm4tmTo6Y
xl7omi5Vsv9cv+SbAhAJF5xq0Y2UzieHKyOlhp1ffDqapUyZCTYbTOx2/Lgf
2Xd4W2rHuKS9GYTxsZO1g64vDY3mfG1+n+InqPktKQ1powL18FcdGxz1HO6i
iyXwL+0ZO0xN9P2Ica6gQQXDyevqxR45DHGQ+2HvyPTQoq7nHGRHCzG+8mFr
teBGKGdQwAGujr+Cf5+8FXz5t+NyjqtwlCTGE6u2pJV9G5X/tKcv/gvs1Oty
luasKG8ByQ64G6FHKSTajs/QCmGwA3zuZLB+EiVsoADniDAnA4QQCbgWbxDN
IBnDy3pRFXsQdHjHrVyWSyD/uSyXGnprlaGbg0+E2RIHLxJmIAh2TlaGLGJX
kku2Wt3idQAuzfqqRj+HBMMmRLAeT8XEL2rLZcFjZmOadlqrIRF00PYDhUh0
MWALKXlBcR6YDgR9MhjNgFkziWbYWYRGA77jvc7EdO1nipVKBHzhIETfXVYk
QeQC9UIBXsI5g/AMfnWIQU3WeG7ozmGOMqbapv03hSNUFvNqhQzrfspCLmjI
GMGrdKDwKjpw5crQPbBzgxUiZdPIr4/vPKDphecArhks0FKTEIggckBhdsnZ
KTaFrhD8cMCTxBs5YCEUoAfVHfciHAyDNijoul/gUYQtmZMeImmNGnmoAf5z
rDOpyErJQy1oRHgiCCdgqfZE/omGGpFx0nuoWMwDEMEGsAQ9iJSNom3hXuiS
cMqzTOGDjv+qla1LwyrR6S/GDOj5NqYQ6MsxBoTsJuBjoZ0WyleiRx4317dx
XmQZMYyZE0BHLM8yprCO7VsKoSo3RUghtQYdblmy6UgakuhBorgroReTgpua
edYgOVwYGxfsvImkwgbQaXCNY8stgVF8Ry9iYiUoPCrpPOWEkKPsxKWPY7ga
QHzlHNmHyHiVK1B5NwYoSm4GheZ1bLlUQ+1YygmADQisowRTKy6Rq8hy6+FA
wKKpEHLTzMWLFzYtrJTwwirvEisrhts/v456cARNavK89QV4EuJyoGyRUcl4
HOwEX6zpvsl8DCHBLEVlyYNmyWA8QHTyRQJBdpyLgPcMND3R7oIU8aBtKsQh
KJcdVVo0TqlQsAIX9yqQ9REeG5cFHDGCHVgiySFcsGL4h6q+du0tagOCziCy
/JDYhgQuJVzsQ9Lx0KRmItJyzFRVti4D1Uen3SrZ8f49nP9RznmjrmdiJDIz
KHwiv5s0qv9T9JogpOxZ3Snov6Sb2ntHKMd2s4AOMvlaAqsxXMNzw1irWqke
qAQPGXR+BESKYhSYuIsip467DTl13c5l78o9gqgI8hvL1gqYP8aG1cAhT1r7
foC+ZMa3ZXDwFgRkEuOA7gNrGkSs05H23x1boJ7Olt/RUDHvfSgqF4PZJOH4
g9crtjW6BwsJxyP0cY5KzGzUQ+Mwo+hozkKlItRBFoqJyv+UTlrzFMbkFd9t
huhOiYo4/yRkWlKdOTdRI7l3nJtYTpKP/ivq+ruIum6Pi4reGi3fHQREzSH7
48VEHx5Y19aQ/FKbiaVQAdkWAEXju4etryi+Ke7/dJ9+HkikKBsZhFfvhpBq
tiMh1Wy33M1ZLnfTWy+rRw/PVvYpyP1uN0cVZzsRUoWpyEbL9M9bQ682nIhv
5eOIsw8JI0ahv+jp9LLpvNqdlmUyLfDz4TFHHWr/9G1JlcQjwlouamRINNWC
fCbvPan0RAvPpWHJhJSLGZT7sMPIUJOd5IXuX4UFkzhRAX3tVcVBpNjbf7BX
b5BAAeNiSoPEwsfYF7/BldMj+0IKoe8XhlYB6xoB0hODmfHdThEy+CshsGLv
CjKXuh51I6Otqc4sZPCGvFRmpWzbZlyXyoevyFujN+mpGkXLh9DzpgXPGEUt
gW3Z300yDxq+dCav8cH9fQXHepM6uwUcceQICtMYvN7ehzQrBo1yZUhgImZo
JAK3Ara/U4y3FYesCw9RGtdBIWPC8GTw3rKkG2Kp5MNk/Hav4g40M0dvjJI3
sL5wX6Ykb57Y10kw52pZEzJtWY4DhS7tJmf9KTb9UENk6GObzppr+QR7Vcn1
7SdTsosloE0HT+K9DqrOJF7zmM44YpDtDefO/hXN7YvmznYO5uLSbGPZmm2N
4ppm+nI7Z5ZhS+5fbPG8Xl2V7TtosrMHPmXWLPAWizvG0XUDJHIHfZrMHvRo
GPZcUeh2pEyZe6hQvZEtupHFWOOWsEfA0zeHPreyxGGN0jogCDmUBfkAyqeS
c9DBSy8KqNxizHjzDyNg6s+RDHrSxyVGwtE6CiEL1LOD+6yzxNjBNUUOYDVg
WeIUWdjQMGWGI1umB/1w3vCeU9oNkkrDt/jOtK8Q/fRo36IOUADHcAMUSVEE
XRP5zFEDNhj1x2E6g+E5502Iw9sf9SRscXIDlPvAHHYNGYh8pvsDPJDs9xdn
KDueJLcITCd0uYBPDwN+vRJYVb7glov6hMokJDHt5zd4E3sGDSW8MJVRrGQ2
Y4pRjUzCa1gBIVxTfCOIzrH0tw7cjYUSX5Ci5PqUpyXaihAOsPz3wlDvsDU2
ZFusVGt+cxPqHkgJTP5+N13A8nbo+nP2SsraLnskR4QJbOQAKbC91FsGLs7X
J395+ecTkf8y7vi3eD8tuJwLysZAez50RLE3DLznRSg+rdwG/VGS35fvtyPY
e/Z1ep4j4QK3k2ireFOFYtQaFneq4EC9ikjHwYCOiEW0ZmwE2E/p38N9ODB3
42d612Z5DmGi/CJCeWyptUEdKA17ncbsq0UAOCFliJLWEeO+U576yGO6npPA
GIXgsmFXw+kZdMl7+42gnJkTn1Rjz9AQKZfFzCBdPnVsxEQGRLR6QsQIWZlX
FQQs6vYKBITQ8jOwyY8TCUU4pAE7ViOqBGT0+5IqLpCQsfYOYsFAJQxnRYpl
xIuNxcUIChBkAoV/ls364tKwEkugqfqpRI5dlPRcPgCPKxXOxFuK01Yd0UAz
kbNiUzFDH37p+zSpFhWWVZlT+ZX+WSOHVFwZhMWyesoV4VIqf6HR5LWMPc4o
F05MxNrAhYy2DEymHyODSdGGp5pmm23Z1t7NWsHFHGdGjDJtsCY5ktfXD7Zt
QrLThElFpapnongnzmveFpmt1vFX+sVaQlGw1sm3OIoiFgYJWF6zCpRuN8RU
KrJEZjf0JFQ3rxaz5gZ8noPs5eEHRr5Gul/tn2DWycSfr5bNrBAEcLFXjS5G
gyKybYTAA16YV9eBhND46EH6XNWzEvyn43rmb5X9kXZcDPu+jne5XKliGPU7
GZb/LuRagn4wVkIlE4kH6UJMQLT2vgV1hJgXwU3CNZiYE7oM+gmZkYw0Yr5e
w19jUR5DTP322kDTUmn1loN0iAa8qttzfxFyLJc/iJiQZY3V1drFeomFpczV
wUK9PQxxMPyKb0G/A64FCByb4qQW/0Ap09SLKP4ek1fBvEzqdjErx2C6sBcA
eHiXNSQpi/Hd1duEIOSqQVZCvwSslGPI2e/ZB6PiiKEygqJCwKHsmWV1BQ4Z
ljhRJjujFBO2e6jWt/C9vCpRF9RgIPht5BhDYjIWWmSTAIW23KSUMYzz/ElP
zJNAbWTPQffIAeRNU+WixwPAKhtgEtqs208Nq3DpqUNTq148HLHQiE+t73c1
mw4wwBTuiBhvkbPXOkWA+qr8CEQEozBtkPOahwFe+o76SUA7nMKOElob6UQx
0fScj6gAHJHfjlFdxv3iG2E2ZQO8MteJ18chaw4R4u8rS7B8UJSonBDCRNUT
0iHNveWSgkYgHq7KG4IPmpsKETiq0/LG76tHnFw0vReqsY2pVnCwm/2JLGeS
K55bT9EliBMBDR028aeYfIjeIX8KJgSkDMWFwWY/t6nOCFyhL6f5LS4NOxtu
JiYc2DHgG3DuxnEYSARYpbzjqC/VbyI31D9puDcO3RwUGedAJ7nBIIq7bgLY
LRHGcQP5bZzaAL6Nq3IG1gll3N8iffaDWHBh1L8+Ce4jcTJ20lLbnoTU22ei
3k0K6i4ZqDskoO6Wf7ol8fTWGaewCQk68ziJazL9i5LYLpURZnOQd3lGd4s/
uGezar451puLaWZaZEPuLJniTuqqwG42p8J2Sgnhci1KvxGjtrC3/ZmtduqS
xTB/ymWwdjfhljTfcSbD135+vHMi7rYM3N1Tbzfk3H5Qym13OmTkt8i13SHw
vTnLVv6aD3wH1xVKJcPl4i9cdIeuF0y5S9XmHxQxI38R15x/Mnr4sFN0HiOW
ZNZ5xQ55ejmfNihrSORBkknRLcEmIcPBBXfgIFjmEjQdcy2VznCwlK5J0u0E
YCn+6b/Vwzfr6LpuIwA0zwqmKnZa7CFsLY3chFm6Rl/aKl6DunVEIbVkIzRI
Unjn0ivnVwqaJZ2GKq/DxI6c+YKoubuxsDqbdWmqlRSImoR3XqCuvxD2HXi+
dX9/UXzKYrCt/9svzN6L4rPiwX70W8qxrhg82zInqvOnD255wf/i6zQn4VUc
RfnO636wW9x0+v7h1RkmEvmWzqDAPT82t8oBrZj4sOGlIekLJonNdAdNykWJ
BarYeGPSsWVNVF7AyER8hD82/1l5xdGrAX5H3zBDEb07xHdd0CTL4qKG4JBV
H8BqgJIe/hdX5BLD6sDhTfyY5eG7oi8OpcNYDixsihqLbcn+kGhqEzDZqKDe
IANkw7sEOLqirYgkubhTWgXSsW1ODkzqGgNEONL9bFrE2+0CaDD1hCzJOpFg
RTbim1bVamNlmMqOMFJEA2Gm6j3upHBbMMsuRCUlcRW65nsAWaAUYIhmDsY9
SI8gGoLVhIAZbNo4ohHGrygpkV+q1boMsZnUAzW+BJeVo8wuMCin1bW40ttC
uByTWGVFTIeOf3u1RvcxGGJ+l5HBwjERSJ+DUhq60suKMmPMWNSRip6IkB00
6gh/jkPWVJ18WYNQROpaJSN25ooeUE4g58dJFoJ6IZBpQRPXHFgT+B5bjtQi
0xmjDKsZKjJkXAF4xZ2KLkqVXhpe578SFTV2wnTLcRDc/ApYYZ0z6p4JLopK
qF4O/oWUSkogFDAxa4RIv2efQcT7UOyJkrXPcIWE4yvx3hAvLpNScGUuYTkO
jcucCoC8PStnF42XN5dXnGtg6mRj0gYKPy8FSVjKoMxrebl4qN9tz8hdQNxw
nMQgYydRwsLBK8QX1GF/h8MIpJY5eS7li1q/ELc0JJ+6WAXH7BqMQJDjEkvE
mIKUSb5QRJknmRDYeAIe8P9/jaJZPjRsx14t+OUXPRj4b+aLuOIUSpRR3DHw
aUvJdviaTiJyU4xwZ0UGgm4vvFBpgrBF3hviOLvC+k56C4A0UHCGrKC5B0Mg
RSJsJInn5UzzJIhtg2hKyE3KNygl3MDxKmf1xRzYAAm4lLQKABW4ERFbJbff
EFvhew+dJ+ampAnYgErRlMeOd1nBaUPybrADPptgIfEzZYXTuo1FyFhEKSEg
NrtH0HeBrO0luL2H6KkJR4UcXrDBQRLJcEbj5oxBf1Q6LvZqtodF6e+7ShzX
3eHRW/D7d2HPUr4zr15IKAzBv4ajqTQwm+QsAbjUn7Mxoh4Zm7pC/Ksho9sY
75fBXaoOGKRZIE0dqOac57LRxJYZqMaisEZ1+KiHhsFhK1vDLrlzGP8UqCbU
3ksJGuBNQ9GgrqFzQldcijbtxj1kFvTLXpptPeycQRnva5790aaMTILihDY3
VXEMJRzxN/AqO6lKVg5otTRQj3ardhFZROkkYdyeQXFWBe3vJyOuYvKETMej
JCrcTJvyqHqTqPgiByhCnCMkVzDeTlCzABXBKXqAJTOPMIAoaoIhxwuY8tZq
d/miC17KoO6KOHKEm7iZ+wdX9RiVSqB5mIkb+8B0wm+IaLIGdq9Er3LOlFwG
zlpZIqTgHdZw/TUyhNe9nUJasYkTuG82gPhscZ8u2G5/4FBQm7taWZ9k+9Fx
zU6AC5sdb71ZtTJFqI2AA/U/JKIDSSig6ksv0cqW0tFXl7l4ilezue6Ml43D
Zkr8GkDVUlFNFjYEnBgBmoptdF/l0qEJV3sHY7dMUiWRAfv1PREVwSJhMbcG
8I4jwDMEfvPlEsKnEFEmrD6OapIgkYTYMQJv4jG8FFkWGHpah2IOL8dMIUNw
iExDJRKcpnJ2Xd60Gr6Rpvx+Rjmcta5AbDUrZtCQN5bVdKboYkPmHy8WIEKQ
h7p0hCe3tEPR5RyC58Gmby4A7OFaZX/XvRPWTuAj4lki1m1wz9PN+0msnJBE
IIinhvcZAGUAIp/o1PgdePITogJQc+I9Kv5zMmXgUuSs/uBKd6RRW4bdNAxk
OFcA64MsGJST//3Jm4j/OQ32pk64x49c4oTLwMCQAsb0EPZrhzohYBta1Agh
ym5xDYGvWrWwHbHw7gO4nydUah4RPxabkJsToLAzNokNlQFsJfoaVqVZz8Pj
Th7dMzdFmS73vjoH8gB6pEqy54/8XtGk07aAMzebIRzcqdMk+CZSgeefba4T
GebICwhP1QDDaNdE38y3CCnaJuNXyntiVrCoYMLvtGOnnXQ6eHr8nbGpz0l/
bxbA74dAUukVWH7G+xRTvfg93FZ6M0h3CBvTAAyBo4JksNq8I/xkYDZLipz5
nbNYhSs3TBZIDkJSZRVN6xEWk49Sb5ygjent+DiGs/rwfyG9dyH03m53eu8i
pvd2G+m9iy5sN+qoc+QEYiRQGmn0899eAs9K2c0ScI9DSrtlDQye84e+z5gz
e0p7+6HjXYZ0ebiver6NYR8uu4fYK0fylGIhjfoFH6Jl/HjQp1M6xIpptx4N
2MubNFR8QepJpHE4o9xIrhh8qm2MHoGXv70yBCfpr9/xesarTJ23emH49COO
HjH6Lq8ai2aIUTknAa94bovis+GWn8/8Qz93AuDJz8+7t2QE3UFxP20IW/rZ
+CIP/HpteIgynorH3Wd27ZON+PXsaAn9ndCfDzqzAfURrwAz2koU9A7nOwQ3
P3C+ifIS1ISq6Pz8rA/R8fj7/f/3oOch+LF+3uL+T4+mXmkATor0IfJY9X1O
fsYNfRV8J2adOw+hwZS0Fj+EDwrBmP/vA39G+h5Ss+2g+LLTcePNKR70TwFa
nSP/c4eTOQFOhcfVF3cxmY/udjLv7zKZyUO3nExgM/DziawGdzCZX3311ZPy
fDy5i8l83P/QH2lnfrwwjIAgKg1fY2Qr5ACaR6HE0Y3FFt0GnfgPY6T5Z0Qk
/nEJaNSC+HD2mZjfbgsJVwaqye7fFRIx0ZZinzH5iSEQ+fqYbGhajJ0cvX80
9pvHQRMCRD3UKYSiy9N6eeWFAoYsvMJ7AovZz4cj794Wiklv3Q27zQ6QTHlu
F3abDjQTf9vBMu7EWxMPtAeDZh65FX+NvnmHuLwOh82Hc85E3ds89C3cM7pB
yZctUSQ6zd5qB/cGpOxdlUtMwm7J/ocs15CaitSd1ptvfo1hMbmtOFXQZHNL
a+SFgdSic/D+VYA4UW4A5DOWNBzkDqYSgWOSWSgAQm9sLovrFusN6XgDYQkl
7zHmhlE6umStJDCKqDH5LSMNXQSwiJ7UeupkMGN64gq8uJSCk66Ev1CwgP1K
xx7ufWEwXDVu3iyvysjLvlqW06m3ddFjO+qsMNcI3KG2RgAtam0NcLTVXuJx
0BlXiLLO7s0RstSOl+vzew4zFUvOu3199Oyp5OhJDuay0hCbxvORnnvk3jQX
xG6Knj+zhwrim70KYCf23SP1r+MyHf4hlKy4g/+LWGIhU9G/cFVexLxCTv1a
DAtdL5XQlOQz5Rj307d8XDGOlbIGRPlC/6tYXG5RkkN2+TYml+31OJKmUjYX
aA+j5AbR9YYDJhxf/dwA9agRKcZN5cHxK/j7qABys6wvABMT7Vshe2fpuQIv
svSWJd8hJFkSkIo7jTp5mPJeUpblh5CyJFXUczswG6/BXYVmAXjvCcGDuehA
qikCuyvRE3oXQrEww8ud0rsAjC/SGzaFlrcUuE/kZqh5zAG6tCryYXCsevma
YjUYc8ilhjoaKyUVOkr5FcQbaop0wgQuRjWauVhU4FstXegNznxf6h9H2ITd
GT8nmyD6IOxZTNpOaQD+Hg7JwB6Yz8KB2WfYSYDO8OmINgUxxWW+EI6W4jH4
hkaJGbEGGzpre63745tc2p9H0EfaGpBOPAaUGqH3q86hNSf2SjpPERNOAl1g
FJjCgmh1tLmCq3GQjpIT85oPIhSmaLSiYgPBdBdTE1A2NBRQjxvkatUaQtVy
VkElsny9kWpiaw/+su94dyCHu98cvydilB18JAwFM3tZt5EEHe/aS8Jfk4//
kyZxxnmVvPvodryuaOYUCGnlAN7uS7t6k5qmxFy1Ei4W6faxtLoi13/9zMsv
1AsgRTCGxWuvCWON8eNLuuvB5NxIi6vFxm/nBuC3PsgN8Kub9zum2EVjyJu5
9pHbFQfVVzMpgyhLa+5wQclzaHj6P0x37PSm3MDoma35gebpu/JFZPt66yTB
HRwVtu9b52Kjo0LO0BIWYdVGLLFwCgMjhjOMGHi5krVVL9WhIXqI4udnN27t
7T2yaC3cuOs/UGpDZu1wwNohRYICuDRcvqx45F0CqiC/56w/ruLBdcuIsSIH
WR0Ikx6jBFlPdHHxrdSoY3IDKWRKqBPEm5IVHZkNdHkMr/zQakRkjtKN4wQc
JpRUkozPF0nouJakC9cn+kGaiJUVsJbMb6mCEiqJajOUt86ElqPO3tjBxXEA
Z8LR4vLjLSQ4Qfe44nmp5aewpg1RkVFeiXih6PKGLaPAUfBzMOkJY0qaq4Vf
IH/Xj9J+xuVHzcrQNPGMO6TLYe+UbG9QH5P93SqbHxRmBd16FbD15J0pi2uq
JMPllwqqjqEllZzBQocB4R9hQPUq7wixZgCBdcVyBpAVEPwEfdRy8YY7AB4E
TYG0EeKzHseldG3RPMLpCr+HUp+Af6mA3XKwm9+hm4Xaqf25g6thI1+sLfcZ
hiuxHMlsi29Hzktj907OfCd+5niy4GmNow4SDtFxg3XF7AzyfKERVWIY5gSS
2bCkKABO4Q3S3acAkKIJh6d3MQAPNbkuYc8IhB0b3Br9hUlMrUqoS8L4Z0wc
5FudLE8A6U7IhQr3ZJj5/dFvzzSL6dNh6+OMfyTprE2mDDdkSuxq1Rfagqri
pB6hxEHoLeRyOQ8FK08VycgTfG2aDsVaUb7m5fPqGgKmvt16AYjWceVNx7pp
iXOrOBK51UMLTge/OQ/+JONwYUpBZYyxF7nW9SKKOHwzJqHBtfUyFaUjso6Z
xOZ9FqSUXKRidIU5TaaqoThYpOZc7IzAd5u5NZNwPGD2cPJv544NTHKFKZ7H
bzOxo9BLyiURjju+Bu65OdbLezjqlvwknmbINkyg7RJXcUFjjFwtm2IrcmwM
fZu/7aWOWSVUvlGaGRDw+H6QYZVyqmHcWFylnLIJfUTHPY0SSWAZiEvbmxj2
wtrZdcN3eCbEKwbnUy54uPzacPNFPjvUsfgWED2lBB0MsMYtec9IVYGtKKvC
gGYcgd5ILNwPMv55P8pZtUruf8k3orTrduX7rcADzh1pQjVLViioqOxAjO1Q
6DKXCyWVn2VgEZdusT35r+BSqZhYALLFr8AomZKgwXzUpIRm7LTwSwF7EOl1
EpIZ8PRFyAmcyc78Rb1nZ0a+QCdhx9H1AU1Zdb1Zas1ic+WrpwIn4GC3209q
vEV3J4Y2bHE29Smu50QQOxGKYaNbF6lu3ZHZQcUPj2r7qs27ly+e/y2jzQ+Y
oDyROYialtnnnJP8biS9mxi9RPv2lwfMD1LMioOYEN3oCEPLV64yp85Y9Ku2
kTsz+0XMhO/EU6JgT3qJDzh1FlUBYkAkrba0DYtxFDYm7RcXZ3Ypt6weVdPP
d5ACBKmSS5c/pEQySzB2nPFeiy2znJFq5tKIE+6dU/YYwlY74iQcumnc8/pd
Fdm8KXeyGFxKPq4+TCqrPceDpy7SbizKpv30bFPr1cQE059WtJhgjYFBYkvK
Ql3h81ndXmLilJ147RpREUyoUk1RX/ldAJnKsxsMAVR4Pl+9ffPdD0gjO3de
A5yBWkXd+zTESu8+K2nhX+ANjW0O0WNL4CqQYrgnsTof09LYyHQ0H0q2eAjS
HyBP8QvqRw+sjHqVyC+CK9nlXcm5AAnGlFOJsyGo/McJR5C86MI1G0xBQMPr
rhGbYgT/k1NKhmhEGF60GtB2NasvEEmDLHMsRTkewZarugjuhvTRRCB4o//6
EYgvJQLBBbmGXgTNtlfi42oTtwo40Dt3gzpc74g6XO8WlljvFJZY74Q6tMPM
+rPNA7dCHPJ7eR//+jfGG5rObRr0Fhc+b0Jrs24odecM+jCUgLZVXrKpkaP4
Y5vqsr3tL8z2MCrMpj2OavOhH2bggMDbP2M4/6KhBI4+ovXy16OgfazKEm1H
0nllzCup2xfVQRc1bg5fnvvLK6TY1pN+2Nr6X1XH+vBq693xauJ3plojQmQI
DtXEi7ze6kXmJjY7k9cJXC3g0tgNJwU3tHcEnMPt4W+zVUmGpDk7Uqojlnvs
y+K9y33j67hdL6hQs0zWh1UEw5x+ubigfYHgWWepGZpYxJ0DAu4i6NOs1oRP
O0DB3tlzRIdkL2bGoOpPUyz0QDpAUtSqp8iO4bXhPmIZLmJtsL2tY6OT+OdN
qfGuS/ofVflM1/6jK5952xv3DqTpLgcde58kKBn7tKdWYcImIYjbKSyF4EMu
j9YZAoD+ZAgD0Yl7JyZylutdZF3lGYifSyF+xU4QP8dHh9FiSuz4AWi+9Drz
ktxbbivyg5DaXM1bdozrPDsVMXCVMAYnwPKYLN3S53sVwml1MHRw+h36Wtct
bc/QrZv6obocRZ6ZH+nuqvI9kwbSVhDIGzIh0X5hTBsC5OMV85fZ1QIdPwAy
d1IpiM8y+uAHXHSEtuDARnIZ+eeUvQN7gJsZXUjAzcUGgoZU5fqfOIpecb22
TVXYirgKm9teHi1+XblbOuXRir7yaOLDxmnFr8/KRVsxLJHoxWxFtyY5b46W
rafG2u0KqkWaCjLoOZ02v72WoBz8bzDmpdQYbrF5oyUSQQzh/boXDuv+XZv7
LGH+ZetvtfXrOd864qVC5eh6LkTf6DKGBJU7sO1JSv36lv1XB1F0c1j8FaOP
xwqq6FR1IPDSNpueTFKUn2cRq6QYpcimP76+oJzynD0KJB49Vdi5rQIbwH90
i7ojl9itbNRMbxMrtftEDnSHwcgo0Mna3vGbZ3/x5+Hs2XdnxM33TXH/p/v0
80B6lfWKYDN34hTBSdvNL8KPZlwj6O6uzi6b68dJo2BQbXKPSJtbi0zwgz2F
JnqexhKV0YOZNYUHu3ump8XAWZgMKy7GoU/Try0kFWc2qWVhG98KXzVrn3Wa
hL/fDrhK72VQqx3H1/Uy4/hK9wA9xTiw6MkOCvY6h4KFn05lEP8kUpqy2yqZ
1k65EX0cLxoggk3e6HjrrpmvYsdV2ADGNQ9sQ+LqoxkX3fWHw3BtF3lsdwrC
Dd3ePAHbSnXQVbNLrQ58ckOxjkfbinVwli9elKyq3n2tDjueqnUWl7NrsQ6n
xTqK3Yt1OC7W4fWbwJZJn+Vx1/MalL8ZUtWTRu4EcMBIWtvZGDW6EcJ7KNgm
hOSk8KRNCc67oJmpJPhlVfA5hpnBUgHj9coxZT/MIpajDzUQV5BlZRO8+uuY
XG+qY0LbjhIVbSETAYewkYIQ3WwZ8kWJSqK/UpiPT4W9XAUYqR7ZC1bypT8E
aHrosI4AvaFFTuL7i3nvGfcaeuQq4gMlC6JdMQaBS1jStEMutdim2Ado0OV4
2QmeUgmijeYLC38g3UWWkj3iY5cd0S0aIsjLjvuTnbzyNVDDq3q2N6vme2GY
+5CQG00IOlZFF9kAlOUIA4EHlcZYkEWBeaiOnwveHQuKxnsUvEyxAyr5hBj4
kp5eti3NrgBXRGwpgy/jGHf2/N0uIzZobB+aDisszI0ZLm0c3uBhROwcx7It
Lsrp1DIV3qxdzyfgRSCG33CI4DoqHXnfhkYWHnYMJhznCgq+kNwo+fgB3Ib4
QbGUZCh/XAbYYBfWIpsp6KtY14aX1PekaYGoIYwS7w8ik3Zd9vku7bxwVEP3
hEmYkKKG3V+o/bkzqo4yegrQPEiBPJCKAfMVlXcNZNgOgUihYnoy9x2Ut6nm
4Yy3vbd0B4+DA+GChnLGf7EX9lha4MOugYEZuUxiezf/HHl2KM1BhSUeZ2Z/
TO5zrW0iESCTX8+SM/7sS71MY9BdosMi9G7kjoTHOloo9gDvRb+EohzFN95W
3HcJMT1JA0l2xCDGjfEqawuHHXiYv71mM6mJ0toaLm2uAaee9YinHo/brCSc
9aq6QDFuIbNQlhhKy0P3NpVHycy9OpHDSD8BtJ8oYER9zTsdDT8t97KL6Q27
zN079UYMlukmHJpqG5wZJKeaSKf4iuialHBRMD2JlWyOXjs+OmUsFe7se9/D
b8XRjO4W87WjRDWxda3gwzvVtXo7nwGEjsqxRVlLgyQtDZGkznySGNwBpYUE
7tavWs0nQTbPKgFoSTbuQUfCSlsG/0L3IaKNKe1Z6hAF0hxWt2E/+VbmpGRB
32DxpQYUr2HOgRzUVVgWrFgNcwNZSw06QZk3xtABB+3M6BB4Ot0eLgBu9n1b
Z4umLyq0xTo3vCBRkz01nen8Uv3nnQtvIfgOWnW3qLslv+W6W25D3S2+P0Lh
rUj/3anyliZFYOktKREfJIg/wF7IoCniUkk4yBnsnNildvkApsuNG9ITmPEJ
8xU33lOAUZC5D+73bRXcQtUBquBN9BaUTGHiVpadzhYuGYRbVHxEA4Jz3nAu
nx9rOYtJHyaNuOVRhNReYtLZkO6PZCjsW9HhWA8MxfrS8fhZXaP5RxhPdKKj
hsTjkhXl2hYSDEHNBHiWS2Q0gq/gbLTWy0fplVsEKPf9jpKGjmwBriRlKNTf
KrsQDjLiSOVq/Ljevjh9c/Tt85PHfGgPtGKP3DNF0TVvmZMrBHlDvFL7Qf72
kpJQooIIc/NVe3YY6DuIki+oulaIEGGv40JhHNukAQ47x3eU+NmKcSAKQLqU
NB8inaUKSunoptMEhvQQJ3WFaGeVyIrCEW/cJ6/8E99ioOlIn4jywOINkwiF
zkfUKwAX/0iqLsUljCzgAwR6wKk3QndKgIEoADJUEEbX9VAE1wNC55Ptj1u0
cwIKLt7U7Z12DV5k8RV7Z0g0I+6kjRwuIVCk/DSpa4WqqoLwjfwhQbImk5oA
Y1KENfOeAEIDPs6sccE1t6KScFTIL5jVUsmHbGQa6HiJwS4utBeU8UPWFBDD
33J2CgktE0Vvm8B7H0601yopD4Ur4IVx+S+L1Y28gDAU0TpianlwgtbV9e4l
Ukwgxd2yMEqhhVHc7QqjgKoXOTwJSRHyGcQoHKNHrLHh3J0wdrvmDRS2monb
oZpJEVcz0aSA7dVMdCKpmonbUs2kB5hnC4Ow9suVQa7vuJwJ6U/99UxAHzAI
M1Mgzm998R8zgYPe0H3ddxu731PYxHV6H5lfmcomtMKbC5sUSWETt0thE9ak
TWUTt2tlE6pN4m5Z2aSI66L8M1U2cVLZpLhtZRMnlU2K21Y2cbbRkPyV1RrZ
Xa9KJl8GkW2NCim9rEpv5Nq4IMpOIDgLPGT+837JvVXw3bPnJ368L44fU7nG
nFeQUV7IWsAko2IfztZ4T8CfxNKEL6i4o4gBltz2fygvJJGb1DTuhp+Gp0dv
jj60G2LjtJxlmnwQprSaI++sLetJPYVXbGeBoq320xiOdDpnkAeIV76iVOjC
B9FB7tMwFtbnOfsNU9zDfIPg8Ldf0xL1rL+hgYsVVcVxg9AUVZCzcwLX2LJi
vwHNjJejWG4JaFamscJnE3lvtzoDU/EO9z9gsuZVJosQ5rJ8hzo1jPe6MXvv
AMD81+BkI99X63cwbPebbhdhJGKQKWkKaOuM34n0+IGaAZ2D4NsBpoMrTCvE
XcqZfdqNc6jn26oHoTS+g65V3+s6Q25eDgug481xKyi8cnoz6HnorhqiV1WM
rpLd+wrDpvYDAjG6ldDHgv4qUnGIK6m1O8x/xmxGM0EUzHIBuQgp/zWn/tqI
oYSBzTIPXCgm2+PZVUOFvRJU0dKxVcJeFOKNGLm/Gr8mTB+6CEz5JJoN4bsj
UiUzJQxN5XfY6VRamzaMexDyjykCHHMAWCOD5jJQY+KWFgLm3khvx+rgbZTb
BOjRK8GTTkZBM5fbioIkLUaI1nM+oRrChq+v4BflDVMiSKFTkYoaBOJXv/nG
zAZ7n8+tUWczgDbudczFMOxKcmSZs4uM82Akq3xB/wGJmMNihzXwF2q5hBtU
ynfL5iDKgDdetJDJA7iAMfpE50qW1UNxgnYTGFdgQ8QIKCqYS8nEL+fqUbiu
54rxDwbU8dEppvOCNmnP42VpEgg2SwzhdZKlJWhr38ElNdV3Jjgd2ZIljh21
Zkkie/sPn6MxRMSmESGLsbJ3itDwTjOWJvGs97ty2AfArDJgCJLpT0IBJWZX
YlDEUi8FrAeLwZlpjYJe66RF/osy66FCj/9wKDwHRcQyBt6k+Az4CwOML/Ql
yimlI081i+cVWcXKeYOpMsTunBuKLaJKJ8DUUb1qrmgis65j3hKGNoaKmpZ8
uujdhuYD2/1E7HzGi1eiXHbjKxBWYWx+9G0/RsUqSHAFE3iojDZzV9X+Zp2G
MNBIQatSaU5vZGuyBXQvevHQ4IXYbcALsDs1NMr/JQ+IV9Yr+l78ALanniPN
/HC9gDgmnfXAfCT5TxIUKJGvDYcycPRKixV5KX2wsIEBasrvB2byeraiCTO4
BNeuMUMJzsFUdxjLG5CHXuYQkgrNLfxsepU61EQ4nk6bYqKxQoh+mfCZCCsO
BwdwRoi5xVPM2sRZHapCRIdTaA4aMo5nmKIRsUU3UxsKk/LV1fxihao0/I0Y
X1awa1C2sqjmladGKQ4uy16kyw7hDQP+iJeNnbpsDdL7VwAqb1cFhwS550C3
ILo08JRVFZUad+wwhBMjRyLnfQ2uVzgekfmPg0GYFCRuXKwh11VmSD5P7FaI
s3AdV0AcBgSnRIi7n3OyzqRaQK1o8Hs4UkGIjAaGzFEjjO7I810xjSFc2hkd
AKTfHqQrnJhvtuKECf4EE70p9kAYkMLde9bZDxahdxhYwCxZe1mIzGMt27Ep
GESUfaw4DNsFFP6b1UAgNSA33VDpPSxTR2BBrlbjEZMkfUvrhAcWfTkroS4N
n7PxUDk0VHCpM9l8h2mO1yj+AorJxbKZrMdK1edP3LJZLIHmhAtOjVkt2cte
0MF78OLl6avjAY2mn8svd20PwjBoE5J3HfBMSpdD8xNCs3ptSUUV2eNBE+c5
oks3xAgPJRTIL1AszwTyWH27tGT/AeJrpjNcRGA8C/cP34p0JXqtHsxqKhel
RqA5aHTNy3HD04b6KyfHghCgg6D8dpSIRm723BEbkKt/BdoyvKTpcZh2aClp
0kMvnPWgbxRJMiLNM2qUJodI+03WEhqU+Dp5QGIatzgvyTiyQpbMPpoieH9i
k/c4C00MHhj1PWSSq+FEVXTr+e1Si3KM041KyGw2bJZD8AJ4o3XVXEEoAg+D
oWJirJ85/v2JbftYsHYVUkERbiz7gzip5mCo+9Zb8Ac39tKE3i0D844TAwVV
F0485dgHSjde7mgLaJ1qd1G/j+FE8J/1HH0zBM9eBd471c8gxRSvCVWpAs/g
MlHwQHCQHotp6bj8Lj1mdJAyJHnhkm9mAMLFmboGXhUcCKPfQEIsdHS8l8LW
jDQKAOQAwIM33MTRkuJyBzwBq62Lpp53HN6FqFOYHM5IMiGDhgDVnKxdSFEN
+fI0HxhyNLFjZy0MADDBclzVk6EyK6HSxBnA10xu1VzPYRxuCVfEnkiDXU0h
ZXlGSxApxHDi9mHxzg21KsmhgbqlanDEehkPG8cCVGnnilvegIdMivO4WVQ7
5kl2MiTtHQVCK46Wqq1x17mRpBbHQbR/mpzIaMck/AzBkcAoFiVQOL9RIEOM
TgylGAJvXbpoIYTDX8yUhlR/Gjsu0UBVUmCTTh5ZKH/owpw8YRtqc3p1Sb5M
V0o9b9dQxI0EASqSmbjdR5b3FHbeP1hVzSdRzquw0Erq62up/LWZ2yriqb0V
w5V98+5SOnessCnP7prUudw9q7NTbhN+smmVy9vldS5vl4a5vGUe5s51RLoL
158HZx/7gLRMeX237Mwd0zNvkZ95iwTNZTc3c/vsbcujjJ7bKZ3SvJHNqvzI
tMq44zzwu8+utKPYaXY28aRF4q22dQ2HQKlbCBMHsPca3Eq2VAlZR1o01dJ7
s7sTUCXgW4skvmEqjouNs83JdZzcLYrAgmLUUNJMXLlVMLzVzFJ6k61KSAUa
/KhjYohrkCdHKiJ43R9AZ5WwnHDcMaLCsT6OKUaKERcXFZk9cB3FKeQEQPIr
Ym2AeySsELcA4AmF/SfzTlgfi3MBi4E4bOq5KztBIbAV9gdZ1wFEHaDGCYyS
OyDVTLwiBAMjYx9iFesJkpln9tiOlWFdlP/VUxlWRh2NmTyNmFbJVWGp5ivv
M1L4ripAeZNS/24OfE+XVTlbXd5o5YYOOT16w9F3pXnAcbVgNNra9fJ9jfYc
Ziq2GjzxM+P/Vg0pU9F1kp04+UHym16fgjK8rCGtU8r1NEsn2ZDe/ve36HBR
VaTRh5OwbE06JEab+nMlyZCWIrTN8t2UMGrgvp8DVVCbU4JqqZ/wJt2J4Nfk
g7Ug6IN0ig8N/tUPBcFXGHwI88UCACvmwpurKK3AZq4ZnjQIZuHTkUDiEoNc
g6DbTbO6tMuu6tYQT2GD61ZU6Xjlip6Vw5do9fx3H2W/y/RwbWFp3rrdF3ha
DPKzR5ErQwBrJcXu4jC51hhmYUbAQN6tNLcgnoAQDSOVhgkthGSSHsZ5Uyk/
nR1EN6/TT8jj7IRwb1f5E9dfDsI3+EW2QY6+Ziph7J5u3nk6pJyvGrGzzPn3
nflye2ekFGBut9Jf+ANY35Y3nq1u69xXPZvZUJyiZyscD2II6n6SSXdVBATf
BEMwo+QDyf0uVxsEesiwIzwe3FMuQDyGGjxWvKe4Hhp0ck1iQn8H2gctDjfO
fkptvAiZc+Z+dEAzaQp97FOSz78KaG8hJL2+m0pWwRbMZiDlcJkdTKOg0m5y
MMNuTSBF9FDFELtz91IFkTXVzTkZOpAPIR2tjJi1iUghUc6KuZAw/SbDmin7
oaPxfaIUlZxCra/gsvTm7e8fapQsZSRI28e44wzqJUNSeidbIqEq+IfVu6o5
9rq0ZKIbyQaC/zJDJuoSP4MuNv9qWE+6s1N4QdOM61KYMoJwyCztQLlcbDsh
iZ/huSGVHyUCP8dxC5LJrXQ3+DlC0mJzhfXg2YsOvBla7j7XKYY5YcpqaJb9
IZ2cH/Gf6P3Ov8DbE3LR7bkkwKsczZC0HpfrOqA4PzME4JoakoBid5IA/FzM
E2DEu5G9CU3AIFcRDir2cAJ/NNmtKfzctWoVRUy4fHIfnc+ac5xmoXmJQM82
nbhTx+xNArHle1bpYwkC0U2fpZvu7vJZtbmPzynFzMwNmaOEc9K7Qz7929SR
M46gbYmLg54sY/FWqxAIucmjJNSfwiN5tbvB/7JFN7ahWN4S15eEuRB3hgtj
Q1hfIQcRpeqNvNYX2KcdG6UiCaeuKjNJBfo9gCn5lrUaU3DfoPMGEaGUsVLG
iLm6NRVa8QiTE18xVx2XRQiKs9eCMXG9FSFjCIndDlQRC2M9ZHhBrFqcEBdN
Q904tB6SmGPYW5G4h2+CRiHZBeUKwkrkxOGoVNRd1o4RKIahrD8UqW00FGZE
iCJcdxiKlfLuyuf2zxeW/cOHL4MSDZ3/LcOYefn8xwtofn0QJ9AWw+I1J88W
z2kDn8ppm1Mo85QGQBHN2HbdMZgZvXQnccxVW57RecuGMulPdQN4qsf8OP0r
DVFBklHUKm3bONK4mj7xIznzmoM+puVk+yI1mTEnUZruEztW74lfzEaxVu1v
Vr6n27uN4+4nAY22qWR4Z1LmA+WmyVZuBf+f5j2Y8nhahI7ETbkyFfiARF5p
wOK6ObGWCWoVbFhnhLPgA9mdBAl63p4A649rdyRp9MF4jZG7Q85mBQsLUGit
lg70vVtdVxWRoaUOq1zUBlNHTL0Mpz7qeJ7ZjddTx37hd46yjnr91v+pgL8J
mlVWKXd54zKZJWoPY2++WGzAZhSwy5R4zXMLiRE3c/8/fhDFup58ftHjsvNr
VS1XRGACKrC/byRW+V01B0ja8JhypJgrMpoDXjjgmQKXuFs1w6enklk8XMzK
eRWxWWBuJJf61P4Nff/clD5GY0cFnOF2NCeMyQ6gcKx2NPFtNTekjFDp6cWK
+UGjfdNZu1q9+NRj7eMhLZykhaF3DbwpLfB01asMJhfVQtVRmSEljJmwhxNG
9sNNBn5FCqxdzw2uUGs1upN/P/7he3/eMVxw9vb05OyV7xN6d3zz8NejF9+f
nPlhBCI9zIFN5cC4Cp8Wgl5FMXJPLOfiq5PXP3aW2JbOMterofIFAkEqsjkv
r/IGJt5TOJlUlxOzYmqjoCssc4+d52JZlAv2O/o3m3OqBzQw3LJ5VR71hKZZ
ibs+3fWm6Fb3frRme6+rG0MVE+N5VuoR2gUa+UTFlkVIEdxzYNYjwjKm2wDU
aTO/uWrAVIayHn6/Dyg/iRz2kKOK3h8at9C3tmBh0tQx+XM8ewXOHqqHyraD
IisjSvFRkGGCnkeXUTL+Fkno4q2CmymrchQm9UcHWBjN3t4asHBmPTNGKvu8
DXqblcKcjYrkQ1Rtil4wE7RoIHH5fUgklk7iHIxod5A6pLuC/inuQgk/0/I/
e/mjN+ceU8ogLVTyh7/u52SIt7orAIePyZ2ZzkjnPjaVXZEo8oA2E3x2yP2j
i4A8LaqkK6NNoqTzSEmj05GW535bAXHaNWD1x1SmBgk8V6G0Fn0I02TwW5xT
KpuXStaC2PeXBBjNUS2rZOdhXC5wEm9Y8zLdeihRwxjgdsat+P7Mryogatvi
T98UD+7/f19n9ggPXzXVYEuIdx8mjvyRK/VNQiykFRebxeh2tIyVlQ5+Aim+
jCv26vj05Pjs+9Nw56xMegX8flK3/sa8QW8tumer0cVoUNzzszuu/i+/5M9/
vLfPEeujt29+ODv92yneDG+en4agCuQ62SFGsRLiTAXUh7eqydWNtFqi7WFZ
LX3zvKZUIdCzaNPCHUNZPLEKaRTI1AjvyBxuHa1y8mKZDawloX9CLlWJDcHV
kRHgkeune0EMkovSJCpoBkLYSBARic2YaIVwX0PCGWC/OHdu08527kiUP9GK
4ESlIm4FcWFRreiE0UyoCq97sMmWrxp4QY+aRyCZpY1QK99orH8Iqwnpbk4U
hEaq6CVzRmqNZNOugLuihcQHcLlT+GbX0lgwwd++fQ5h/dwLmT/BW2y1OKjQ
xay4TK4wxUAuzBahz5TvikNKuGmS2WJeHgJ3DROi8CKomQ4wSgQb45SgaMpR
g06adsYeQ3WNYEKUrcU5J9zZQ0av4FxyWAQcTVYj5TRjTIgLxc/Ry+x3a0fR
FfIumhuTM5ZWznPzRgIm583kxmabqKkMaV3LGgJn8w+qEOZ6lbvhRuXO5ZU7
td6iohf+2EouqrNJN12pj6i9InLuun+Mc9eKtjrao1CigYTQZP+O3a8ZOQnM
Ax3GN5DRzSqi+eqobAo9iVW1X8Ohepi9UjU84KcwW3GsZ7T9CmjCy9zdzZnx
Hoq2y3cFkjXOIMkPaIOFmC3bIuprhOls/C7Y5WTsRy5Z4PnwhuBT9nwC5if7
oY+tih7Jk8CekO+mqtEb1Tw2MOx4wPQ0sQ9S5rfazgYzIglRkuPfb0T/6uXf
vr5/kF5+4DoGua8eZN/qRudxcuHt6D2O37oT9/Gy332ceDNzH0/8mZlHdnTk
Jm9mPbnL386Tm+ne5qH3+nKTjcNWFBENav1bc32QIE7IIk43unLZP4HnxNE+
piqnEawOuQf6AXBpP9meZhcvNylopwVSIDeJbtKD8QODPVKQQUE0ah6IV7oT
uG4EBi9xUJOlpl3nnM3s2kVpBEgtkEcAnVX1btSZ/01OXqjAy15dJ2pd5PYF
WCkZfq9P3rx9/UKoUfnCdWBVQx/h1li+A8zJEt+R4rW2UO3NYc+Ui++VHJnt
ejktpZAWFkKB3ZHenuRpMF5W3WZcNiKNEUim8nVJoXs0wCIbSR5xay/+V0T6
swpsSe0nZtfWiKHqDmcXl6xTD9qv7pJ1wclyK5esCy7Z9B7Y5JN11idbJD7Z
pB3jlHV5HWO7U9apU7bY4pTd7kTt3hJdJ2rDQgEWrLmoVpdCZG01fS9ejfpC
hnYI2aa6M7Z51byvAlxKfKupVnvYr/qZmjc5/yGWRsDeyrkN12S7CSKcmzNw
M7TpakIJ3LkY8m7aAHUwJsRoOQti3Tn+9kzEyfHR8+foOfBTfmCse9WDmIqd
vbfspeQyZSTzkRKFm+jsMFRxACkyT+rigC+MXcp+9okgf7pe4vxA7KgoxIUa
ZaxtlB/E50JDQ0hTPKuEdAHhGGmLMraYIEWIiGyHfb8Oc65KQpLPSH5xZQ/e
UOrZYCipfEzCVKhSdONw/svEnlwojDITRSMKJSZfj26IaCnVFg1+ZlJ4q9Jb
8yz30g0GrmRale6ClsRlRR6nRsBeM1IiQkBfWDFqJo9D4hQssjKczjCu1qdU
iGRlhFayzbkavN9OXAUPObIJiDSt53V7ybDujixHoiFSv/G+637fmfh0Vxgx
/14yI+wb8SODwvIBaBcj4CW3CEuGKyoZFSYNggPo8OWbQsuoA4sYqDz+RMff
7JaM4oJp5bydVkzbj18iZzvlUZhsIy6rl8dwS+7Q02WzWJCXihBz2JhmOKkm
dY0OBAKEeYOUwGCIVVQyu+ayPq+1CE6KxgZyLlI0x1UIJ3Vz1wAAvr6SIg1E
5ybzWar6KQmVmMJGs4CFhvARmzfIeVgrKDAXUneQ9R1DUPmMq6zKgfwpylsG
BwdD6XyonAYwxZ2IM89euguczjUlUuR12T7lxO8WR4IGXVBzJfO5LlOXpSW1
6fh4AVQJEZbMlr+EBAA4mI0jfPaOLk5E6HY0RnQTYm4JM7+ygs/Iy/T5MGPZ
WfdXutcsgBDqgBpil6rGW8uVY80b+67UbDxVeyyh/N/pFxQXwNgoxjPIVb5p
LtM1juscEBVbTr7qRDh1lwCPE+4grJYBulTdglQlv7nsnNK/EmoSzCDoqL71
GJABTlNMWeRJdm059e11Z3I35y5VFP3Vnbu/GVLWbgxacrzAB0QxHjYQPoGX
/0/Ek7MXtuFd+1oz5zHra/2VEajBHdrToaxO/Ju4GeOt/b/VM/jgoMiFutQ9
eORV8lMxLchbQXojuwVzwbAdfYOZVzMOQokRiv/vHDaO/LLP+9XbdOID63tu
Rx9g7vWsI/D8N/QE9nVyh6no9QnmtgxJuZaqjmU8gpH7JqdaQBlRf35n04jh
EFPCnEnX5ZqXO4VyB46uM+lbSPWJK8KXxZ6NxmulIdDxBtkDojKDU1v8yIRO
xIihZhmsfXRlWMaCaD4ar/iVxPln/YMUoEW1jOaV7ozIN2ScUVqZKzolRBxI
NRVShVLEh7xIQZQZ4jch3XSUX+zdvZDQ2BC5TjESCgXcwR5ZGRsS/sdrbHup
NwFtbvubx2f+/1AGrPEVuogj97qqFspf6L8kKQYy40Jl2Pod4MgAJCWTYKDi
mHoRPMeJkSY+KHFb+8doS3XsGGZolgJOvKGX8PIQ+Ex65naL39FZKOjufken
Nbtu4Xd0KRR0d7+ji6Gg2UOUdT66DCA0dT5mGgvaL7siE3ho5In0W5dckYFH
exJSx3b1MUaHLEFoBVCLPZ4MCrN+Z3SDUJncxNejdbaQmBbKkrVMBnRVlcS5
ey+SDZHMvZ4HgAkf6AxqEra9lKRAOh4Ul6bLhHBTGV2v7vWUWEciVL9PVooX
5OrqqGTiqaSyfRZfgobCgLLDQ0mKzoTplAYTEiYLa/bCNgPjtSjoUxez5hzS
qCHtegjbkuQCUnJsdIFmj6L4Qanscr8flHproyMMVi1NPj7+tekFsJKzqx1k
4QUczsFhzma0t4BqVxunCA9UcRK69iJ7Tug8xfdDwMKSNYLJX6Ht8Bwso9zw
Kh8TH2au95flxO4iQsuVq6ATj7Lu5PwFcBB9An3fapbQfSMlnSTsRXqrfKln
XvruCPQ4yjVB/fyxszhUUxUdoevFgVbXyHYTE9DnRO6REKkNQEtQh+mtV5B3
B8uKiIiGknStamFLYg1FLUgwda2ivHynZ2V9tQU0eTVph+Nl2V4iaLJnln87
Dxdj8VweipfzxWjq4TGASDCADQKrvgNoHuiiXUkErixHyyY5xL2eLGRXykwy
+I+7SnJej418X24P/FfoMTHV/Lho8rLipN3YgeH7sY93/YKpQ1rj4m3FaTqp
qDx2EtgHqh9xNS9Z9bqSnZF1Mrs+J/MgSnmfiMMZGhy5zfADxaNK7/jq2wg4
OOwOcIUadjLEVtzH7DkGT3GlfmbrRM44jvuounJcYz0HbptLzq0CPf1tXXK7
OMPSzUKFFqxLjDoAvwa5ArQvd+kI+zW8WLd3JuVP6f8Wj1LxorqGM/L+8ehh
cexvICgvFLxMbeo+EU/F55/im2N5w55JoJAg1r7imFj76I7FzaIIMXWEvHx1
5rUHy8aGjpFvigdfDuRZ6xUZn0PG/dD3SRwhmX4XfrehA+RNpP2VflUnSEjK
lQ2qn1ZVOCpn4/Mzvz2bxWPEXvBvgER2gSdogQwm6EFqwaNTzyX1yZvNXz35
8tEvv7DJuLxqnWQWzLMTZd/HSOqkGa9ZUUlcVn6yk87Fw+hOKvqmuhN7UCS/
INdasxifo1gmqRY7oaIvD/HLMu8bO3WvSwkcxsFTenfjALfYLsOgD2eHke/T
PXSiZY6G356dbqDzlWQAkZSDtv9srpVFVsxV/hooRFphK4/b2OqDrebrq8L3
ly5SGusZlSF5HHsofcvUJuSQnb58cfb66PgET9Zg42Onx6/ffusfe2j8kvG6
sB849AIGlHw9JTYfj5c5UvMOW/Y4R5bdobX2T6G6c7itj9kd/z9J22fTy4iB
3fam9H9Mibv///betTtuI8kW/Y5fgcs5vUTaVZRI0bItzUwfiqJsTet1SNru
ng8jgSyQRKtY4BSqSLFHnt9+Yu+IyAcKJal71v1y13WvtsliAUhkRkbGY8eO
Prt7/v3PUCT0uQ9Wrp3U1QTNbvI5WrPa4Sr9YM01ujYrT+LnnyMFH5q4PuX1
wHe+mkx9YAv31yVbcx24R+O/dthDRN2rX1nD0t3b3o02V/TgzEo+F6zXkYQ3
CYYw/6qKIQTzAjJHFcWsLryPBhp4ayGZGeS6VB4WM7LitKh/u1xRReYUQ2mN
QYUwY+Oiq+uK+Q/xODkGvb0OAfzDjwdfTN+pU07vhFgJrFtrcRqbNKrp8nWF
+h9sWHSj2NlLkh2HaaCjZ8RPeFEGGK8XBcMl8i5+gCorKVkd+28skzypkQzX
zjmgVBanHE7EykJ+bRA8nz0bQhfilF8TC9/y2g22RVJgEL9ZblLx4jsjDFBM
0xfP/7L1ZN1K0owgIbc+KJgUKVw5ochT0upy3rrlcV70BasLYDoNparLCzI6
fyf1Qb4cUDU9GazRNJMSiZpztvkqE3VGd04s5MkBhzp+Zz/u3djbQz8xuzb4
QgpBxctYqHi2elMyL64q65RrsLnW3qwhmGbh6EHGqdrhpvC54Qg16mBu91vU
9rplJYhKMHrqNFpc9mJGkMzqKMXLom/CvlNWd7taV9UYSwbrfbhtAsGrUmFz
nBFYjopiI3310A4cf3O7WcoVjB+v2aJi8qn0s8sIA5NK73DsbXoBNbmFZcz+
u/gnsS9hfd2eXY5IURiN5GMrt3+4/XB7B1KV7NktXBmJXqJayYv4tMEBt8pM
Y6EMorE3kTatB6gQD9nM2aGT2G9vh6FWdxQ7qim3cyxpU6ljbByUypAGw/m+
jyjJ9wnEc02tr3VcDjOqIzGn0VJCARe3lpvGrko0OOIbC8Q4dJ26u9nZ5byd
NX+LpMUAEc2ysLcHzDQsLjLRtJMY6+OdxriTvva8uphX15drKSLsFdN9FCNx
YGGht2X8ETwJrF04OahBEl1PtqgDNJbTfahvR4FUnq6xyaXBjRjQrc7rxd34
DPSB6PHpHfpUP8dHALG6vGaz41OFzHbXS3nfZRfvqlmDhHWxQlJfI0VWv4AL
32d75D2tBSfj3DTdMk72zLc6E/r18elygmT1t0Gcx3jPLQWrD71r0DP2CvZq
ZLAYTGIogteO8B4NYpJSigHyOAHT6hoHstz7dLkI8XrVPkaegPUw+HG4zs58
Z2VEhslUYSKvCepU38BUlDWLdC1lBojy+Ca8xt9kXJmJsUwlNVHWuyXYnawk
4LalIdS57vTG8gPpgABar8I02TEjJ2K5xv8iAuQxTgWYKmO2BwydAsJRsalg
QARuNMZls6EKyE6mVdtoUi9U11VuKjjLaVkmZy3pJqwBAG0EWRFj4widN5ky
tCvjGUFI/Ro4I2IYc7aTCCPVPiWmVGTTkFY8zqkG9QOXryYfcc5YPtd3JwkR
5G07tBx+cf9N7BOiM2GX2Q5kwkSutIfE0AsGiZ8umMi3i2Ambg8vF/3guF7x
0rI7my9P10yDCTw3r62GVgYQQxgMMGOnDd0iKruoQx3acsozb1FfzLFWmoQ1
IHV7jeVZziC6ZJrwp+ncR2F63SanYISLnloHPqXZ0BO3C0d5b2a1270NKRHC
MKnEYN/SGOSsE3vsdx7cANrfRrUN60qyeK+PCbb8edQ/TLdd2b6X01v1i0js
k2RQ/ZWwXuZa1m3WJfa3KoCOTWJqTcpS13VOVaxeUGckKYm3XHoDl1H4RqxT
Rvy6G2WXBlVHKozqDEiPN97DOMyYbjpDlMYODZrTCtaVjiCStKIPhuwJTekm
fuKQAaAHPx3QvJNsG8XlMHCCB4NbNDLNvttZDLg46ZMfOMZpXCpRULg1rkNn
iJqy3X2orWrrqp7ENj+qHlCbWV/cldpvXJ+Y8BZzXlOq+QFf89y43C9TLxPT
Kqp9opTRYmws1vgxpjc+YJOxaqLngRVJo9dQ9JS5hlfVx+ZqeVVsnlXv5Gef
6uZvYnjP6ot20VTG9HwgO+Hk8N3x4fHxizevNTHmlu3OD9sPH20/7Nu2SsVM
sdL+8q42CxNKxSyh6r9WwLuPZxiQIFuv0HPL+0+tuJzR1bWMHgU6QPkoKkEF
kAU2NIt/ksqXeqUFJzU3sO0Uz+yBNjgseud7XREcDMbxqzPvwusNRdmYgCyG
6S5l0ase6FmBDFyuLq9kSR0Z7WxiAl0Ejlyi6MVbpQRU3tIWn3knm2dmmhAZ
kfJFcqOibe9g8xjaP3IWFv+D3CEXqPpQa6K1u2yuA5sYXs+gAu7PrXLpjnrN
oUe97tBFq0AaJ1enrWONXQMVdl98vpC5BAIgjeRxb2/k6cgNGTr6YYUkim/r
AhAqeZc1js5iUSkastWt7KnwwqOJa5KfjDzEMXnvNk+kOxxLF+7S4O4hsVRE
rROH1w6N8HGeZz3Jb+r0/3k6UcQu9VlNWBuU6ybW35c82BUXtdC75UbY1hqr
hsCGtFtJIYNbGiZ3MGn7Na92GkJPKFynQgCl2aCWJrFdTNcFrXF6F8MVCJKt
SKNVypPcLg+yj2Lloh0nhfs9Qdclr+H96bm2Gr6RnaGJxEY9HQcJKGQA45Qj
/oLtQdq5DZ80ATqAtLPyG2gVRAHfIUP95ujEyL6TAQz0+eUxaUZJubi77pEJ
Et8RyqxC5GJdwaejbbQlPAvggp3jBXNyQzsw3VVM0DcBExYS5Pt/eflm/5mo
q+OTIbFA97TpcuIHF3FFEeBt+tzANacue/IX9WMDsgXgyXZ5cbnaAnDRFsmL
q63VxpOrmnYtprMVF1o5hNOJKYYnJu4C9VSBg2m8drVeOZ+1HeIsrpo25fLY
1qS6qi5CpzGFaammH5pE4rP2g80aTaSOJqEnpBenU8+UyxDH/FqH6sk5aCzq
ahGV2ooOJYBo3rCR1KA1GQuDq4ynbzUgH6QHJ2ixIifBsjGJcMLH5WwO7U1Y
h7jCRbCxEwPM99DWOtilbemu+FyagiAIxBaXNMUBFhP5C+iHE4UVn1qFKju5
wBicEcDC45B5nu5Opv5KsVcGShbBc2CVGW/2DPQjrecLgmjPDXyx862qKbwo
eUhblsAZM+SZAThCZ76IiVR55RjOZVVhiZNuWseP54YHMDptAw09PZXhWJwi
XGWOj/P2hS9l1Nb+qcYyk++nN2VgonBIg3VSGa2dB2zipLuoIVpvvPUmZ8l8
CXR0src+n9YfG3Kx4M1udj165BwCk4bpiWJl6PrWQWJ4wPLv1eLSXWAfZpEv
VyZqjEsMjZ1Qn7C2H5Vr3Mz8rtzZ/n57h0/d3d5djWVjYm3CPzOIrxoAvmiz
WNgssiMWxItCpU9ZtHPRQLKjbpqzehSZNJjg6Zxue5D1nBLPzdkEVpzIb5pw
QurzipTQga0Shk8iTy1l7XuTLiR+n+jH2vuEG4d0af52ThJfUPH3hx4LiPVu
Kfw4qDO9X2H3G3Ypjcw05qz8jmGvoHMxonDFCp1rckK6hwBu10C4a83fksnA
MC+MKSee/UnbOzfYjc93gGEYyecVeuHYitheywhqAy0So+wQacCl9g9e+iO7
bLFGpR2vd2XoJthn5FCkahEDVqwLdlKHgZeIZ0eYwISXx7rcWDgmdp5F0Uo3
SkkV4nyNmL3nh1m/GwePiYmHDiq+cUwatHbMuqYWKnlZDyP/5sAL/Gak2HGP
yGnVaqOWBFGXldcxSo7+gJCLeae4c4hJSitMsy8QNPMR+HZqK9tJA5fljbi0
XGlbC1ZVFMP+y6jsmqsGTEOaTrOlvNnTnTeRk/XCWHoHT8+UizvrKqCydtGE
ah4zYC37fVtF/qX1u623yewcyQnNku1F/9SdE13TOL7Oh1u0p9rQU/uhLhKq
RfsL7wqW9Qt6aVVWzyy/Fy5gTRBtNzjxzIula2IRSgWF+gNSPszneqyNrOAm
qrpsJ6rPPZ0avEJHFGa6kJlmuP++Bv/jlWGr967gkjBBEL87KtC227VN/Cow
062mvzmuhNYgZjI4tiLOOMt09LwOLzSsutfVAM3Uipcd67YSwtK4L3MaIvRO
tROkQVkGNF3MmqwSobyLwVdStgvorZGeg4lqT+OoDGZje/aAApRrFJoSwuFi
jZ0sUj3TWhJ3Lbn1V85IZbHWN2s6V4uZblt6E+Jc92yS7h8yUVieRxd+K1Nx
2lk5kOH11I+RnoXh3Ot6C9OlqmzVDlelS/CQQaBane26DDfMJHguiuglN0ug
ZiXBlPy/SAuDqA/0cFXZnRndIDlk2vNzjVxZHUwnHvm0gNtOQjm5yaLSScrv
WaeqUfU51Kbx6MlERoI7kxY0pGs0u4WE4rw5XTKeEmaYSHB5gTCFjCjPm5C1
VeDIrOT8IFXprWyODv/PLwzfmO5jSF321awuQh6UHSKTgwZS1jub7+ucov7y
zg8ihq2CQGYnZeepk3iE+L5KOgnIIcaTr+hpXZcAAKlCUVfU6F1APCvxVVcg
0cWwSNLczwfCCg+3bQLFsp6RHSdCM9JFshdQnU4ZQCXnuRInlAfWxFT2sqfV
jlHOZChct7RDg9Uxi50MQe4faliwC3TZeftKT+RoyBAjL9wf3n/GfNYs9jSS
SWOgozKxsDQ9keHMCBa+yVj9JSrKFTXS7LI3zqfNNW0D/95VPWmqkSz/AjlN
5U+RZe3a88UtfITT5UXo91MbQF9LeGTje2fMS8QGCu3/g5DFjE7UEqOMoAxx
zZsae9pSNoF9plhtFTvcuXYoquAow/MEMHcvsqbB7V3Xj7YY7jP7uCieNgsw
jV2Pz6YV5Nev6MrNg6ODh7ujkv85GJXPpzUK6ed7W4xTPWPyNl0mmXQLYydr
RV/psrlgsxKQERujnczns5Yho/66iyqYwCcD2c3tZYvziwAJ7CZLDHpPW4oT
VAUaZ1TWYM7ffuSp9CLkcJO387DY2fzuetESgSOnmZ/xceKQpvN4m0azgNiR
pSHJPKIJy1NRfCSCbbT8MG3lovJi/aLqjwzldeEFm+iF3Tq3J9s2sfjkIB3a
WPRmPbuAO5ss0fHP++Pd7x6NSvzw3Y6s1tOX+386fLhuifoLczb4CC0MFb3E
7SSjaTr2ldU90GlMUfbt4V8OyZdwGXe81mm2swtEibLFSt5zpB0FajRLURJJ
b+dxJTKu++aLMuECUUUQzLA8YIAat2HyA9yvsM5CUXZs2myxYIbsFs1CbxKq
vCbNBdalRAxs4WCfxJXHGRZ0lyZYk2UOUfyq/FDf6US92j8gj0ZzMdPIFIAE
YpBZ15HYr+Tdn46efveCRQny4RhAjfHJy2Ndw6sl2hn3hsLIvW4cdjnWTxUZ
yweCPbGaNefySlveCNnxuqHs+RQpPZlzy1m6ko+94zxEy0izxyRUfKK2phRy
TAq34uz1xqutkLMdZCjYq+rO+jJjW6T6fLEChgv2NPtFhwM3hOdiAauiSrGH
cwVAfQ/8iBKc6IMi0EQxIYs2JBHDnDAS4utdaaxPXxs7+efDgz8d//Lq3f7L
n9hbntvzdRsCbqY344N4X6/3jS+oCCDwSNJGm8Xx2tLGO2ymkqJlzUfPD37c
/eHH339fla2t5H37tyL6koaexkZj2/SE/ia4v0f7L55FWFW4yRYpYsS+HtCU
DMbRw7E1qbx6e4og+10o/qtBL9KOqRpsTWP/a2gWO2Rs5i3xz7TIBJLMzMuz
pJFdhHUnV/V3sWmNrsjTOjCtXAryQyQo6FH55sgS2D0BYEa+nf11OTuL2jhb
Mce7TlECjNWJS2aOWc1SxsY5d8Jr3esK0q4xyePB5GouWgxvuCQH7P6s12Yp
BpbMAtrovf4G0kKaYCiSKLzTXuhuHXkGHFa+QrvqWedBuzRjFKnWs22U2s+n
dzkdbmEKZsLzo1rzBoqQuARPLB03UMgUjlwCHGzs3bL0/pb9NOpVag2eH9GQ
oLFfEBqtsqoXhlb0Dl3o1A50WnCDJ0FCi945QXNA+TV+ISY39JLiaEhy22u9
vHJ7VQXgHKILFTBT9Tgsvi5duMIC7g8V19gRuAcHUN7Jp63CcV+dXfa3tc+S
TtxSe5ESYc8oyQy5J+voZmqb98MXRTi6XisLsSQ/4uLndB5vdnqRW86OBx/W
5TCamegLw195kYY6XJG6Xr0o5AC2k7lO2oCh7esXjtGFo8J70w+NwiBH+1hD
SjQwBgSSp6HMa2+mmGGxuRJnxWbpgNwuyYXxGCVFLH0/kv5GkGi6TGn8WXVh
aCSm3rAKrTucHFOQX2Ddo9gQxxtkLdmG93TDB83+mEKUHFKxA+DUDFwOMR5N
1WlrOT9avRqdFRPkbsVcMW9CLYZImy/L+XyNXMT2e9qy3pGSs7RbLtIb6VKN
T5eL8RWavBG5Dr/bA6GrNg8bysRzt3dmq5FT+aD7f1Y4ph2kyllivmTK2rui
2+I6ytCZ9ZxqOGACTdvehTSjwZ57guUePo5J8i/j9HzJ6oRDgvOL4reU0mcI
CLZpRTGTHpuDVs5gJyYcQXUXOvIYNGRON0F1Ge/HxJhxOCfBI8u590PSxPWC
H6kSmZlN2lscNKohckRKAXtR91poLxmiT4bsVXxQgrALGBSXcK/jQxDGmLQR
csrwCZ1H32RYDBV49J0vVVjZB9RQyhqCEsnYED5CkgJgIgYWR0WCJYmIlgyl
VH/0mWMM7RSWa5KlHeAKTqnfKQZp04wg5Z1b8xo3Skioy+u2mWnuzCx7Bp7g
eXXtVJElSwDL0HjYJO+QQakDpNZeIBVxpXd61nRn0xaTp1EkRNtSvEaA/gRh
E39zc+fBgx9/1FZ2ffwHwEH7J29evTjQr/2wpXDoO5GW+FiZpeWi0EUxXKIl
S+UYpbw9bRVPr1EDDRQ5kXoAzGHteEHnZXtJxJjWgtbIyL66iX0rg3S7IWTO
ngcNoimAwzOy0wW9Rn/UtEiSHspscehEB6qlb06fG4eIiPp4XBhU1IsLbHsY
cwn/dHB0gMoUfWYAfI7HHE4Rcz0a2cVimkI2XdQRwYYtaV0u+RdvQKHblHam
RoT6G8yI7vWimlFDLp6qcD0dZJkmQY5iQFwL+HiDfnvMgue1ZUCtXieJReti
uUcfIpZFLyGLDbCchZV1UUipejQILNIdCDQT6batcRIczpf0ugLSRsOuMP+L
InP6Ez/OZdIxC+bEwCuEivF27Gnm2P2moQq45Ospmi35moyaB0U2IPUZloEB
LrNItP4vyxkV3iM93TBJxDjsAKMXomWVhdCLoKee0IALaAj5+3lj9/TKgXgC
e+A0HN7FaWoxWLd0ja1aQkwP54E+ziutJraLY2sZb63XTQLD+gZXzGSU0QKr
wmk0fIt1Etv0xevnbxKDIxWprplqlUqggTLGNcsoQ6QSA5cHSHiujA/ZKCjb
hE8lToCK6R1Lz5ObOHvLjgicbDsK2xpRqXqZr6xth5zuWeOOiJ7wghN1mbKb
A3rlnpCG3XG0PU3sX7t3md1b831R5LJsnmsV8QkJLFyD80vmnYRn3rJmNfM6
8qrwZNZU7LRvQ06aGlBWrMDfjNeIa6YozOVcbb4bWe2LuhDbEJICk8AoBcKC
bHnqDIHmug/AKjwoMzhk78IYoIY249qyK18rs6TcCh0AScXktHoLBWGNlopH
rGTgmjDjmm7u2iKV3WstUljONBnqjjYkgqBKQ4spDp6YTS2k0AE3mpI2OLuY
vSolB/pWRfokx9E9zBdjK5N8qB74D6iyQAajIXAOVYJcXEUUNAsj8Awvm2FM
PgeUylEsA/LIjAnNqzZn4dVh8NXX9SceWntPBuJWhfdViGZmJpbLztKLUPyp
h2YB4GJIbssgt8YqiFqgea5MDfNX7G3/mAD9ZMp3STRxEhFEZ11ASbAd0qRl
FEjTOEV205wuKsYegvwmZZbwXWGvhjN6iOaYuPQO0bAcoqw7mDRmt7CV1bFA
IWae//dgRohHLsn1PbWuWmSmIw4GdwFhW6eMz9mQDGvnAFxiY1gMUOx3GnOT
24ySRLLC3dfPjCaxMXt2fspEsHZSbRtFSCbbZLHSSWxQrcuE/9ze1pS78yXz
Gsl4nNXuNIGGOZd5upPoQ9h4Rt4lSZQcQewLxWvl47t5CAgHipF0kNVd55v/
xLoQhs3/G9+A/ZXyMNtnVVymrgpSJ1S0fbmbTd19TjW6ROcbH9EhP8xWoMJy
Jw+VapO7twep3bS9sviRzDIYHISi092ujOdB93Ocu8Lie/12jRqosIb38raQ
/hGwiH+q56ekYv31u/KnWra1nLF9Q6Pcj4qifDtHfFzRBRpU2pTnjvffvjA1
u7ezK2oWs7q0tk6cVb9nMIf4kkPwJxWsgpv68/OIa3vz6FC4FXZUM9KXBCaG
dhE9TITStBuviEEiMvLW0QpjKTTwENd3gisa7tk5Koc7AoyKz/ZwD7zxQOSD
ANhoSnugWavXTC2wdVwZq6jBKHBXYeG7SOhs90ZyR3kFxFMxgtIEjt0354IN
Nxa3wYAXa9u9aXdMcSUqLf1BPOV2pgUdxh1IhUAprJLUS5Bn3CDZF4UvfeA8
BQ8nRmaJn+A29hyfYmn5h2gBADYWCFl7VyYotcIu8ujfQI+/bY9l55mCYu28
DJeAiDUj5zPCmVko4b6CTO2xOeNEYLbSwISZQPHyHNOlBXQpJYpM7WpfNmOb
Sopkcye8TbHP97xL5eJuZD5HmvlBGR4xXdorK1yz+oZnWnEktl+LxosMlibt
PJg2sKMjzDC9tJxJWo3TTo9W1hzCEMfpowmek2HMX8vaqzSonkV88+C9eVEp
Cz7dxa56F79UrbYQV3znmt6/LkSGKvBTflNOaU2U5UpelTWzWZ5MVpUN4coG
YtkC3AycoCJAbHWiaeT0HNlAxL3+30eH+y9fbWw9MX6a4P5jccW7J+xh8AmI
79/BZZKV2Q6T3ZPQkKFM3pHRqY9cb5jNg2woWSpyYO9xVLlwUJMwP9uPgqTd
Koh0sVBxfKUk/rFg1I7YCwz6XtdbIR992tgknx+VL5UiD3okrFe9VixoXxuC
fFaajCvzgNcKURd3Gk5q22plGWW5RwG2SbVXlSCTs/5l5TWyypYdu6aViLwF
bsqXk/c1DIujn+VPH7a81FEuw0HfLNJUmGp7Cl6ci1snUSaIjN35gqissBsD
jERXyIUmbIEP9Z1MlqI/oiVBpysIXNyuDgpk61C0AiTgJPYuhbSEW2eps/wQ
If8Kxq/Z59ba7Zp9lSkIK32uq6mC1halc5YnSFHfYz3BDUqvLGOiQN+YjCqz
6V2s24NAYXrSLiZOLtFXdJupTWsXjFR/DDBd2RdVNwUiWW0CrGmSjwThnA/O
HRrIam050T+agWSnnACMD7ClkCTMztkBzGVWRsVOR+klfYx7P7avZnYee1qd
pJt2yd7qIOmoFuVKvdMBsNDtVdOtxHd8lHSZ2FsnQNzoWGoPALG4TpvFvMr6
qDS1EqQPFazFs6aanYnxEnSIYfMvYF6NYmAmWjUBepD0ZmcHBsAH1XhzE2xf
wQnHmmJWw+tVIxLhpaXxtSerJAEgHEre1iQnCPNQDURoPJEfkeemZDZznTWK
u2tLedqaeQ/GQI/P5gnZW83T882rKUoJ7lTlfFDqr6FxcSZDi5OU1isNupeX
IIfiEsAXe5YA3mrF8jch449BPQ4AnLKaXKHbLyhkCObJarNWKbtGIeSRoyT6
WLLNJAmx9Rn8RMIL2NMCa/j8ogqgcafA31mzMCGUs+aqmiJHny/iTTtdMhSS
Cs2KwFCJDPwV/BpdKYZKowcrE2K66MZB5ejDapYBWcvNbskKJ8zorRyKtSnt
RQ7boy/A8S/GvI8sGiBjlmHiFSt5gi0tclBMDmtn4j4+ixDU1iH2BNF/Gc0U
CKECtMGyRknxQhhLxJ+M/AhNQY6OOLC1XFcj8PuWkZf29o75+EQMQl6v6xQS
QXwSD1gyFShMCbMh6tbSgDyG8MdsVygolBvDKqeT2daFHCl23xJD4wQ2WE+S
19/swyQNMRSF8/ryriMFWwtn7II/Nl07DY5LnjwrLIJAY0bVZlKha9qMwvrL
0DntKMGAA6x4IzX0kgbZ5Hv4KPOhOMsc/XwvmMO5k+HRQM8w5xZ34oFQXHHf
mEPInZvY2zcxH3HV+pcKRj9J6JDT27y9tL4ZK7Y/7f6t+PbJq1Nm4puzGQmq
3vygcPA4C+JkR0YYcSca9qweV5MJGvmVp40Vp+ZvJ5OHwZkSs6dh8zwxB9Ar
xisApyfhvTLtmQh5coqi53BNb0nEptdqRfXXQGP1cri/5YBFV3qnyL4niTXs
VrrIULXEWFTS8l0TdtnwytBPJvUbkpYya9tYspZfgcJrG957wi7td++rZq2x
HUQzWdvuPlF7ob/OXnmwfxzLb+LnONROvRNirVb4vJNjCgAnpSPRzcsodRx6
LE4MT+rcFgi8WJU29LYDEjbeKD34yQ7rnYOAdk6aBYEr3I7f4VZBDhEkTiq2
mGeplS4oEX4r7el7J2fvrF4xt7iL9Du5SevtxWTY/DURv/75r+eaWahOLaAF
GcPmqiPyeveJps8VDohwBgFm2dDoCSjG2DoTGV+smBomqohyy4oeu+MpUIma
q95oBHke1lJkA87ZKdBEnVdG8J3o2q5gvntm1dJ70gybVox9QcyN1uYMubZz
9UsCWfgazgWRwTw+zRDD14WorYKa29EMEFuLLmvi0wvE6CH19U02o5j3A1ek
GtaXOJ9WF6w3irXUvbKcQbeOqlYVvujvy2rJolKNqSUdV8/FYzfViwCJMk8O
dJg9s2Shu1tUaEuN4MjCzJZXpzVbneRGq8k1qdh0EMF0zA6cdEhXosTnThAZ
HNpg8fDISnGuwZ0LZNqhWWMwr3gMPM43WwRJKDJmVt/qApr6NU7nig2vqusc
2hYjZfv9Q0jDD/oWlAyitqC0jW+EUKvkECFfGmQM4MB8/pxFcoSD/Czp3zTQ
d8IY/s9ZVgeMdZ+rOxhtXG+EbFIDnrYIkQe9eweSVL7jQC88RvlCI93eU9WS
uig3ZVJ4uMX0QK7l1GbLOmOljJ/9HWKQVF3F1a29dmfz8T0y87yBX+ltWYf6
DPr8M1633Xe4Bm5ItXPpyeKwgfzmsfwvJXoY8JAhjl7vwW7BaY1PwA5SM9Bv
OPu8CJjyd5qo4V2ZFEQhut1d2xHDVpVY8f7tMUZmW1bCfJyGFOWFAi/3M7Oe
2dR00BeqyhnfRdsMhUJauR6mzhN4fXEFWqDHspmwv2kEQstDnB8ug6WkSZUu
AYKnjJlc+Aiml4PudHlxcZc/1WhL5laVYMYK6ZqYedKKgdj+zRDaC+MzHiTm
C1HZQIJnr5BG8rVoukjkNvjBQyUSV6MehjDIZBFfMYt4VspAbSiAUyuv7raS
CtAirxdbLdfuQy1WYgPbAxVl7osBs3sD/xxL5MgOH0esxiQKVtndXuy/3u8x
u5X/9U9yg2p8ln36e1EkRFypQYUHbzD09VLDaCfEehxxmud3G09Sbg/iUvRU
jGQHc/tq6VCkUwKItFRVDhcM0gJwkTdN4UddRh1SJrd/bNFU2BuHf373/MXL
w+N3v+4q3xhJAL1zCLEp2muy/JS+RPkaoQr+86n8laynn9gAxz76WezyT+Wr
ZiaC/qsCybryk9xkPB7zVkMDkM8ffHzE6+VWJ0+f7TzAV/nBTpn984mdm/oj
9ZZN6UD3OVtUehu9lVIWx95yKS2RUlBQvbzRWBaXrghL51HPlUnHlM/j1c4C
hDD20cH+3ruTv7w9fPdq//hP754/37WeP+9evVAqpc98Y//P6frEJ8TlGR6z
r9TQMskqrSwSJzes0+eH/KncfVD21utltlqfvnCT/T/jJjtfuokvdvLavtZr
3rq37PlamVVlzObc6FlmgIsItgwN8BQbuYH+zYaa2Hq6eRrg8KOGLOALBCed
PmYqcylr93fbD0OZmbN8KYOw7Ob3Dz4+eLDzAP+8H5F4xrkDQjqBs/mWJIda
jIRLHnyPS7aeFHwt2pCcioxw1Vq1a6yQTV5rDWc2gZKjMuyVqAzgmHxgQHqj
Ydqqy3J4tH/8y9Hhu2fHv/9eWPWTEwwRoKYlCnWyDHKuLK8nDr+KNRxVWDyV
7OeY7ahxev+4ZJdBisKPNd/3bPi6oVtFyf/cC5bUVL48ubr6mukZBchhKty1
CNBFM3kH2Qri7TfSOfisVAdNps7NvVAMiIpS3+DlbqrGi17LVW4d13H3gnDa
GcTFrMqHu2PsDQpEoXsgWIW1YWSMw/aUhWytZ++NsIfxb8ev5DTEUcWN9eOx
3ikqOYJJP5Vvl3OYE/LT/nTqYaO3So9IpWPLyC3xYFVkjpRjdVJuLsWDaFga
IWPd4pV6B166M8Z/nj9PLj22MGaHMhXZdp/KF4cnz+WON42oDb9UZAOXPs8u
PfyIAjgiZaf+66J3JYRKrvw+v/JXmTpRNJsIVmGQz5u52FsHaG2iPx7r69hN
ftCbyD0Ok5u8FX9Kdtt9JccUa1EW9RMYF2yJdRZDTtvu9TwdyeoE9ifsQXg0
/8nn+vqaJQSyhlvpH6BDDRUbRCnujFwUws4YEF1VBNYoddMElSK6tWEIRB3C
ziPo90CLmoq0qfXN+DauwIr4Vlvm5K+OX9HOho1uWb+873RmcwWGtacGQhCn
5j3Ih97pC9KI2XsfVa0GlfUZNM7dCyN0j3l33mQ5M0ywDCXbT8Xm54jCEWfW
GbNdorSs+kqahiqy3TE+b9D9XGPe9TR0h1O6Go0vn7k6JxOxjkVTPNmm0el9
YLtLmXkO06F3UV9gdk/noMvBR+S0jXxJJ5d1D6WubfCUIJxZPyslvYIviZq/
s8qLl5j+KpLSU8I4EsRd8sBpH+feeYN6f80xxj3uj9Hi+WFqYLVHfSFTkymF
zUx1DM6LRosmcG7ba213Jn40hKYyFrj9mWI5Z/Vi/GxendOx7L1lFdRmr6JA
J9ELbHUaC+NJFz8JOQ2dpfw1y4Wyw/XfVXVcEd42V2Sbmb4bfF1L3pJRiu0x
8oG2rKZTl91O++3iRX9waUe/6qoFL+tQVSWQd+AhEGM9J8vPnpmfiwNCZ8B8
eMMIcvfHW62OOJ20qNqLVLXL3A3p781M2Q/OoBcuGA165SG5Gy7FPZmas9Yw
7YUcBjQcs5dLCMq3DSacTi5XSIMg/VmNaVfO/ZOcdkv2GcumA61WV3iIJoe9
YpxGLOYMqAz0x3K1CBEnSDONG53eRcB7CA7bGvrWNe8bJmYu+VCv7fyi8uaG
yLVG5jMtUy7eP3/+6+67w9emZPcPXh2+e/7mzdP9o/dbKwhBPHI5U6a0IlH1
mGSeHQoLnJHO/qy9kCeTMSZtOqR1XV+j/99/7gB4v7VtRmQ4dZX1x9JlhmTw
OpvuCjV1WYiiXlHs1mIHlHCBjVsRjErpxaIDj5Vp0fmtAietbnlVsbQmP9sr
NZrmc583N71+FsZJ3+NJ2XHwFVsaL/CX4u3+8fHJz0dvfvnpZ7c+ETwOOv1a
nBE7/wNknClGkblXL0AYgPL7gQuVULCeOGqnVAy0X+tcitlOXTV/8whM2NjR
s//68Iv5N24Z5zKbTkNm5+1EtyqPyOymTlPvbq/e/NvhCRpW/eX45PDV/smL
A7vL7v/kbq/RXS/e8VP58B+529Hxu1/3Xz87PHr1Rv6dvOnePzQ2F4G+ffzd
V9ytZ99mMayv8N564tBzDjP60v0QRHXvLsQyHZUUCbq+5FmuG1uRju0zj95w
uzPEOYsY5yR88LIeiP/uFUOcoAlEPHzep49M2qsjBcGN+Y8wgxpk9nMOsXoP
JLGNB2hhvP0yp8eZMXDkrpaGiHZ2H/3+u9IKPquVAFE0hXmJc1pQnTeoUlJk
UctaUJHYudS95N9ERvpGDLaBuknzvsuU6fFr7WAiU/KD/gkHodEp9FubKiun
M8F173Ry1H9wEqr86ZvBLknSEHYfuGzhm+zay1j+KZM8/EaI7YcoXleDk3RR
T++2dHQJeWfTfQg5ixBOS02ejiBt5uZ19hFIm9Rn7B2VxQpnySsw0c/s/3Jx
jd7ccmSjy61yZ1ZOSaYW7Sw8WSE78eGQsxfqdfUGBYMn9Osp7KAY2MC/63HR
OyDCMihV26fygOy2enKkR8NqGsWU2QP+X/41Q8otCwcENbdyA1LlhtOEevZT
TL187Q0O/AD5B27w/OXhiXxwtMczQ/6/+3fe4Pjn/d3vHvkxYTfI81VfvMF3
O7t+MnwqH+39nTdQBlu9waOvGUE4W1bFw48Yl7H1qlrFDqfJqkhsqiw92Aos
NuZEzdqix+AZkonGHLWMBIEJnECZ0Yqv5+8cIOws1hN2OtUmIQLFF7C5fXpS
lWF75Z0tB5DIx2P5PJ4bsbEHI+UvTn4Z/7q3m8T9f9jekf892t7VKhAifuUu
yh8i1xzCbxG/HRcfHh7+8GB3/DC5/OH27vaPo/Lt6580q7D74Af8eX82qz+W
hk7627Q51QNl58fvHmj44aCdIcZfF5Gn2cvvgd/IVH3PhYNnW1QXJNKYEUsQ
zoJF/bi8QJ1zBSi6HHJ3s/ZKJIrJi72DnZ1nT79/L05SaDM0vXPexnM7kEHD
hK8fPnv6ww8Pdx+833pSNpnuU1pMmfb3Mfz2/gkAjPKgP785GvxrM7tmk0B7
zBPXyPGT4gxiVDvhZWWkZ4qqdnrmZpaTqKN+bF5sztpwwM01bi0u03nz0dml
9sa4afneFe57741beCoafptooAuwtjaOulY2iwSkod4eGoKBAGZIJ+IoRbJK
Ow7I+XlWGzU5ckh4F5C4j5G9n3LBJrECFVDb+aw8ePvLoLQfuLjv9sXdmQ6K
g0pOtYuZGDfJ4pe9PSBy+PD73QdRiIudXWtk5X0PxUPX0skfHyXfKx9t75Wb
xwcnbw1ZzrSdweOPjw/3ZBPdL/ePXt38IP89enF8MP7Vhngw8OrKuKGQDgvM
+q5I2MsfF0MCDenaOXx28Oj53s6QQBe5QOPrP+w+f/Tw6fc/rBfoYkCgy88K
dPE5gS4/I9DFZwV6ndQW3tH5S1LbE5943JoEPQwS9O/PjyNlfmFGG+7rvkYs
9nwjCglfB58K7DUlbOvFev/rv9CGSL42Dg8lRcrgyqpSIOVJi4ofjXIDpAKQ
t3LBTpuFnI3+gmrZF7esS95c1Q+M+rH6MDRFlnvs6RI8WYmG6fFoSI5wKKK9
u18+bs/He0WosLmujF3pb6JxfWFnCaqSQLpqgqpWn8zU7tUgCKqkHu3RR5Hd
sJRnQby78v3++1Hx/un7Ufn+AP969j5LycLoxpuX728b+UtXvN8vv/0XGc+T
8il+2H9SHuC/T5+Uz/Dfg/c6VnvUcqYwleJW7JOxNkJ+ErItPf3oXKqybAiN
qtckz/v0SZ4l/zrAv57ZA+gBJW+C4BgyFH9TszgRUD7GZfwNQ4JB+voHXbEZ
8+N87dtmApa2+KnedCaSMwIAbaY16boRt4Ycj/7GMDPSdsWeEjMM2ImFfeO7
rbCNraeBNVJlWwNy+Ce82n3j4/mLt8fjnR8ejPeQcdYgrSoNToueYJ2sBrP1
YpHGDjZTB9OuHmEcDZ5sL+7bNU514L+nWk9HEU6Ah3IAbAKZPoaMcDv7rJ8j
5D3SNeYHcXGTlVWb5msO8GJA3/WWxWxrm/RHQVnZ5/k092dZvzQ+fnt4AEiR
lV95pYuJus+VWQ2bdmerOpf5qkB2hAMZFWXaC4HPHRX665hYWKMj0Up3fvPP
b577oiKxyBi8LSym6NBaB4/tO/rckT3Af/M6i95z2PQvOrpdEOxE5raLr1uF
gVPnSbG6/10zcMrXyVeRyVc+/2467G7vEdQZQ0LGRuousK3EAIFoCoLMHWav
8ZaPo89vR4Bc9lc1ALjRPOr+4vWv+y8tbLRBd3sDcYjl1SxpuDvkwGuHo0BS
Wk0NcTlJSqyzNiosZotCqvmALsVDf87Z+aey/POzI0SdPCvqsZuvQZH0woWB
FE5hUUhEyvifAQ96VFvhg4rYpjx0Sz2Zve8ePJLXnqyOYA3ZuWkouUORXsRK
uNMaR+IqtxezX6EpoBYhAyHAo6CInbyqiQLkZZuBEMd6MfMPdyjjgRPbaPfP
q5AN5EVggD/nCd+PoBq93WU9FROZw41oKnuOvL/ylSLWqnXoaJo0q8e4O6N4
WKW/Y46K4r//+7/1ocU//T/3T5vZfdHc4sxdl/f+o/zm/v3798r/9U35qYQx
dK/7o35W/vGP9/qf/S/5DDdjYCEZswcT7Nft7lKRFtCE3cg6dBq5ub+2toLT
BTJ6RDLFTsr0NoXqpWwau4FLoJC3Fx8XGwkJVrIaclDrzOvDq25l2sfGvcKd
EOdLVFAcTfnPpT+n/FdO9zv6XLvvEOvY/jg0NX7fgFixX42krT9jdVmzBbiv
aZwtBhxZYTCV90Ks8nRagadZAYjIF5KxRbvTX0+XatUaSiM1bzdkJTfkLXti
1CUcniuXsVjYt1TE8hUplg+929tFQveNByDB68pgaDcmfcCY+ihCoYe2QN4t
Z+fdnk2wrrkXlyHosanxC9HI9fS8PF02U95L1cl3j0CWuBXICWbWZIplZ3Jb
S7hZRnbiKIO9kfIeAq9+ft7VC/lAjwr5QQzHbfbRvMUelv+CxlgDIGiSwxuy
9lFs5aXs+Ie777Q4Hr882nuHWfrtsjGWLM4QbNQapJ6hlZ1WcGEiknfVqAks
/HbZFZzXbtbIVQtl+gSegVLezNM+hBUoZAPVmDwQJC9oBIdOBqLzc2ZpErkt
ncat13a+499+FxHX/G89+ZeNc3HI6w0TzRczGe2/bIhdXAdoor5X8zGjduqR
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
IRM4vwR/ipLOT0qny0Kod7v4vwHL4+lTpQcA

-->

</rfc>
