Re: [PATCH v2] btrfs-progs: zoned: open host-managed devices with O_DIRECT for read-only
Qu Wenruo <[email protected]>
| Newsgroups | org.kernel.vger.linux-btrfs |
|---|---|
| Message-ID | <[email protected]> |
在 2026/7/16 20:58, Johannes Thumshirn 写道: > On host-managed zoned block devices the page cache cannot be used for > writing to the device because it does not guarantee ordering, therefore > direct I/O is used to write any on-disk data structures. > > But reading in btrfs-progs is still performed using buffered I/O. This > mix of direct and buffered I/O can lead to stale page cache entries > being handed off to btrfs-progs and tools like "btrfs check" can report > spurious errors like: > > checksum verify failed on <bytenr> wanted 0x00000000 found 0xb6bde3e4 > > even though both copies are intact on disk. > > Drop the O_RDWR condition so host-managed zoned devices always use > O_DIRECT, matching btrfstune. > > Signed-off-by: Johannes Thumshirn <[email protected]> Reviewed-by: Qu Wenruo <[email protected]> Thanks, Qu > --- > Changes to v1: > - reworded commit message > > kernel-shared/disk-io.c | 2 +- > kernel-shared/volumes.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c > index 7f87e567f0b1..8b9c6dcac967 100644 > --- a/kernel-shared/disk-io.c > +++ b/kernel-shared/disk-io.c > @@ -1722,7 +1722,7 @@ struct btrfs_fs_info *open_ctree_fs_info(struct open_ctree_args *oca) > if (!(oca->flags & OPEN_CTREE_WRITES)) > oflags = O_RDONLY; > > - if ((oflags & O_RDWR) && zoned_model(oca->filename) == ZONED_HOST_MANAGED) > + if (zoned_model(oca->filename) == ZONED_HOST_MANAGED) > oflags |= O_DIRECT; > > fp = open(oca->filename, oflags); > diff --git a/kernel-shared/volumes.c b/kernel-shared/volumes.c > index f35b59bcc20e..e2b6708ad872 100644 > --- a/kernel-shared/volumes.c > +++ b/kernel-shared/volumes.c > @@ -697,7 +697,7 @@ int btrfs_open_devices(struct btrfs_fs_info *fs_info, > continue; > } > > - if ((flags & O_RDWR) && zoned_model(device->name) == ZONED_HOST_MANAGED) > + if (zoned_model(device->name) == ZONED_HOST_MANAGED) > flags |= O_DIRECT; > > fd = open(device->name, flags); > -- > 2.54.0 > >