writeback: fix pin_sb_for_writeback
PATCH 1/1 writeback: fix pin_sb_for_writeback
We need to check for s_instances to make sure we don't bother working against a filesystem that is beeing unmounted, and we need to call put_super to make sure a superblock is freed when we race against umount. Also no need to keep sb_lock after we got a reference on it.
Signed-off-by Christoph Hellwig <[email protected]>
---
Note: this is against Jens' tree with the writeback changes applied.
The logic in mainline is the same, but the context is slightl different.
fs/fs-writeback.c +10 -8
@@ -534,19 +534,21 @@ select_queue: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; }