X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=fs%2Fdrop_caches.c;h=dc1a1d5d825b48de17f3192f8d0c50829dd07885;hb=4daeb71b89bd0fbabd30cf9b41da39be0bd7519e;hp=82377017130f0137a4208e0082bb61946cc0b817;hpb=2dcd9c71c1ffa9a036e09047f60e08383bb0abb6;p=mirror_ubuntu-bionic-kernel.git diff --git a/fs/drop_caches.c b/fs/drop_caches.c index 82377017130f..dc1a1d5d825b 100644 --- a/fs/drop_caches.c +++ b/fs/drop_caches.c @@ -21,8 +21,13 @@ static void drop_pagecache_sb(struct super_block *sb, void *unused) spin_lock(&sb->s_inode_list_lock); list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { spin_lock(&inode->i_lock); + /* + * We must skip inodes in unusual state. We may also skip + * inodes without pages but we deliberately won't in case + * we need to reschedule to avoid softlockups. + */ if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) || - (inode->i_mapping->nrpages == 0)) { + (inode->i_mapping->nrpages == 0 && !need_resched())) { spin_unlock(&inode->i_lock); continue; } @@ -34,6 +39,7 @@ static void drop_pagecache_sb(struct super_block *sb, void *unused) iput(toput_inode); toput_inode = inode; + cond_resched(); spin_lock(&sb->s_inode_list_lock); } spin_unlock(&sb->s_inode_list_lock);