static bool pin_sb_for_writeback(struct super_block *sb)
{
spin_lock(&sb_lock);
+ if (list_empty(&sb->s_instances)) {
+ spin_unlock(&sb_lock);
+ return false;
+ }
+
sb->s_count++;
+ spin_unlock(&sb_lock);
+
if (down_read_trylock(&sb->s_umount)) {
- if (sb->s_root) {
- spin_unlock(&sb_lock);
+ if (sb->s_root)
return true;
- }
- /*
- * umounted, drop rwsem again and fall through to failure
- */
up_read(&sb->s_umount);
}
- sb->s_count--;
- spin_unlock(&sb_lock);
+
+ put_super(sb);
return false;
}
ret = writeback_sb_inodes(sb, wb, wbc);
} else {
- if (!pin_sb_for_writeback(sb))
+ if (!pin_sb_for_writeback(sb)) {
+ requeue_io(inode);
continue;
+ }
ret = writeback_sb_inodes(sb, wb, wbc);
drop_super(sb);
}