diff options
author | Christoph Hellwig <hch@lst.de> | 2023-08-07 14:26:22 +0300 |
---|---|---|
committer | Christian Brauner <brauner@kernel.org> | 2023-08-09 09:16:55 +0300 |
commit | 4b2201dad26742c92decd920471b7185088624f5 (patch) | |
tree | fb19147d533db4e1e72df07aadd0c482bd7a5580 /fs/buffer.c | |
parent | 06c2afb862f9da8dc5efa4b6076a0e48c3fbaaa5 (diff) | |
download | linux-4b2201dad26742c92decd920471b7185088624f5.tar.xz |
fs: stop using bdev->bd_super in mark_buffer_write_io_error
bdev->bd_super is a somewhat awkward backpointer from a block device to
an owning file system with unclear rules.
For the buffer_head code we already have a good backpointer for the
inode that the buffer_head is associated with, even if it lives on the
block device mapping: b_assoc_map. It is used track dirty buffers
associated with an inode but living on the block device mapping like
directory buffers in ext4.
mark_buffer_write_io_error already uses it for the call to
mapping_set_error, and should be doing the same for the per-sb error
sequence.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Message-Id: <20230807112625.652089-2-hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
Diffstat (limited to 'fs/buffer.c')
-rw-r--r-- | fs/buffer.c | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index bd091329026c..f36ef03c078a 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -1225,19 +1225,14 @@ EXPORT_SYMBOL(mark_buffer_dirty); void mark_buffer_write_io_error(struct buffer_head *bh) { - struct super_block *sb; - set_buffer_write_io_error(bh); /* FIXME: do we need to set this in both places? */ if (bh->b_folio && bh->b_folio->mapping) mapping_set_error(bh->b_folio->mapping, -EIO); - if (bh->b_assoc_map) + if (bh->b_assoc_map) { mapping_set_error(bh->b_assoc_map, -EIO); - rcu_read_lock(); - sb = READ_ONCE(bh->b_bdev->bd_super); - if (sb) - errseq_set(&sb->s_wb_err, -EIO); - rcu_read_unlock(); + errseq_set(&bh->b_assoc_map->host->i_sb->s_wb_err, -EIO); + } } EXPORT_SYMBOL(mark_buffer_write_io_error); |