Latest:
------
 For even more detail, use "git log" or visit https://github.com/LINBIT/drbd/commits/master.

9.3.5-rc.1 (api:genl2/proto:86-101,118-125/transport:23)
--------
 * Track changed blocks for incremental backups: a tracking bitmap slot
   records every write to the backing device; cbt-flush and cbt-start
   bracket a snapshot taken while I/O is suspended on all nodes
 * suspend-io now also waits for the barrier ack of the last epoch, so
   that with protocols A and B the writes are on the peers' stable
   storage too; flush-to-peers=no skips that wait
 * Add rdma2, a new RDMA transport that moves all data with one-sided
   RDMA-WRITE, sends bios zero-copy, and fails over to a surviving path
   when a link goes down
 * Serve the new drbd2 netlink family next to the drbd family
 * Optionally serve DRBD 8.4 userland over the netlink family at version
   1 (CONFIG_DRBD_NL_DRBD1, rpmbuild --with nl_drbd1,
   DEB_BUILD_OPTIONS=nl_drbd1); off by default
 * Fix lb-tcp skipping a path for good after the peer closed it first
   during a disconnect, which starved every later handshake
 * Fix spurious and racy "bitmap locked" warnings when bitmap operations
   on different peer slots run concurrently
 * All fixes from 9.2.21-rc.1
  - Fix a resync target staying Inconsistent with nothing left to sync:
    when the Primary cannot reach the sync source, after aborting a weak
    sync source, and when P_RS_CANCEL_AHEAD overtakes the Ahead state
    change
  - Fix a reconciliation resync target waiting in WFBitMapT forever, and
    out-of-sync bits from before a lost diskless Primary being dropped at
    equal dagtags
  - Fix a peer's connect-time upgrade from Outdated going unnoticed,
    which left writes unreplicated
  - Fix an Outdated sync source being marked UpToDate after a resync
    with failed blocks
  - Fix the day0 slots, a regression in 9.2.20: forget-peer left a slot
    that the next UUID bump filled with a later generation, and a peer
    created from the day0 UUID could be refused as unrelated data;
    attach repairs such meta data
  - Fix promoting a peer that holds an older generation of the data a
    diskless Primary exposes
  - Fix P_OUT_OF_SYNC: never sent for Primaries with node-id 8 or higher,
    a crash after del-peer of a Primary, and writes left pending for a
    peer that lost its connection
  - Fix the activity log: AL updates turned off while a crashed Primary
    resyncs, the superblock written too late on "al-updates no", and the
    in-core AL not written when AL updates come back on
  - Fix a dry-run connect (--tentative) establishing the connection
    without a resync
  - Fix the last close returning before the peers have the last write on
    stable storage, and auto-demote failing on a pending signal
  - Fix call-pri-lost-after-sb killing the receiver instead of demoting
  - Fix online resize: drain application I/O before the commit and before
    a participant replies, cache the peers' size answers per volume, and
    refuse a too small peer while syncing from a larger one
  - Fix a receiver deadlock at the end of a resync when the link fails
    while the bitmap is written, and bound the memory a bitmap write-out
    holds
  - Fix resync pacing: the fixed resync-rate (c-plan-ahead 0) holds, the
    resync queue at the backing device is bounded so application I/O does
    not wait behind it, and DRBD logs when max-buffers or c-max-rate
    limit a resync
  - Fix connect and disconnect issues: a spurious NetworkFailure right
    after a handshake, a stale ping timeout dropping the next connect, a
    peer's close while connecting taken as a network error, ko-count 0
    being counted down, and a second peer accepted beside a DRBD 8.4 peer
  - Fix lb-tcp: a NULL pointer dereference in the receiver, a CPU spin
    when the peer closes mid-payload, zero-length data chunks, hot-adding
    paths, and listeners left on unused paths
  - Fix rdma: use-after-free and refcount underflows on teardown during
    connect, a 60 s hang after a failed establish, going StandAlone on an
    interrupted connect, and a crash with a peer running rdma2
  - Fix the TLS handshake compat code (upstream fixes): leaks, refcount
    and use-after-free bugs, and a missing admin check on DONE
  - Fix memory corruption by peer_device flags on 32-bit kernels
  - Fix a negative ap-in-flight after a resend, BarrierAck count warnings,
    sending on after a send failed, and an unsent packet flushed at
    disconnect ("Wrong magic value" on the peer)
  - Fix attach hanging after the node was a verify target, and a double
    release when linking the holder fails
  - Show the submit and sent ages of requests in debugfs again, and mark
    peer writes that completed locally
  - Fix building SUSE KMPs on SLES 16, and the build with
    CONFIG_DRBD_TIMING_STATS

