diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/fs-writeback.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 3a066e91ec8d..0609607d3955 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
@@ -534,19 +534,21 @@ select_queue: | |||
534 | static bool pin_sb_for_writeback(struct super_block *sb) | 534 | static bool pin_sb_for_writeback(struct super_block *sb) |
535 | { | 535 | { |
536 | spin_lock(&sb_lock); | 536 | spin_lock(&sb_lock); |
537 | if (list_empty(&sb->s_instances)) { | ||
538 | spin_unlock(&sb_lock); | ||
539 | return false; | ||
540 | } | ||
541 | |||
537 | sb->s_count++; | 542 | sb->s_count++; |
543 | spin_unlock(&sb_lock); | ||
544 | |||
538 | if (down_read_trylock(&sb->s_umount)) { | 545 | if (down_read_trylock(&sb->s_umount)) { |
539 | if (sb->s_root) { | 546 | if (sb->s_root) |
540 | spin_unlock(&sb_lock); | ||
541 | return true; | 547 | return true; |
542 | } | ||
543 | /* | ||
544 | * umounted, drop rwsem again and fall through to failure | ||
545 | */ | ||
546 | up_read(&sb->s_umount); | 548 | up_read(&sb->s_umount); |
547 | } | 549 | } |
548 | sb->s_count--; | 550 | |
549 | spin_unlock(&sb_lock); | 551 | put_super(sb); |
550 | return false; | 552 | return false; |
551 | } | 553 | } |
552 | 554 | ||