lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAPjX3Fc9tRWZiwdx_E9Fa33gpBNzB-3V0MthDZGpJR7Bu9jg2w@mail.gmail.com>
Date: Thu, 13 Nov 2025 20:16:03 +0100
From: Daniel Vacek <neelx@...e.com>
To: Qu Wenruo <wqu@...e.com>
Cc: Chris Mason <clm@...com>, Josef Bacik <josef@...icpanda.com>, David Sterba <dsterba@...e.com>, 
	linux-btrfs@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v6 4/8] btrfs: add orig_logical to btrfs_bio

On Wed, 12 Nov 2025 at 22:07, Qu Wenruo <wqu@...e.com> wrote:
> 在 2025/11/13 06:06, Daniel Vacek 写道:
> > From: Josef Bacik <josef@...icpanda.com>
> >
> > When checksumming the encrypted bio on writes we need to know which
> > logical address this checksum is for.  At the point where we get the
> > encrypted bio the bi_sector is the physical location on the target disk,
> > so we need to save the original logical offset in the btrfs_bio.  Then
> > we can use this when csum'ing the bio instead of the
> > bio->iter.bi_sector.
>
> We have already btrfs_bio::csum_saved_iter, we can just reuse it to grab
> logical bytenr by csum_saved_iter->bi_iter.bi_sector.
>
> Although that member is only for data writes with data checksum, it's
> not hard to adapt it for encryption.
>
> But in that case, we may want to rename that member to something more
> generic, maybe like write_saved_iter?

Yeah, something like that could work. Later fscrypt change uses
bbio->saved_iter for checking the checksum on encrypted read. Perhaps
we can use the same one in both cases?

--nX

> Thanks,
> Qu
>
> >
> > Signed-off-by: Josef Bacik <josef@...icpanda.com>
> > ---
> > No code changes other than context since v5.
> > ---
> >   fs/btrfs/bio.c       | 10 ++++++++++
> >   fs/btrfs/bio.h       |  2 ++
> >   fs/btrfs/file-item.c |  2 +-
> >   3 files changed, 13 insertions(+), 1 deletion(-)
> >
> > diff --git a/fs/btrfs/bio.c b/fs/btrfs/bio.c
> > index a69174b2b6b6..aba452dd9904 100644
> > --- a/fs/btrfs/bio.c
> > +++ b/fs/btrfs/bio.c
> > @@ -94,6 +94,8 @@ static struct btrfs_bio *btrfs_split_bio(struct btrfs_fs_info *fs_info,
> >       if (bbio_has_ordered_extent(bbio)) {
> >               refcount_inc(&orig_bbio->ordered->refs);
> >               bbio->ordered = orig_bbio->ordered;
> > +             bbio->orig_logical = orig_bbio->orig_logical;
> > +             orig_bbio->orig_logical += map_length;
> >       }
> >       bbio->csum_search_commit_root = orig_bbio->csum_search_commit_root;
> >       atomic_inc(&orig_bbio->pending_ios);
> > @@ -726,6 +728,14 @@ static bool btrfs_submit_chunk(struct btrfs_bio *bbio, int mirror_num)
> >               goto end_bbio;
> >       }
> >
> > +     /*
> > +      * For fscrypt writes we will get the encrypted bio after we've
> > +      * remapped our bio to the physical disk location, so we need to
> > +      * save the original bytenr so we know what we're checksumming.
> > +      */
> > +     if (bio_op(bio) == REQ_OP_WRITE && is_data_bbio(bbio))
> > +             bbio->orig_logical = logical;
> > +
> >       map_length = min(map_length, length);
> >       if (use_append)
> >               map_length = btrfs_append_map_length(bbio, map_length);
> > diff --git a/fs/btrfs/bio.h b/fs/btrfs/bio.h
> > index c5a6c66d51a0..5015e327dbd9 100644
> > --- a/fs/btrfs/bio.h
> > +++ b/fs/btrfs/bio.h
> > @@ -52,6 +52,7 @@ struct btrfs_bio {
> >                * - pointer to the checksums for this bio
> >                * - original physical address from the allocator
> >                *   (for zone append only)
> > +              * - original logical address, used for checksumming fscrypt bios.
> >                */
> >               struct {
> >                       struct btrfs_ordered_extent *ordered;
> > @@ -61,6 +62,7 @@ struct btrfs_bio {
> >                       struct bio *csum_bio;
> >                       struct bvec_iter csum_saved_iter;
> >                       u64 orig_physical;
> > +                     u64 orig_logical;
> >               };
> >
> >               /* For metadata reads: parentness verification. */
> > diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c
> > index 474949074da8..d2ecd26727ac 100644
> > --- a/fs/btrfs/file-item.c
> > +++ b/fs/btrfs/file-item.c
> > @@ -812,7 +812,7 @@ int btrfs_csum_one_bio(struct btrfs_bio *bbio, struct bio *bio, bool async)
> >       if (!sums)
> >               return -ENOMEM;
> >
> > -     sums->logical = bio->bi_iter.bi_sector << SECTOR_SHIFT;
> > +     sums->logical = bbio->orig_logical;
> >       sums->len = bio->bi_iter.bi_size;
> >       INIT_LIST_HEAD(&sums->list);
> >       bbio->sums = sums;
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