9.3.4 (api:genl2/proto:86-101,118-125/transport:22)
--------
 * Fix drbdsetup failing with "Operation not supported" on every command
   that names a peer; a regression of the YNL-generated netlink code in
   9.3.4-rc.1
 * Generate the netlink interface code with the upstream YNL generator
   instead of the genl_magic macro system
 * Fix a ProtocolError disconnect loop ("BAD! BarrierAck received with
   n_writes=...") when two volumes of one connection replicate and
   resync without replication at the same time
 * Tolerate a verify-alg mismatch when connecting, and refuse to start
   an online verify while the algorithms differ, instead of rejecting
   the connection outright
 * Fix several bitmap lifetime bugs around attach and detach: a NULL
   bitmap dereference in the peer device statistics, a missing bitmap
   in drbd_set_sync(), concurrent drbd_bm_free() callers, and freeing
   a bitmap that a later attach published
 * Fix a device reference leak and a NULL pointer dereference when a
   peer request's bio allocation fails under memory pressure
 * Hold state_rwlock while walking the transfer log from debugfs
 * All fixes from 9.2.20
  - Fix a secondary that stayed with the primary ending up Outdated for
    good after an isolated peer returns: an equal-UUID reconcile is now
    sourced from the node that has a primary neighbour
  - Fix two nodes ending UpToDate with different data after a reconnect
    with equal current UUIDs and out-of-sync bits standing: such bits now
    survive a resync-free connect and drive a reconciliation resync
  - Fix divergence around the end of a resync
  - Fix a node losing its obligation to start a new data generation and
    ending in a split brain
  - Fix a number of aspects of online resize
  - Fix a sync target overwriting acknowledged writes with older resync
    data when the sync source lost the diskless primary; such writes are
    now held back or postponed (new feature flag WRITE_POSTPONE) instead
    of being silently rolled back
  - Fix data corruption when a peer bitmap that is being cleared by a
    running resync was copied for a second peer
  - Fix several ways a Primary lost its obligation to start a new data
    generation after losing a peer, each ending in silent divergence,
    and a spurious I/O error when a deferred generation resumes; the
    obligation is now tracked per volume and logged
  - Fix a diskless Primary losing a peer: rotate the current UUID so the
    stale peer resyncs on return, outdate far-away members before
    resuming I/O, and keep the sole UpToDate survivor UpToDate; also
    fixes promotions freezing I/O on nodes not connected to every member
  - Fix a resync target ending with stale data or an old data generation
    when a crashed primary rejoins or a diskless primary announces a new
    generation mid-resync
  - Fix al-updates=no: honour it at attach time, and mark all bitmap
    slots out of sync after a primary crash
  - Fix kernel memory corruption by a malicious or man-in-the-middle
    peer sending out-of-range payload, drain or digest sizes, and a
    divide error caused by bogus peer block sizes
  - Fix a use-after-free of the resource when a connections dump is
    interrupted, and a refcount imbalance flooding the log with put_ldev
    assertions after a resync request allocation failure
  - Fix soft lockups: the sender thread pinning a CPU while its
    connection is down, and IRQ-disabled bitmap scans on multi-TiB
    volumes
  - Fix several deadlocks and hangs: whole-bitmap IO vs clear_peer_slot()
    or online resize, WFBitMapS on an equal-UUID reconnect with leftover
    out-of-sync bits, demotion starved by a failing connect handshake,
    and connection teardown blocked behind an unacknowledged resync
    conflict
  - Fix many two-phase-commit issues: stale replies answering the wrong
    transaction, prepared peers that disconnected, forwarding node
    handling, a state_sem leak on timeout, and unbounded connect
    retries; log which volume a connect is waiting for
  - Fix resyncs stalling short of completion, and a connection dropping
    to StandAlone when a crashed primary rejoins during a resync
  - Fix drbd_suspend_io() not waiting for in-flight writes; a detach
    hanging on a dead backing device stays interruptible
  - Fix restoring quorum after a reboot when the remaining members are
    diskless
  - Fix connection losses: online resize ending in ProtocolError,
    volume-less connections reconnecting every ping-timeout, lb-tcp
    "drbdadm down" stalling for a connect-int, and a TLS control socket
    close going unnoticed
  - Declare a connection broken where a two-phase-commit send failed,
    and repeat a disconnect without delay and with a bound; together
    they end a hanging "drbdadm disconnect"
  - Do not account requests as waiting for the activity log while it is
    suspended; the stale counters throttled resync to c-min-rate and
    drained the epoch for every incoming peer write

9.3.3 (api:genl2/proto:86-101,118-124/transport:22)
--------
 * Support adding and removing paths on established lb-tcp connections
 * Fix a page-reference leak on TLS connections by copying instead of
   referencing pages when sending
 * Reject paths that would make incoming connections ambiguous
 * All fixes from 9.2.19
  - Fix silent data divergence when a diskless primary creates a new
    current UUID that a peer never received (e.g. switch failure);
    the optimistic UUID is now confirmed via the data stream before
    being relied upon
  - Fix silent data corruption when a diskless primary suppressed its
    current-UUID bump because a peer had been resynced by a third node
  - Fix a false split-brain ("Unrelated data, aborting!") caused by
    pushing a peer's bitmap UUIDs into the local history
  - Hold a primary-loss survivor at Consistent until it reconciles with
    the surviving peers, so a stale node cannot promote and serve
    un-reconciled data
  - Reconcile two peers holding the same current UUID but still carrying
    out-of-sync bits toward each other, instead of silently dropping the
    divergence
  - Fix a list corruption crash when freeing a peer_req that was
    still linked on the send_oos list
  - Fix an AB-BA deadlock between online resize and activity-log
    transactions
  - Fix a use-after-free of the TCP listener during connection setup
  - Fix a list corruption crash and assertion failures when a peer
    disconnects while online-verify requests are still in flight
  - Fix several races during connection teardown that could crash or
    hang (ack_sender requeue, pending ping work, in-progress lb-tcp
    connect)
  - Abort a two-phase-commit on peers when the target connection fails
    to prepare
  - Added max_parallel_resyncs module parameter to cap how many
    volumes may resync (or verify) in parallel
  - Fix multiple RDMA transport bugs hit during racing teardown: a
    NULL pointer dereference, a self-deadlock, and a cm object leak
  - Fix bogus resync speed/ETA reported in /proc/drbd when the
    out-of-sync amount grows
  - Do not throttle a resync that is losing ground to ongoing writes

9.3.2 (api:genl2/proto:86-101,118-124/transport:22)
--------
 * Use genl pre_doit/post_doit for netlink request setup and teardown
 * Handle recv returning 0 (EOF) in recv_bio
 * Revert flush_send_buffer send error causing state change
 * Fix a page leak in the RDMA transport's send-page path
 * All fixes from 9.2.18
  - Fix when a diskless primary creates a new current UUID,
    fixing possible silent data divergence later
  - Fix quorum calculation upon attach/detach operations
  - Handle split-brain recovery strategies during attach
    like they are handled during connect
  - Hanle attaching of large devices (~100TiB) without triggering
    the NMI watchdog
  - Fix a race condition in the RDMA code that could lead to
    leaking a cm object
  - Skip new-region resync for zero-guarantee backends at attach
  - drbdsetup attach waits for completion of disk state negotiation
    before returning
  - Fix missing disk line in drbdsetup show while in D_NEGOTIATING state
  - A few fixes found by the static analyzer smatch

9.3.1 (api:genl2/proto:86-101,118-124/transport:21)
--------
 * Use compound pages to optimize large I/O performance
 * New option for setting the discard granularity exposed on
   diskless nodes
 * Add per-peer_device tiebreaker config flag for quorum
 * Fix compat-8.4 /proc/drbd output for connected resources
 * Fix a race that could lead that a resyncs stalls when it
   should complete.
 * All fixes from 9.2.17
  - Fix a kernel crash triggered by a crafted/invalid netlink message
  - Fix a crash when resyncing with a peer supporting proto 121,
    e.g. drbd-9.1.23
  - Fixed two corner case regressions regarding bitmap lifetime
    (introduced with 9.2.16)
  - Add a static analyzer that checks for correctly handling bitmap
    object lifetime; it identified 6 bugs
  - Correctly request BLK_FEAT_STABLE_WRITES from the kernel; Kernels
    side changes lead to this queue flag not being active
  - Fix lb-tcp to not corrupt data when it reassembles a data chunk, it
    split for sending over multiple paths in parallel
  - Add a special case to ensure LINSTOR re-provisioned nodes with thin
    volumes get the necessary incremental resync
  - Always do a two-phase-commit for attach, closes a race that could
    lead to an inconsistent repl states
  - Skip unnecessary resync when a missed end-of-resync has 0 bits;
    before that fix, DRBD could end up in inconsistent repl states
  - Fix a case where a send error was ignored on congested connections
  - Make detection of missed end-of-resync symmetric; the bug led to
    inconsistent repl states
  - Make the RDMA transport compatible with RXE (software RoCE),
    and some mainly performance-related fixes

9.3.0 (api:genl2/proto:86-101,118-123/transport:19)
--------
 * was forked off between 9.2.12 and 9.2.13
 * Implemented resync without replication and made it the default; the
   previous (drbd-9.2 and earlier) behavior is still available via a
   config option. With that, the resync operation begins with
   mirroring of application writes disabled, and it performs multiple
   resync passes, clearing bits in the bitmap. It enables application
   write mirroring when the resync is nearly complete. That reduces
   the I/O load during resync, and in most cases, it reduces resync
   time.
 * Implemented support for bitmap granularity between 4k and 1M,
   including exchanging bitmaps with peers with a different bitmap
   block size
 * Give filesystems mounted on DRBD a chance to bring their on-disk
   representations into a consistent state before suspending I/O.
 * Add support for omitting bitmap allocation for standalone devices
 * Explicit config option for drbd8-api-compatibility mode
 * Dropped support for RHEL7 and support for kernels older than 3.10.
 * All fixes from 9.2.13 to 9.2.16
 * Compatibility with Linux-6.18
