mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-29 20:32:39 -04: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:
@@ -230,7 +230,16 @@ void commit_inmem_pages(struct inode *inode, bool abort)
|
||||
.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);
|
||||
|
||||
mutex_lock(&fi->inmem_lock);
|
||||
|
||||
Reference in New Issue
Block a user