Skip to content

Commit 72dbcf7

Browse files
committed
Revert "ext4: make __ext4_get_inode_loc plug"
This reverts commit b03755a. 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 c6e9d6f ("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. Reported-by: Ahmed S. Darwish <[email protected]> Cc: Ted Ts'o <[email protected]> Cc: Willy Tarreau <[email protected]> Cc: Alexander E. Patrakov <[email protected]> Cc: Lennart Poettering <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 1609d76 commit 72dbcf7

File tree

1 file changed

+0
-3
lines changed

1 file changed

+0
-3
lines changed

fs/ext4/inode.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4586,7 +4586,6 @@ static int __ext4_get_inode_loc(struct inode *inode,
45864586
struct buffer_head *bh;
45874587
struct super_block *sb = inode->i_sb;
45884588
ext4_fsblk_t block;
4589-
struct blk_plug plug;
45904589
int inodes_per_block, inode_offset;
45914590

45924591
iloc->bh = NULL;
@@ -4675,7 +4674,6 @@ static int __ext4_get_inode_loc(struct inode *inode,
46754674
* If we need to do any I/O, try to pre-readahead extra
46764675
* blocks from the inode table.
46774676
*/
4678-
blk_start_plug(&plug);
46794677
if (EXT4_SB(sb)->s_inode_readahead_blks) {
46804678
ext4_fsblk_t b, end, table;
46814679
unsigned num;
@@ -4706,7 +4704,6 @@ static int __ext4_get_inode_loc(struct inode *inode,
47064704
get_bh(bh);
47074705
bh->b_end_io = end_buffer_read_sync;
47084706
submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh);
4709-
blk_finish_plug(&plug);
47104707
wait_on_buffer(bh);
47114708
if (!buffer_uptodate(bh)) {
47124709
EXT4_ERROR_INODE_BLOCK(inode, block,

0 commit comments

Comments
 (0)