History

Revert "ext4: make __ext4_get_inode_loc plug"

This reverts commit b03755ad6f33b7b8cd7312a3596a2dbf496de6e7. This is sad, and done for all the wrong reasons. Because that commit is good, and does exactly what it says: avoids a lot of small disk requests for the inode table read-ahead. However, it turns out that it causes an entirely unrelated problem: the getrandom() system call was introduced back in 2014 by commit c6e9d6f38894 ("random: introduce getrandom(2) system call"), and people use it as a convenient source of good random numbers. But part of the current semantics for getrandom() is that it waits for the entropy pool to fill at least partially (unlike /dev/urandom). And at least ArchLinux apparently has a systemd that uses getrandom() at boot time, and the improvements in IO patterns means that existing installations suddenly start hanging, waiting for entropy that will never happen. It seems to be an unlucky combination of not _quite_ enough entropy, together with a particular systemd version and configuration. Lennart says that the systemd-random-seed process (which is what does this early access) is supposed to not block any other boot activity, but sadly that doesn't actually seem to be the case (possibly due bogus dependencies on cryptsetup for encrypted swapspace). The correct fix is to fix getrandom() to not block when it's not appropriate, but that fix is going to take a lot more discussion. Do we just make it act like /dev/urandom by default, and add a new flag for "wait for entropy"? Do we add a boot-time option? Or do we just limit the amount of time it will wait for entropy? So in the meantime, we do the revert to give us time to discuss the eventual fix for the fundamental problem, at which point we can re-apply the ext4 inode table access optimization.

Linus Torvalds committed 7 years ago

Commit 72dbcf71 parent 1609d761 file · +0 −3Browse files

Unified · Split

fs/ext4/inode.c+0−3
@@ -4586,7 +4586,6 @@ static int __ext4_get_inode_loc(struct inode *inode, · 4585 unmodified lines
4586 struct buffer_head *bh;4586 struct buffer_head *bh;
4587 struct super_block *sb = inode->i_sb;4587 struct super_block *sb = inode->i_sb;
4588 ext4_fsblk_t block;4588 ext4_fsblk_t block;
4589 struct blk_plug plug;
4590 int inodes_per_block, inode_offset;4589 int inodes_per_block, inode_offset;
4591 4590
4592 iloc->bh = NULL;4591 iloc->bh = NULL;
@@ -4675,7 +4674,6 @@ make_io: · 82 unmodified lines
4675 * If we need to do any I/O, try to pre-readahead extra4674 * If we need to do any I/O, try to pre-readahead extra
4676 * blocks from the inode table.4675 * blocks from the inode table.
4677 */4676 */
4678 blk_start_plug(&plug);
4679 if (EXT4_SB(sb)->s_inode_readahead_blks) {4677 if (EXT4_SB(sb)->s_inode_readahead_blks) {
4680 ext4_fsblk_t b, end, table;4678 ext4_fsblk_t b, end, table;
4681 unsigned num;4679 unsigned num;
@@ -4706,7 +4704,6 @@ make_io: · 24 unmodified lines
4706 get_bh(bh);4704 get_bh(bh);
4707 bh->b_end_io = end_buffer_read_sync;4705 bh->b_end_io = end_buffer_read_sync;
4708 submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh);4706 submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh);
4709 blk_finish_plug(&plug);
4710 wait_on_buffer(bh);4707 wait_on_buffer(bh);
4711 if (!buffer_uptodate(bh)) {4708 if (!buffer_uptodate(bh)) {
4712 EXT4_ERROR_INODE_BLOCK(inode, block,4709 EXT4_ERROR_INODE_BLOCK(inode, block,