Merge tag 'for-5.20-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 Aug 2022 21:54:52 +0000 (14:54 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 Aug 2022 21:54:52 +0000 (14:54 -0700)
Pull btrfs updates from David Sterba:
 "This brings some long awaited changes, the send protocol bump,
  otherwise lots of small improvements and fixes. The main core part is
  reworking bio handling, cleaning up the submission and endio and
  improving error handling.

  There are some changes outside of btrfs adding helpers or updating
  API, listed at the end of the changelog.

  Features:

   - sysfs:
      - export chunk size, in debug mode add tunable for setting its size
      - show zoned among features (was only in debug mode)
      - show commit stats (number, last/max/total duration)

   - send protocol updated to 2
      - new commands:
         - ability write larger data chunks than 64K
         - send raw compressed extents (uses the encoded data ioctls),
           ie. no decompression on send side, no compression needed on
           receive side if supported
         - send 'otime' (inode creation time) among other timestamps
         - send file attributes (a.k.a file flags and xflags)
      - this is first version bump, backward compatibility on send and
        receive side is provided
      - there are still some known and wanted commands that will be
        implemented in the near future, another version bump will be
        needed, however we want to minimize that to avoid causing
        usability issues

   - print checksum type and implementation at mount time

   - don't print some messages at mount (mentioned as people asked about
     it), we want to print messages namely for new features so let's
     make some space for that
      - big metadata - this has been supported for a long time and is
        not a feature that's worth mentioning
      - skinny metadata - same reason, set by default by mkfs

  Performance improvements:

   - reduced amount of reserved metadata for delayed items
      - when inserted items can be batched into one leaf
      - when deleting batched directory index items
      - when deleting delayed items used for deletion
      - overall improved count of files/sec, decreased subvolume lock
        contention

   - metadata item access bounds checker micro-optimized, with a few
     percent of improved runtime for metadata-heavy operations

   - increase direct io limit for read to 256 sectors, improved
     throughput by 3x on sample workload

  Notable fixes:

   - raid56
      - reduce parity writes, skip sectors of stripe when there are no
        data updates
      - restore reading from on-disk data instead of using stripe cache,
        this reduces chances to damage correct data due to RMW cycle

   - refuse to replay log with unknown incompat read-only feature bit
     set

   - zoned
      - fix page locking when COW fails in the middle of allocation
      - improved tracking of active zones, ZNS drives may limit the
        number and there are ENOSPC errors due to that limit and not
        actual lack of space
      - adjust maximum extent size for zone append so it does not cause
        late ENOSPC due to underreservation

   - mirror reading error messages show the mirror number

   - don't fallback to buffered IO for NOWAIT direct IO writes, we don't
     have the NOWAIT semantics for buffered io yet

   - send, fix sending link commands for existing file paths when there
     are deleted and created hardlinks for same files

   - repair all mirrors for profiles with more than 1 copy (raid1c34)

   - fix repair of compressed extents, unify where error detection and
     repair happen

  Core changes:

   - bio completion cleanups
      - don't double defer compression bios
      - simplify endio workqueues
      - add more data to btrfs_bio to avoid allocation for read requests
      - rework bio error handling so it's same what block layer does,
        the submission works and errors are consumed in endio
      - when asynchronous bio offload fails fall back to synchronous
        checksum calculation to avoid errors under writeback or memory
        pressure

   - new trace points
      - raid56 events
      - ordered extent operations

   - super block log_root_transid deprecated (never used)

   - mixed_backref and big_metadata sysfs feature files removed, they've
     been default for sufficiently long time, there are no known users
     and mixed_backref could be confused with mixed_groups

  Non-btrfs changes, API updates:

   - minor highmem API update to cover const arguments

   - switch all kmap/kmap_atomic to kmap_local

   - remove redundant flush_dcache_page()

   - address_space_operations::writepage callback removed

   - add bdev_max_segments() helper"

* tag 'for-5.20-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: (163 commits)
  btrfs: don't call btrfs_page_set_checked in finish_compressed_bio_read
  btrfs: fix repair of compressed extents
  btrfs: remove the start argument to check_data_csum and export
  btrfs: pass a btrfs_bio to btrfs_repair_one_sector
  btrfs: simplify the pending I/O counting in struct compressed_bio
  btrfs: repair all known bad mirrors
  btrfs: merge btrfs_dev_stat_print_on_error with its only caller
  btrfs: join running log transaction when logging new name
  btrfs: simplify error handling in btrfs_lookup_dentry
  btrfs: send: always use the rbtree based inode ref management infrastructure
  btrfs: send: fix sending link commands for existing file paths
  btrfs: send: introduce recorded_ref_alloc and recorded_ref_free
  btrfs: zoned: wait until zone is finished when allocation didn't progress
  btrfs: zoned: write out partially allocated region
  btrfs: zoned: activate necessary block group
  btrfs: zoned: activate metadata block group on flush_space
  btrfs: zoned: disable metadata overcommit for zoned
  btrfs: zoned: introduce space_info->active_total_bytes
  btrfs: zoned: finish least available block group on data bg allocation
  btrfs: let can_allocate_chunk return error
  ...

