]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - fs/fs-writeback.c
ARM: 6205/1: perf: ensure counter delta is treated as unsigned
[net-next-2.6.git] / fs / fs-writeback.c
index 0079bf59b5831cd33e95252171095602373c58b4..0609607d395591ad5b23ee52283ad25c85e2bc10 100644 (file)
@@ -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;
 }
 
@@ -643,8 +645,10 @@ static void writeback_inodes_wb(struct bdi_writeback *wb,
 
                        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);
                }