mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-02 07:11:12 +00:00
f2fs: fix livelock calling f2fs_iget during f2fs_evict_inode
In f2fs_evict_inode, commit_inmemory_pages f2fs_gc f2fs_iget iget_locked -> wait for inode free Here, if the inode is same as the one to be evicted, f2fs should wait forever. Actually, we should not call f2fs_balance_fs during f2fs_evict_inode to avoid this. But, the commit_inmem_pages calls f2fs_balance_fs by default, even if f2fs_evict_inode wants to free inmemory pages only. Hence, this patch adds to trigger f2fs_balance_fs only when there is something to write. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
9486ba442b
commit
0341845efc
@ -230,7 +230,16 @@ void commit_inmem_pages(struct inode *inode, bool abort)
|
|||||||
.rw = WRITE_SYNC,
|
.rw = WRITE_SYNC,
|
||||||
};
|
};
|
||||||
|
|
||||||
f2fs_balance_fs(sbi);
|
/*
|
||||||
|
* The abort is true only when f2fs_evict_inode is called.
|
||||||
|
* Basically, the f2fs_evict_inode doesn't produce any data writes, so
|
||||||
|
* that we don't need to call f2fs_balance_fs.
|
||||||
|
* Otherwise, f2fs_gc in f2fs_balance_fs can wait forever until this
|
||||||
|
* inode becomes free by iget_locked in f2fs_iget.
|
||||||
|
*/
|
||||||
|
if (!abort)
|
||||||
|
f2fs_balance_fs(sbi);
|
||||||
|
|
||||||
f2fs_lock_op(sbi);
|
f2fs_lock_op(sbi);
|
||||||
|
|
||||||
mutex_lock(&fi->inmem_lock);
|
mutex_lock(&fi->inmem_lock);
|
||||||
|
Loading…
Reference in New Issue
Block a user