Otherwise, we will get a deadlock. [freeze test] shrinkder freeze_super - pwercpu_down_write(SB_FREEZE_FS) - super_cache_scan - down_read(&sb->s_umount) - prune_icache_sb - dispose_list - evict - f2fs_evict_inode thaw_super - down_write(&sb->s_umount); - __percpu_down_read(SB_FREEZE_FS) Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx> --- fs/super.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/super.c b/fs/super.c index 7af820ba5ad5..f7303d91f874 100644 --- a/fs/super.c +++ b/fs/super.c @@ -79,6 +79,12 @@ static unsigned long super_cache_scan(struct shrinker *shrink, if (!trylock_super(sb)) return SHRINK_STOP; + /* This prevents inode eviction that requires SB_FREEZE_FS. */ + if (sb->s_writers.frozen == SB_FREEZE_FS) { + up_read(&sb->s_umount); + return SHRINK_STOP; + } + if (sb->s_op->nr_cached_objects) fs_objects = sb->s_op->nr_cached_objects(sb, sc); -- 2.35.1.616.g0bdcbb4464-goog