Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

zfs-2.2.2 patchset #15602

Merged
merged 15 commits into from
Nov 30, 2023
Merged

Commits on Nov 28, 2023

  1. Revert "Tune zio buffer caches and their alignments"

    This reverts commit bd7a02c which
    can trigger an unlikely existing bio alignment issue on Linux.
    This change is good, but the underlying issue it exposes needs to
    be resolved before this can be re-applied.
    
    Signed-off-by: Brian Behlendorf <[email protected]>
    Issue openzfs#15533
    behlendorf committed Nov 28, 2023
    Configuration menu
    Copy the full SHA
    89fcb8c View commit details
    Browse the repository at this point in the history
  2. dnode_is_dirty: check dnode and its data for dirtiness

    Over its history this the dirty dnode test has been changed between
    checking for a dnodes being on `os_dirty_dnodes` (`dn_dirty_link`) and
    `dn_dirty_record`.
    
      de198f2 Fix lseek(SEEK_DATA/SEEK_HOLE) mmap consistency
      2531ce3 Revert "Report holes when there are only metadata changes"
      ec4f9b8 Report holes when there are only metadata changes
      454365b Fix dirty check in dmu_offset_next()
      66aca24 SEEK_HOLE should not block on txg_wait_synced()
    
    Also illumos/illumos-gate@c543ec060d illumos/illumos-gate@2bcf0248e9
    
    It turns out both are actually required.
    
    In the case of appending data to a newly created file, the dnode proper
    is dirtied (at least to change the blocksize) and dirty records are
    added.  Thus, a single logical operation is represented by separate
    dirty indicators, and must not be separated.
    
    The incorrect dirty check becomes a problem when the first block of a
    file is being appended to while another process is calling lseek to skip
    holes. There is a small window where the dnode part is undirtied while
    there are still dirty records. In this case, `lseek(fd, 0, SEEK_DATA)`
    would not know that the file is dirty, and would go to
    `dnode_next_offset()`. Since the object has no data blocks yet, it
    returns `ESRCH`, indicating no data found, which results in `ENXIO`
    being returned to `lseek()`'s caller.
    
    Since coreutils 9.2, `cp` performs sparse copies by default, that is, it
    uses `SEEK_DATA` and `SEEK_HOLE` against the source file and attempts to
    replicate the holes in the target. When it hits the bug, its initial
    search for data fails, and it goes on to call `fallocate()` to create a
    hole over the entire destination file.
    
    This has come up more recently as users upgrade their systems, getting
    OpenZFS 2.2 as well as a newer coreutils. However, this problem has been
    reproduced against 2.1, as well as on FreeBSD 13 and 14.
    
    This change simply updates the dirty check to check both types of dirty.
    If there's anything dirty at all, we immediately go to the "wait for
    sync" stage, It doesn't really matter after that; both changes are on
    disk, so the dirty fields should be correct.
    
    Sponsored-by: Klara, Inc.
    Sponsored-by: Wasabi Technology, Inc.
    Reviewed-by: Brian Behlendorf <[email protected]>
    Reviewed-by: Alexander Motin <[email protected]>
    Reviewed-by: Rich Ercolani <[email protected]>
    Signed-off-by: Rob Norris <[email protected]>
    Closes openzfs#15571
    Closes openzfs#15526
    robn authored Nov 28, 2023
    Configuration menu
    Copy the full SHA
    9b9b09f View commit details
    Browse the repository at this point in the history
  3. ZIL: Do not encrypt block pointers in lr_clone_range_t

    In case of crash cloned blocks need to be claimed on pool import.
    It is only possible if they (lr_bps) and their count (lr_nbps) are
    not encrypted but only authenticated, similar to block pointer in
    lr_write_t.  Few other fields can be and are still encrypted.
    
    This should fix panic on ZIL claim after crash when block cloning
    is actively used.
    
    Reviewed-by: Richard Yao <[email protected]>
    Reviewed-by: Tom Caputi <[email protected]>
    Reviewed-by: Sean Eric Fagan <[email protected]>
    Reviewed-by: Brian Behlendorf <[email protected]>
    Reviewed-by: Edmund Nadolski <[email protected]>
    Signed-off-by: Alexander Motin <[email protected]>
    Sponsored by: iXsystems, Inc.
    Closes openzfs#15543
    Closes openzfs#15513
    amotin authored and behlendorf committed Nov 28, 2023
    Configuration menu
    Copy the full SHA
    56a2a09 View commit details
    Browse the repository at this point in the history
  4. ZTS: Fix zfs_load-key failures on F39

    The zfs_load-key tests were failing on F39 due to their use of the
    deprecated ssl.wrap_socket function.  This commit updates the test to
    instead use ssl.SSLContext() as described in
    https://stackoverflow.com/a/65194957.
    
    Reviewed-by: Brian Behlendorf <[email protected]>
    Signed-off-by: Tony Hutter <[email protected]>
    Closes openzfs#15534
    Closes openzfs#15550
    tonyhutter authored and behlendorf committed Nov 28, 2023
    Configuration menu
    Copy the full SHA
    41c4599 View commit details
    Browse the repository at this point in the history
  5. brt: lift internal definitions into _impl header

    So that zdb (and others!) can get at the BRT on-disk structures.
    
    Reviewed-by: Alexander Motin <[email protected]>
    Reviewed-by: Kay Pedersen <[email protected]>
    Reviewed-by: Brian Behlendorf <[email protected]>
    Signed-off-by: Rob Norris <[email protected]>
    Closes openzfs#15541
    robn authored and behlendorf committed Nov 28, 2023
    Configuration menu
    Copy the full SHA
    d702f86 View commit details
    Browse the repository at this point in the history
  6. zdb: show BRT statistics and dump its contents

    Same idea as the dedup stats, but for block cloning.
    
    Reviewed-by: Alexander Motin <[email protected]>
    Reviewed-by: Kay Pedersen <[email protected]>
    Reviewed-by: Brian Behlendorf <[email protected]>
    Signed-off-by: Rob Norris <[email protected]>
    Closes openzfs#15541
    robn authored and behlendorf committed Nov 28, 2023
    Configuration menu
    Copy the full SHA
    e96675a View commit details
    Browse the repository at this point in the history
  7. zdb: Fix zdb '-O|-r' options with -e/exported zpool

    zdb with '-e' or exported zpool doesn't work along with
    '-O' and '-r' options as we process them before '-e' has
    been processed.
    
    Below errors are seen:
    
    ~> zdb -e pool-mds65/mdt65 -O oi.9/0x200000009:0x0:0x0
    failed to hold dataset 'pool-mds65/mdt65': No such file or directory
    
    ~> zdb -e pool-oss0/ost0 -r file1 /tmp/filecopy1 -p.
    failed to hold dataset 'pool-oss0/ost0': No such file or directory
    zdb: internal error: No such file or directory
    
    We need to make sure to process '-O|-r' options after the
    '-e' option has been processed, which imports the pool to
    the namespace if it's not in the cachefile.
    
    Reviewed-by: Brian Behlendorf <[email protected]>
    Signed-off-by: Akash B <[email protected]>
    Closes openzfs#15532
    akashb-22 authored and behlendorf committed Nov 28, 2023
    Configuration menu
    Copy the full SHA
    e4985bf View commit details
    Browse the repository at this point in the history
  8. dmu_buf_will_clone: fix race in transition back to NOFILL

    Previously, dmu_buf_will_clone() would roll back any dirty record, but
    would not clean out the modified data nor reset the state before
    releasing the lock. That leaves the last-written data in db_data, but
    the dbuf in the wrong state.
    
    This is eventually corrected when the dbuf state is made NOFILL, and
    dbuf_noread() called (which clears out the old data), but at this point
    its too late, because the lock was already dropped with that invalid
    state.
    
    Any caller acquiring the lock before the call into
    dmu_buf_will_not_fill() can find what appears to be a clean, readable
    buffer, and would take the wrong state from it: it should be getting the
    data from the cloned block, not from earlier (unwritten) dirty data.
    
    Even after the state was switched to NOFILL, the old data was still not
    cleaned out until dbuf_noread(), which is another gap for a caller to
    take the lock and read the wrong data.
    
    This commit fixes all this by properly cleaning up the previous state
    and then setting the new state before dropping the lock. The
    DBUF_VERIFY() calls confirm that the dbuf is in a valid state when the
    lock is down.
    
    Sponsored-by: Klara, Inc.
    Sponsored-By: OpenDrives Inc.
    Reviewed-by: Brian Behlendorf <[email protected]>
    Reviewed-by: Pawel Jakub Dawidek <[email protected]>
    Signed-off-by: Rob Norris <[email protected]>
    Closes openzfs#15566
    Closes openzfs#15526
    robn authored and behlendorf committed Nov 28, 2023
    Configuration menu
    Copy the full SHA
    2a953e0 View commit details
    Browse the repository at this point in the history
  9. FreeBSD: Fix the build on FreeBSD 12

    It was broken for several reasons:
    * VOP_UNLOCK lost an argument in 13.0.  So OpenZFS should be using
      VOP_UNLOCK1, but a few direct calls to VOP_UNLOCK snuck in.
    * The location of the zlib header moved in 13.0 and 12.1.  We can drop
      support for building on 12.0, which is EoL.
    * knlist_init lost an argument in 13.0.  OpenZFS change 9d08874
      assumed 13.0 or later.
    * FreeBSD 13.0 added copy_file_range, and OpenZFS change 67a1b03
      assumed 13.0 or later.
    
    Sponsored-by: Axcient
    Reviewed-by: Alexander Motin <[email protected]>
    Signed-off-by: Alan Somers <[email protected]>
    Closes openzfs#15551
    asomers authored and tonyhutter committed Nov 28, 2023
    Configuration menu
    Copy the full SHA
    349fb77 View commit details
    Browse the repository at this point in the history
  10. zfs-dkms: fix shell-init error message

    If all zfs dkms modules have been removed, a shell-init error message
    may appear, because /var/lib/dkms/zfs does no longer exist.
    Resolve this by leaving the directory earlier on.
    
    Reviewed-by: Brian Behlendorf <[email protected]>
    Signed-off-by: Mart Frauenlob <[email protected]>
    Closes openzfs#15576
    AllKind authored and tonyhutter committed Nov 28, 2023
    Configuration menu
    Copy the full SHA
    3b267e7 View commit details
    Browse the repository at this point in the history
  11. Linux 6.6 compat: fix configure error with clang (openzfs#15558)

    With Linux v6.6.x and clang 16, a configure step fails on a warning that
    later results in an error while building, due to 'ts' being
    uninitialized. Add a trivial initialization to silence the warning.
    
    Signed-off-by: Jaron Kent-Dobias <[email protected]>
    Reviewed-by: Tony Hutter <[email protected]>
    kentdobias authored and tonyhutter committed Nov 28, 2023
    Configuration menu
    Copy the full SHA
    d813aa8 View commit details
    Browse the repository at this point in the history

Commits on Nov 29, 2023

  1. zdb: fix printf() length for uint64_t devid

    Bug introduced in 213d682.
    
    Reviewed-by: Alexander Motin <[email protected]>
    Reviewed-by: Brian Behlendorf <[email protected]>
    Signed-off-by: Warner Losh <[email protected]>
    Signed-off-by: Martin Matuska <[email protected]>
    Closes openzfs#15606
    mmatuska authored and tonyhutter committed Nov 29, 2023
    Configuration menu
    Copy the full SHA
    eb34de0 View commit details
    Browse the repository at this point in the history
  2. ZIL: Call brt_pending_add() replaying TX_CLONE_RANGE

    zil_claim_clone_range() takes references on cloned blocks before ZIL
    replay.  Later zil_free_clone_range() drops them after replay or on
    dataset destroy.  The total balance is neutral.  It means on actual
    replay we must take additional references, which would stay in BRT.
    
    Without this blocks could be freed prematurely when either original
    file or its clone are destroyed.  I've observed BRT being emptied
    and the feature being deactivated after ZIL replay completion, which
    should not have happened.  With the patch I see expected stats.
    
    Reviewed-by: Kay Pedersen <[email protected]>
    Reviewed-by: Brian Behlendorf <[email protected]>
    Reviewed-by: Rob Norris <[email protected]>
    Signed-off-by:	Alexander Motin <[email protected]>
    Sponsored by:	iXsystems, Inc.
    Closes openzfs#15603
    amotin authored and tonyhutter committed Nov 29, 2023
    Configuration menu
    Copy the full SHA
    a8c2560 View commit details
    Browse the repository at this point in the history
  3. FreeBSD: Fix ZFS so that snapshots under .zfs/snapshot are NFS visible

    Call vfs_exjail_clone() for mounts created under .zfs/snapshot
    to fill in the mnt_exjail field for the mount.  If this is not
    done, the snapshots under .zfs/snapshot with not be accessible
    over NFS.
    
    This version has the argument name in vfs.h fixed to match that
    of the name in spl_vfs.c, although it really does not matter.
    
    External-issue: https://reviews.freebsd.org/D42672
    Reviewed-by: Alexander Motin <[email protected]>
    Signed-off-by: Rick Macklem <[email protected]>
    Closes openzfs#15563
    rmacklem authored and tonyhutter committed Nov 29, 2023
    Configuration menu
    Copy the full SHA
    522414d View commit details
    Browse the repository at this point in the history
  4. Tag zfs-2.2.2

    META file and changelog updated.
    
    Signed-off-by: Tony Hutter <[email protected]>
    tonyhutter committed Nov 29, 2023
    Configuration menu
    Copy the full SHA
    494aaae View commit details
    Browse the repository at this point in the history