* [PATCH 3/3] xfs: stop using set_blocksize
2025-04-21 17:18 [PATCHSET V2] block/xfs: bdev page cache bug fixes for 6.15 Darrick J. Wong
@ 2025-04-21 17:19 ` Darrick J. Wong
0 siblings, 0 replies; 10+ messages in thread
From: Darrick J. Wong @ 2025-04-21 17:19 UTC (permalink / raw)
To: djwong, cem, axboe
Cc: shinichiro.kawasaki, linux-mm, mcgrof, linux-fsdevel, linux-xfs,
willy, hch, linux-block
From: Darrick J. Wong <djwong@kernel.org>
XFS has its own buffer cache for metadata that uses submit_bio, which
means that it no longer uses the block device pagecache for anything.
Create a more lightweight helper that runs the blocksize checks and
flushes dirty data and use that instead. No more truncating the
pagecache because XFS does not use it or care about it.
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
---
fs/xfs/xfs_buf.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index 1a2b3f06fa717e..5ae77ffdc947b1 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -1719,18 +1719,25 @@ xfs_setsize_buftarg(
struct xfs_buftarg *btp,
unsigned int sectorsize)
{
+ int error;
+
/* Set up metadata sector size info */
btp->bt_meta_sectorsize = sectorsize;
btp->bt_meta_sectormask = sectorsize - 1;
- if (set_blocksize(btp->bt_bdev_file, sectorsize)) {
+ error = bdev_validate_blocksize(btp->bt_bdev, sectorsize);
+ if (error) {
xfs_warn(btp->bt_mount,
- "Cannot set_blocksize to %u on device %pg",
- sectorsize, btp->bt_bdev);
+ "Cannot use blocksize %u on device %pg, err %d",
+ sectorsize, btp->bt_bdev, error);
return -EINVAL;
}
- return 0;
+ /*
+ * Flush the block device pagecache so our bios see anything dirtied
+ * before mount.
+ */
+ return sync_blockdev(btp->bt_bdev);
}
int
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCHSET V3] block/xfs: bdev page cache bug fixes for 6.15
@ 2025-04-22 1:18 Darrick J. Wong
2025-04-22 1:18 ` [PATCH 1/3] block: fix race between set_blocksize and read paths Darrick J. Wong
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Darrick J. Wong @ 2025-04-22 1:18 UTC (permalink / raw)
To: cem, axboe, djwong
Cc: hch, mcgrof, linux-fsdevel, mcgrof, linux-block,
shinichiro.kawasaki, linux-xfs, hch, willy
Hi all,
Here are a handful of bugfixes for 6.15. The first patch fixes a race
between set_blocksize and block device pagecache manipulation; the rest
removes XFS' usage of set_blocksize since it's unnecessary.
v1: clean up into something reviewable
v2: split block and xfs patches, add reviews
v3: rebase to 6.15-rc3, no other dependencies
If you're going to start using this code, I strongly recommend pulling
from my git trees, which are linked below.
With a bit of luck, this should all go splendidly.
Comments and questions are, as always, welcome.
--D
kernel git tree:
https://git.kernel.org/cgit/linux/kernel/git/djwong/xfs-linux.git/log/?h=bdev-fixes-6.15
---
Commits in this patchset:
* block: fix race between set_blocksize and read paths
* block: hoist block size validation code to a separate function
* xfs: stop using set_blocksize
---
include/linux/blkdev.h | 1 +
block/bdev.c | 50 ++++++++++++++++++++++++++++++++++++++++++------
block/blk-zoned.c | 5 ++++-
block/fops.c | 16 +++++++++++++++
block/ioctl.c | 6 ++++++
fs/xfs/xfs_buf.c | 15 +++++++++++---
6 files changed, 82 insertions(+), 11 deletions(-)
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/3] block: fix race between set_blocksize and read paths
2025-04-22 1:18 [PATCHSET V3] block/xfs: bdev page cache bug fixes for 6.15 Darrick J. Wong
@ 2025-04-22 1:18 ` Darrick J. Wong
2025-04-22 7:21 ` Shinichiro Kawasaki
2025-04-22 1:18 ` [PATCH 2/3] block: hoist block size validation code to a separate function Darrick J. Wong
2025-04-22 1:19 ` [PATCH 3/3] xfs: stop using set_blocksize Darrick J. Wong
2 siblings, 1 reply; 10+ messages in thread
From: Darrick J. Wong @ 2025-04-22 1:18 UTC (permalink / raw)
To: cem, axboe, djwong
Cc: hch, mcgrof, linux-fsdevel, mcgrof, linux-block,
shinichiro.kawasaki, linux-xfs, hch, willy
From: Darrick J. Wong <djwong@kernel.org>
With the new large sector size support, it's now the case that
set_blocksize can change i_blksize and the folio order in a manner that
conflicts with a concurrent reader and causes a kernel crash.
Specifically, let's say that udev-worker calls libblkid to detect the
labels on a block device. The read call can create an order-0 folio to
read the first 4096 bytes from the disk. But then udev is preempted.
Next, someone tries to mount an 8k-sectorsize filesystem from the same
block device. The filesystem calls set_blksize, which sets i_blksize to
8192 and the minimum folio order to 1.
Now udev resumes, still holding the order-0 folio it allocated. It then
tries to schedule a read bio and do_mpage_readahead tries to create
bufferheads for the folio. Unfortunately, blocks_per_folio == 0 because
the page size is 4096 but the blocksize is 8192 so no bufferheads are
attached and the bh walk never sets bdev. We then submit the bio with a
NULL block device and crash.
Therefore, truncate the page cache after flushing but before updating
i_blksize. However, that's not enough -- we also need to lock out file
IO and page faults during the update. Take both the i_rwsem and the
invalidate_lock in exclusive mode for invalidations, and in shared mode
for read/write operations.
I don't know if this is the correct fix, but xfs/259 found it.
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
---
block/bdev.c | 17 +++++++++++++++++
block/blk-zoned.c | 5 ++++-
block/fops.c | 16 ++++++++++++++++
block/ioctl.c | 6 ++++++
4 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/block/bdev.c b/block/bdev.c
index 6a34179192c913..04808632f8dab4 100644
--- a/block/bdev.c
+++ b/block/bdev.c
@@ -169,10 +169,27 @@ int set_blocksize(struct file *file, int size)
/* Don't change the size if it is same as current */
if (inode->i_blkbits != blksize_bits(size)) {
+ /*
+ * Flush and truncate the pagecache before we reconfigure the
+ * mapping geometry because folio sizes are variable now. If a
+ * reader has already allocated a folio whose size is smaller
+ * than the new min_order but invokes readahead after the new
+ * min_order becomes visible, readahead will think there are
+ * "zero" blocks per folio and crash. Take the inode and
+ * invalidation locks to avoid racing with
+ * read/write/fallocate.
+ */
+ inode_lock(inode);
+ filemap_invalidate_lock(inode->i_mapping);
+
sync_blockdev(bdev);
+ kill_bdev(bdev);
+
inode->i_blkbits = blksize_bits(size);
mapping_set_folio_min_order(inode->i_mapping, get_order(size));
kill_bdev(bdev);
+ filemap_invalidate_unlock(inode->i_mapping);
+ inode_unlock(inode);
}
return 0;
}
diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index 0c77244a35c92e..8f15d1aa6eb89a 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -343,6 +343,7 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode,
op = REQ_OP_ZONE_RESET;
/* Invalidate the page cache, including dirty pages. */
+ inode_lock(bdev->bd_mapping->host);
filemap_invalidate_lock(bdev->bd_mapping);
ret = blkdev_truncate_zone_range(bdev, mode, &zrange);
if (ret)
@@ -364,8 +365,10 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode,
ret = blkdev_zone_mgmt(bdev, op, zrange.sector, zrange.nr_sectors);
fail:
- if (cmd == BLKRESETZONE)
+ if (cmd == BLKRESETZONE) {
filemap_invalidate_unlock(bdev->bd_mapping);
+ inode_unlock(bdev->bd_mapping->host);
+ }
return ret;
}
diff --git a/block/fops.c b/block/fops.c
index be9f1dbea9ce0a..e221fdcaa8aaf8 100644
--- a/block/fops.c
+++ b/block/fops.c
@@ -746,7 +746,14 @@ static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
ret = direct_write_fallback(iocb, from, ret,
blkdev_buffered_write(iocb, from));
} else {
+ /*
+ * Take i_rwsem and invalidate_lock to avoid racing with
+ * set_blocksize changing i_blkbits/folio order and punching
+ * out the pagecache.
+ */
+ inode_lock_shared(bd_inode);
ret = blkdev_buffered_write(iocb, from);
+ inode_unlock_shared(bd_inode);
}
if (ret > 0)
@@ -757,6 +764,7 @@ static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
{
+ struct inode *bd_inode = bdev_file_inode(iocb->ki_filp);
struct block_device *bdev = I_BDEV(iocb->ki_filp->f_mapping->host);
loff_t size = bdev_nr_bytes(bdev);
loff_t pos = iocb->ki_pos;
@@ -793,7 +801,13 @@ static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
goto reexpand;
}
+ /*
+ * Take i_rwsem and invalidate_lock to avoid racing with set_blocksize
+ * changing i_blkbits/folio order and punching out the pagecache.
+ */
+ inode_lock_shared(bd_inode);
ret = filemap_read(iocb, to, ret);
+ inode_unlock_shared(bd_inode);
reexpand:
if (unlikely(shorted))
@@ -836,6 +850,7 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start,
if ((start | len) & (bdev_logical_block_size(bdev) - 1))
return -EINVAL;
+ inode_lock(inode);
filemap_invalidate_lock(inode->i_mapping);
/*
@@ -868,6 +883,7 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start,
fail:
filemap_invalidate_unlock(inode->i_mapping);
+ inode_unlock(inode);
return error;
}
diff --git a/block/ioctl.c b/block/ioctl.c
index faa40f383e2736..e472cc1030c60c 100644
--- a/block/ioctl.c
+++ b/block/ioctl.c
@@ -142,6 +142,7 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
if (err)
return err;
+ inode_lock(bdev->bd_mapping->host);
filemap_invalidate_lock(bdev->bd_mapping);
err = truncate_bdev_range(bdev, mode, start, start + len - 1);
if (err)
@@ -174,6 +175,7 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
blk_finish_plug(&plug);
fail:
filemap_invalidate_unlock(bdev->bd_mapping);
+ inode_unlock(bdev->bd_mapping->host);
return err;
}
@@ -199,12 +201,14 @@ static int blk_ioctl_secure_erase(struct block_device *bdev, blk_mode_t mode,
end > bdev_nr_bytes(bdev))
return -EINVAL;
+ inode_lock(bdev->bd_mapping->host);
filemap_invalidate_lock(bdev->bd_mapping);
err = truncate_bdev_range(bdev, mode, start, end - 1);
if (!err)
err = blkdev_issue_secure_erase(bdev, start >> 9, len >> 9,
GFP_KERNEL);
filemap_invalidate_unlock(bdev->bd_mapping);
+ inode_unlock(bdev->bd_mapping->host);
return err;
}
@@ -236,6 +240,7 @@ static int blk_ioctl_zeroout(struct block_device *bdev, blk_mode_t mode,
return -EINVAL;
/* Invalidate the page cache, including dirty pages */
+ inode_lock(bdev->bd_mapping->host);
filemap_invalidate_lock(bdev->bd_mapping);
err = truncate_bdev_range(bdev, mode, start, end);
if (err)
@@ -246,6 +251,7 @@ static int blk_ioctl_zeroout(struct block_device *bdev, blk_mode_t mode,
fail:
filemap_invalidate_unlock(bdev->bd_mapping);
+ inode_unlock(bdev->bd_mapping->host);
return err;
}
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/3] block: hoist block size validation code to a separate function
2025-04-22 1:18 [PATCHSET V3] block/xfs: bdev page cache bug fixes for 6.15 Darrick J. Wong
2025-04-22 1:18 ` [PATCH 1/3] block: fix race between set_blocksize and read paths Darrick J. Wong
@ 2025-04-22 1:18 ` Darrick J. Wong
2025-04-22 4:19 ` Christoph Hellwig
2025-04-22 1:19 ` [PATCH 3/3] xfs: stop using set_blocksize Darrick J. Wong
2 siblings, 1 reply; 10+ messages in thread
From: Darrick J. Wong @ 2025-04-22 1:18 UTC (permalink / raw)
To: cem, axboe, djwong
Cc: mcgrof, linux-fsdevel, mcgrof, linux-block, shinichiro.kawasaki,
linux-xfs, hch, willy
From: Darrick J. Wong <djwong@kernel.org>
Hoist the block size validation code to bdev_validate_blocksize so that
we can call it from filesystems that don't care about the bdev pagecache
manipulations of set_blocksize.
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
---
include/linux/blkdev.h | 1 +
block/bdev.c | 33 +++++++++++++++++++++++++++------
2 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 678dc38442bfdd..f704d7ae72cfa3 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -1614,6 +1614,7 @@ static inline void bio_end_io_acct(struct bio *bio, unsigned long start_time)
return bio_end_io_acct_remapped(bio, start_time, bio->bi_bdev);
}
+int bdev_validate_blocksize(struct block_device *bdev, int block_size);
int set_blocksize(struct file *file, int size);
int lookup_bdev(const char *pathname, dev_t *dev);
diff --git a/block/bdev.c b/block/bdev.c
index 04808632f8dab4..83da12349c689d 100644
--- a/block/bdev.c
+++ b/block/bdev.c
@@ -152,17 +152,38 @@ static void set_init_blocksize(struct block_device *bdev)
get_order(bsize));
}
+/**
+ * bdev_validate_blocksize - check that this block size is acceptable
+ * @bdev: blockdevice to check
+ * @block_size: block size to check
+ *
+ * For block device users that do not use buffer heads or the block device
+ * page cache, make sure that this block size can be used with the device.
+ *
+ * Return: On success zero is returned, negative error code on failure.
+ */
+int bdev_validate_blocksize(struct block_device *bdev, int block_size)
+{
+ if (blk_validate_block_size(block_size))
+ return -EINVAL;
+
+ /* Size cannot be smaller than the size supported by the device */
+ if (block_size < bdev_logical_block_size(bdev))
+ return -EINVAL;
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(bdev_validate_blocksize);
+
int set_blocksize(struct file *file, int size)
{
struct inode *inode = file->f_mapping->host;
struct block_device *bdev = I_BDEV(inode);
+ int ret;
- if (blk_validate_block_size(size))
- return -EINVAL;
-
- /* Size cannot be smaller than the size supported by the device */
- if (size < bdev_logical_block_size(bdev))
- return -EINVAL;
+ ret = bdev_validate_blocksize(bdev, size);
+ if (ret)
+ return ret;
if (!file->private_data)
return -EINVAL;
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/3] xfs: stop using set_blocksize
2025-04-22 1:18 [PATCHSET V3] block/xfs: bdev page cache bug fixes for 6.15 Darrick J. Wong
2025-04-22 1:18 ` [PATCH 1/3] block: fix race between set_blocksize and read paths Darrick J. Wong
2025-04-22 1:18 ` [PATCH 2/3] block: hoist block size validation code to a separate function Darrick J. Wong
@ 2025-04-22 1:19 ` Darrick J. Wong
2025-04-22 4:19 ` Christoph Hellwig
2 siblings, 1 reply; 10+ messages in thread
From: Darrick J. Wong @ 2025-04-22 1:19 UTC (permalink / raw)
To: cem, axboe, djwong
Cc: mcgrof, linux-fsdevel, mcgrof, linux-block, shinichiro.kawasaki,
linux-xfs, hch, willy
From: Darrick J. Wong <djwong@kernel.org>
XFS has its own buffer cache for metadata that uses submit_bio, which
means that it no longer uses the block device pagecache for anything.
Create a more lightweight helper that runs the blocksize checks and
flushes dirty data and use that instead. No more truncating the
pagecache because XFS does not use it or care about it.
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
---
fs/xfs/xfs_buf.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index 1a2b3f06fa717e..5ae77ffdc947b1 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -1719,18 +1719,25 @@ xfs_setsize_buftarg(
struct xfs_buftarg *btp,
unsigned int sectorsize)
{
+ int error;
+
/* Set up metadata sector size info */
btp->bt_meta_sectorsize = sectorsize;
btp->bt_meta_sectormask = sectorsize - 1;
- if (set_blocksize(btp->bt_bdev_file, sectorsize)) {
+ error = bdev_validate_blocksize(btp->bt_bdev, sectorsize);
+ if (error) {
xfs_warn(btp->bt_mount,
- "Cannot set_blocksize to %u on device %pg",
- sectorsize, btp->bt_bdev);
+ "Cannot use blocksize %u on device %pg, err %d",
+ sectorsize, btp->bt_bdev, error);
return -EINVAL;
}
- return 0;
+ /*
+ * Flush the block device pagecache so our bios see anything dirtied
+ * before mount.
+ */
+ return sync_blockdev(btp->bt_bdev);
}
int
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 2/3] block: hoist block size validation code to a separate function
2025-04-22 1:18 ` [PATCH 2/3] block: hoist block size validation code to a separate function Darrick J. Wong
@ 2025-04-22 4:19 ` Christoph Hellwig
0 siblings, 0 replies; 10+ messages in thread
From: Christoph Hellwig @ 2025-04-22 4:19 UTC (permalink / raw)
To: Darrick J. Wong
Cc: cem, axboe, mcgrof, linux-fsdevel, linux-block,
shinichiro.kawasaki, linux-xfs, hch, willy
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 3/3] xfs: stop using set_blocksize
2025-04-22 1:19 ` [PATCH 3/3] xfs: stop using set_blocksize Darrick J. Wong
@ 2025-04-22 4:19 ` Christoph Hellwig
0 siblings, 0 replies; 10+ messages in thread
From: Christoph Hellwig @ 2025-04-22 4:19 UTC (permalink / raw)
To: Darrick J. Wong
Cc: cem, axboe, mcgrof, linux-fsdevel, linux-block,
shinichiro.kawasaki, linux-xfs, hch, willy
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/3] block: fix race between set_blocksize and read paths
2025-04-22 1:18 ` [PATCH 1/3] block: fix race between set_blocksize and read paths Darrick J. Wong
@ 2025-04-22 7:21 ` Shinichiro Kawasaki
0 siblings, 0 replies; 10+ messages in thread
From: Shinichiro Kawasaki @ 2025-04-22 7:21 UTC (permalink / raw)
To: Darrick J. Wong
Cc: cem@kernel.org, axboe@kernel.dk, hch, mcgrof@kernel.org,
linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org,
linux-xfs@vger.kernel.org, hch@infradead.org, willy@infradead.org
On Apr 21, 2025 / 18:18, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
>
> With the new large sector size support, it's now the case that
> set_blocksize can change i_blksize and the folio order in a manner that
> conflicts with a concurrent reader and causes a kernel crash.
>
> Specifically, let's say that udev-worker calls libblkid to detect the
> labels on a block device. The read call can create an order-0 folio to
> read the first 4096 bytes from the disk. But then udev is preempted.
>
> Next, someone tries to mount an 8k-sectorsize filesystem from the same
> block device. The filesystem calls set_blksize, which sets i_blksize to
> 8192 and the minimum folio order to 1.
>
> Now udev resumes, still holding the order-0 folio it allocated. It then
> tries to schedule a read bio and do_mpage_readahead tries to create
> bufferheads for the folio. Unfortunately, blocks_per_folio == 0 because
> the page size is 4096 but the blocksize is 8192 so no bufferheads are
> attached and the bh walk never sets bdev. We then submit the bio with a
> NULL block device and crash.
>
> Therefore, truncate the page cache after flushing but before updating
> i_blksize. However, that's not enough -- we also need to lock out file
> IO and page faults during the update. Take both the i_rwsem and the
> invalidate_lock in exclusive mode for invalidations, and in shared mode
> for read/write operations.
>
> I don't know if this is the correct fix, but xfs/259 found it.
>
> Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
> Reviewed-by: Christoph Hellwig <hch@lst.de>
> Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
Thanks. I confirmed that this patch avoids the hang recreated by the new
blktests test case [1]. I also ran whole blktests and observed no regression.
Tested-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
[1] https://lore.kernel.org/linux-block/20250418075431.1851353-1-shinichiro.kawasaki@wdc.com/
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/3] xfs: stop using set_blocksize
2025-04-23 19:53 [PATCHSET V4] block/xfs: bdev page cache bug fixes for 6.15 Darrick J. Wong
@ 2025-04-23 19:54 ` Darrick J. Wong
2025-04-29 9:33 ` Carlos Maiolino
0 siblings, 1 reply; 10+ messages in thread
From: Darrick J. Wong @ 2025-04-23 19:54 UTC (permalink / raw)
To: cem, djwong, axboe
Cc: hch, mcgrof, hch, willy, linux-xfs, linux-fsdevel,
shinichiro.kawasaki, linux-block, mcgrof
From: Darrick J. Wong <djwong@kernel.org>
XFS has its own buffer cache for metadata that uses submit_bio, which
means that it no longer uses the block device pagecache for anything.
Create a more lightweight helper that runs the blocksize checks and
flushes dirty data and use that instead. No more truncating the
pagecache because XFS does not use it or care about it.
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
---
fs/xfs/xfs_buf.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index 1a2b3f06fa717e..5ae77ffdc947b1 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -1719,18 +1719,25 @@ xfs_setsize_buftarg(
struct xfs_buftarg *btp,
unsigned int sectorsize)
{
+ int error;
+
/* Set up metadata sector size info */
btp->bt_meta_sectorsize = sectorsize;
btp->bt_meta_sectormask = sectorsize - 1;
- if (set_blocksize(btp->bt_bdev_file, sectorsize)) {
+ error = bdev_validate_blocksize(btp->bt_bdev, sectorsize);
+ if (error) {
xfs_warn(btp->bt_mount,
- "Cannot set_blocksize to %u on device %pg",
- sectorsize, btp->bt_bdev);
+ "Cannot use blocksize %u on device %pg, err %d",
+ sectorsize, btp->bt_bdev, error);
return -EINVAL;
}
- return 0;
+ /*
+ * Flush the block device pagecache so our bios see anything dirtied
+ * before mount.
+ */
+ return sync_blockdev(btp->bt_bdev);
}
int
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 3/3] xfs: stop using set_blocksize
2025-04-23 19:54 ` [PATCH 3/3] xfs: stop using set_blocksize Darrick J. Wong
@ 2025-04-29 9:33 ` Carlos Maiolino
0 siblings, 0 replies; 10+ messages in thread
From: Carlos Maiolino @ 2025-04-29 9:33 UTC (permalink / raw)
To: axboe, Darrick J. Wong
Cc: hch, mcgrof, hch, willy, linux-xfs, linux-fsdevel,
shinichiro.kawasaki, linux-block, mcgrof
On Wed, 23 Apr 2025 12:54:13 -0700, Darrick J. Wong wrote:
> XFS has its own buffer cache for metadata that uses submit_bio, which
> means that it no longer uses the block device pagecache for anything.
> Create a more lightweight helper that runs the blocksize checks and
> flushes dirty data and use that instead. No more truncating the
> pagecache because XFS does not use it or care about it.
>
>
> [...]
Applied to for-next, thanks!
[3/3] xfs: stop using set_blocksize
commit: 5088aad3d32cc0b1c96cbe3e718569ffc0aca4ba
Best regards,
--
Carlos Maiolino <cem@kernel.org>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2025-04-29 9:33 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-22 1:18 [PATCHSET V3] block/xfs: bdev page cache bug fixes for 6.15 Darrick J. Wong
2025-04-22 1:18 ` [PATCH 1/3] block: fix race between set_blocksize and read paths Darrick J. Wong
2025-04-22 7:21 ` Shinichiro Kawasaki
2025-04-22 1:18 ` [PATCH 2/3] block: hoist block size validation code to a separate function Darrick J. Wong
2025-04-22 4:19 ` Christoph Hellwig
2025-04-22 1:19 ` [PATCH 3/3] xfs: stop using set_blocksize Darrick J. Wong
2025-04-22 4:19 ` Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2025-04-23 19:53 [PATCHSET V4] block/xfs: bdev page cache bug fixes for 6.15 Darrick J. Wong
2025-04-23 19:54 ` [PATCH 3/3] xfs: stop using set_blocksize Darrick J. Wong
2025-04-29 9:33 ` Carlos Maiolino
2025-04-21 17:18 [PATCHSET V2] block/xfs: bdev page cache bug fixes for 6.15 Darrick J. Wong
2025-04-21 17:19 ` [PATCH 3/3] xfs: stop using set_blocksize Darrick J. Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).