public inbox for linux-fsdevel@vger.kernel.org
 help / color / mirror / Atom feed
From: Christian Brauner <brauner@kernel.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Christian Brauner <brauner@kernel.org>,
	linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [GIT PULL 04/12 for v7.1] vfs integrity
Date: Fri, 10 Apr 2026 17:17:13 +0200	[thread overview]
Message-ID: <20260410-vfs-integrity-v71-caf8be59f7dd@brauner> (raw)
In-Reply-To: <20260410-vfs-v71-b055f260060c@brauner>

Hey Linus,

/* Summary */

This adds support to generate and verify integrity information (aka T10
PI) in the file system, instead of the automatic below the covers
support that is currently used.

The implementation is based on refactoring the existing block layer PI
code to be reusable for this use case, and then adding relatively
small wrappers for the file system use case. These are then used in
iomap to implement the semantics, and wired up in XFS with a small
amount of glue code.

Compared to the baseline this does not change performance for writes,
but increases read performance up to 15% for 4k I/O, with the benefit
decreasing with larger I/O sizes as even the baseline maxes out the
device quickly on my older enterprise SSD.

/* Testing */

gcc (Debian 14.2.0-19) 14.2.0
Debian clang version 19.1.7 (3+b1)

No build failures or warnings were observed.

/* Conflicts */

Merge conflicts with mainline
=============================

diff --cc fs/iomap/bio.c
index edd908183058,f989ffcaac96..000000000000
--- a/fs/iomap/bio.c
+++ b/fs/iomap/bio.c
@@@ -8,66 -9,33 +9,77 @@@
  #include "internal.h"
  #include "trace.h"

 +static DEFINE_SPINLOCK(failed_read_lock);
 +static struct bio_list failed_read_list = BIO_EMPTY_LIST;
 +
- static void __iomap_read_end_io(struct bio *bio)
+ static u32 __iomap_read_end_io(struct bio *bio, int error)
  {
-       int error = blk_status_to_errno(bio->bi_status);
        struct folio_iter fi;
+       u32 folio_count = 0;

-       bio_for_each_folio_all(fi, bio)
+       bio_for_each_folio_all(fi, bio) {
                iomap_finish_folio_read(fi.folio, fi.offset, fi.length, error);
+               folio_count++;
+       }
+       if (bio_integrity(bio))
+               fs_bio_integrity_free(bio);
        bio_put(bio);
+       return folio_count;
  }

 +static void
 +iomap_fail_reads(
 +      struct work_struct      *work)
 +{
 +      struct bio              *bio;
 +      struct bio_list         tmp = BIO_EMPTY_LIST;
 +      unsigned long           flags;
 +
 +      spin_lock_irqsave(&failed_read_lock, flags);
 +      bio_list_merge_init(&tmp, &failed_read_list);
 +      spin_unlock_irqrestore(&failed_read_lock, flags);
 +
 +      while ((bio = bio_list_pop(&tmp)) != NULL) {
-               __iomap_read_end_io(bio);
++              __iomap_read_end_io(bio, blk_status_to_errno(bio->bi_status));
 +              cond_resched();
 +      }
 +}
 +
 +static DECLARE_WORK(failed_read_work, iomap_fail_reads);
 +
 +static void iomap_fail_buffered_read(struct bio *bio)
 +{
 +      unsigned long flags;
 +
 +      /*
 +       * Bounce I/O errors to a workqueue to avoid nested i_lock acquisitions
 +       * in the fserror code.  The caller no longer owns the bio reference
 +       * after the spinlock drops.
 +       */
 +      spin_lock_irqsave(&failed_read_lock, flags);
 +      if (bio_list_empty(&failed_read_list))
 +              WARN_ON_ONCE(!schedule_work(&failed_read_work));
 +      bio_list_add(&failed_read_list, bio);
 +      spin_unlock_irqrestore(&failed_read_lock, flags);
 +}
 +
  static void iomap_read_end_io(struct bio *bio)
  {
 -      __iomap_read_end_io(bio, blk_status_to_errno(bio->bi_status));
 +      if (bio->bi_status) {
 +              iomap_fail_buffered_read(bio);
 +              return;
 +      }
 +
-       __iomap_read_end_io(bio);
++      __iomap_read_end_io(bio, 0);
+ }
+
+ u32 iomap_finish_ioend_buffered_read(struct iomap_ioend *ioend)
+ {
+       return __iomap_read_end_io(&ioend->io_bio, ioend->io_error);
  }