1  2 
fs/btrfs/compression.c
fs/btrfs/compression.h
fs/btrfs/disk-io.c
fs/btrfs/extent_io.c
fs/btrfs/file.c
fs/btrfs/inode.c
fs/btrfs/raid56.c
include/linux/blkdev.h
include/uapi/linux/btrfs.h

@@@ -514,10 -394,10 +394,10 @@@ blk_status_t btrfs_submit_compressed_wr
        struct compressed_bio *cb;
        u64 cur_disk_bytenr = disk_start;
        u64 next_stripe_start;
-       blk_status_t ret;
+       blk_status_t ret = BLK_STS_OK;
        int skip_sum = inode->flags & BTRFS_INODE_NODATASUM;
        const bool use_append = btrfs_use_zone_append(inode, disk_start);
 -      const unsigned int bio_op = use_append ? REQ_OP_ZONE_APPEND : REQ_OP_WRITE;
 +      const enum req_op bio_op = use_append ? REQ_OP_ZONE_APPEND : REQ_OP_WRITE;
  
        ASSERT(IS_ALIGNED(start, fs_info->sectorsize) &&
               IS_ALIGNED(len, fs_info->sectorsize));
Simple merge
Simple merge
@@@ -4577,7 -4530,7 +4530,7 @@@ static int write_one_subpage_eb(struct 
  {
        struct btrfs_fs_info *fs_info = eb->fs_info;
        struct page *page = eb->pages[0];
-       blk_opf_t write_flags = wbc_to_write_flags(wbc) | REQ_META;
 -      unsigned int write_flags = wbc_to_write_flags(wbc);
++      blk_opf_t write_flags = wbc_to_write_flags(wbc);
        bool no_dirty_ebs = false;
        int ret;
  
@@@ -4622,7 -4575,7 +4575,7 @@@ static noinline_for_stack int write_one
  {
        u64 disk_bytenr = eb->start;
        int i, num_pages;
-       blk_opf_t write_flags = wbc_to_write_flags(wbc) | REQ_META;
 -      unsigned int write_flags = wbc_to_write_flags(wbc);
++      blk_opf_t write_flags = wbc_to_write_flags(wbc);
        int ret = 0;
  
        prepare_eb_write(eb);
diff --cc fs/btrfs/file.c
@@@ -1954,7 -1964,17 +1954,10 @@@ again
  
        btrfs_inode_unlock(inode, ilock_flags);
  
-       /* If 'err' is -ENOTBLK then it means we must fallback to buffered IO. */
 -      /*
 -       * Add back IOCB_DSYNC. Our caller, btrfs_file_write_iter(), will do
 -       * the fsync (call generic_write_sync()).
 -       */
 -      if (is_sync_write)
 -              iocb->ki_flags |= IOCB_DSYNC;
 -
+       /*
+        * If 'err' is -ENOTBLK or we have not written all data, then it means
+        * we must fallback to buffered IO.
+        */
        if ((err < 0 && err != -ENOTBLK) || !iov_iter_count(from))
                goto out;
  
Simple merge
@@@ -1135,8 -1018,7 +1018,7 @@@ static int rbio_add_io_sector(struct bt
                              struct sector_ptr *sector,
                              unsigned int stripe_nr,
                              unsigned int sector_nr,
-                             unsigned long bio_max_len,
 -                            unsigned int opf)
 +                            enum req_op op)
  {
        const u32 sectorsize = rbio->bioc->fs_info->sectorsize;
        struct bio *last = bio_list->tail;
        }
  
        /* put a new bio on the list */
-       bio = bio_alloc(stripe->dev->bdev, max(bio_max_len >> PAGE_SHIFT, 1UL),
+       bio = bio_alloc(stripe->dev->bdev,
+                       max(BTRFS_STRIPE_LEN >> PAGE_SHIFT, 1),
 -                      opf, GFP_NOFS);
 +                      op, GFP_NOFS);
        bio->bi_iter.bi_sector = disk_start >> 9;
        bio->bi_private = rbio;
  
Simple merge
Simple merge