Message ID | 20231211140833.975935-1-yukuai1@huaweicloud.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block: don't access bd_inode directly from other modules | expand |
On Mon 11-12-23 22:08:33, Yu Kuai wrote: > From: Yu Kuai <yukuai3@huawei.com> > > block_device_ejected() is added by commit bdfe0cbd746a ("Revert > "ext4: remove block_device_ejected"") in 2015. At that time 'bdi->wb' > is destroyed synchronized from del_gendisk(), hence if ext4 is still > mounted, and then mark_buffer_dirty() will reference destroyed 'wb'. > However, such problem doesn't exist anymore: > > - commit d03f6cdc1fc4 ("block: Dynamically allocate and refcount > backing_dev_info") switch bdi to use refcounting; > - commit 13eec2363ef0 ("fs: Get proper reference for s_bdi"), will grab > additional reference of bdi while mounting, so that 'bdi->wb' will not > be destroyed until generic_shutdown_super(). > > Hence remove this dead function block_device_ejected(). > > Signed-off-by: Yu Kuai <yukuai3@huawei.com> Agreed, this should not be needed anymore. We'll see whether this is true also in practice :). Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index ae41204f52d4..3b5e2b557488 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -467,22 +467,6 @@ static void ext4_maybe_update_superblock(struct super_block *sb) schedule_work(&EXT4_SB(sb)->s_sb_upd_work); } -/* - * The del_gendisk() function uninitializes the disk-specific data - * structures, including the bdi structure, without telling anyone - * else. Once this happens, any attempt to call mark_buffer_dirty() - * (for example, by ext4_commit_super), will cause a kernel OOPS. - * This is a kludge to prevent these oops until we can put in a proper - * hook in del_gendisk() to inform the VFS and file system layers. - */ -static int block_device_ejected(struct super_block *sb) -{ - struct inode *bd_inode = sb->s_bdev->bd_inode; - struct backing_dev_info *bdi = inode_to_bdi(bd_inode); - - return bdi->dev == NULL; -} - static void ext4_journal_commit_callback(journal_t *journal, transaction_t *txn) { struct super_block *sb = journal->j_private; @@ -6162,8 +6146,6 @@ static int ext4_commit_super(struct super_block *sb) if (!sbh) return -EINVAL; - if (block_device_ejected(sb)) - return -ENODEV; ext4_update_super(sb);