- static void iomap_bio_submit_read(struct iomap_read_folio_ctx *ctx)
+ static void iomap_bio_submit_read(const struct iomap_iter *iter,
+               struct iomap_read_folio_ctx *ctx)
  {
        struct bio *bio = ctx->read_ctx;

Merge conflicts with other trees
================================

The following changes since commit 1f318b96cc84d7c2ab792fcc0bfd42a7ca890681:

  Linux 7.0-rc3 (2026-03-08 16:56:54 -0700)

are available in the Git repository at:

  git@gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs tags/vfs-7.1-rc1.integrity

for you to fetch changes up to 1b63f91d1c9013629fb2005ace48b7aeead32330:

  Merge patch series "support file system generated / verified integrity information v4" (2026-03-10 10:29:18 +0100)

----------------------------------------------------------------
vfs-7.1-rc1.integrity

Please consider pulling these changes from the signed vfs-7.1-rc1.integrity tag.

Thanks!
Christian

----------------------------------------------------------------
Christian Brauner (2):
      Merge branch 'for-7.1/block-integrity'
      Merge patch series "support file system generated / verified integrity information v4"

Christoph Hellwig (16):
      block: factor out a bio_integrity_action helper
      block: factor out a bio_integrity_setup_default helper
      block: add a bdev_has_integrity_csum helper
      block: prepare generation / verification helpers for fs usage
      block: make max_integrity_io_size public
      block: add fs_bio_integrity helpers
      block: pass a maxlen argument to bio_iov_iter_bounce
      iomap: refactor iomap_bio_read_folio_range
      iomap: pass the iomap_iter to ->submit_read
      iomap: only call into ->submit_read when there is a read_ctx
      iomap: allow file systems to hook into buffered read bio submission
      ntfs3: remove copy and pasted iomap code
      iomap: add a bioset pointer to iomap_read_folio_ops
      iomap: support ioends for buffered reads
      iomap: support T10 protection information
      xfs: support T10 protection information

 block/Makefile                |   2 +-
 block/bio-integrity-auto.c    |  80 ++++---------------------
 block/bio-integrity-fs.c      |  81 +++++++++++++++++++++++++
 block/bio-integrity.c         |  64 ++++++++++++++++++++
 block/bio.c                   |  17 +++---
 block/blk-mq.c                |   6 +-
 block/blk-settings.c          |  13 ----
 block/blk.h                   |   6 +-
 block/t10-pi.c                |  12 ++--
 drivers/nvdimm/btt.c          |   6 +-
 fs/fuse/file.c                |   5 +-
 fs/iomap/bio.c                | 135 ++++++++++++++++++++++++++++--------------
 fs/iomap/buffered-io.c        |   8 +--
 fs/iomap/direct-io.c          |  15 ++++-
 fs/iomap/internal.h           |  14 +++++
 fs/iomap/ioend.c              |  30 ++++++++--
 fs/ntfs3/inode.c              |  57 ++----------------
 fs/xfs/xfs_aops.c             |  47 +++++++++++++--
 fs/xfs/xfs_iomap.c            |   9 ++-
 include/linux/bio-integrity.h |  12 +++-
 include/linux/bio.h           |   2 +-
 include/linux/blk-integrity.h |  28 +++++++--
 include/linux/blkdev.h        |  34 +++++++++--
 include/linux/iomap.h         |  20 ++++++-
 24 files changed, 470 insertions(+), 233 deletions(-)
 create mode 100644 block/bio-integrity-fs.c

  parent reply	other threads:[~2026-04-10 15:18 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-10 15:15 [GIT PULL 00/12 for v7.1] v7.1 Christian Brauner
2026-04-10 15:16 ` [GIT PULL 01/12 for v7.1] vfs writeback Christian Brauner
2026-04-10 15:16 ` [GIT PULL 02/12 for v7.1] vfs xattr Christian Brauner
2026-04-10 15:16 ` [GIT PULL 03/12 for v7.1] vfs directory Christian Brauner
2026-04-10 15:17 ` Christian Brauner [this message]
2026-04-10 15:18 ` [GIT PULL 05/12 for v7.1] vfs fs_struct Christian Brauner
2026-04-10 15:18 ` [GIT PULL 06/12 for v7.1] vfs kino Christian Brauner
2026-04-10 15:19 ` [GIT PULL 07/12 for v7.1] vfs fat Christian Brauner
2026-04-10 15:19 ` [GIT PULL 08/12 for v7.1] vfs bh metadata Christian Brauner
2026-04-10 15:19 ` [GIT PULL 09/12 for v7.1] namespaces misc Christian Brauner
2026-04-10 15:21 ` [GIT PULL 10/12 for v7.1] vfs pidfs Christian Brauner
2026-04-10 15:21 ` [GIT PULL 11/12 for v7.1] vfs mount Christian Brauner
2026-04-10 15:23 ` [GIT PULL 12/12 for v7.1] vfs misc Christian Brauner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260410-vfs-integrity-v71-caf8be59f7dd@brauner \
    --to=brauner@kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox