In get_super() and user_get_super() restarts are unconditional
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 23 Mar 2010 00:23:25 +0000 (20:23 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 21 May 2010 22:31:16 +0000 (18:31 -0400)
If superblock had been still alive, we would've returned it...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/super.c

index 44971d7df1cecc47ca33d8320b26c1bb6f4b7bd7..1f72e0d42d8fea7d77b1bb1c0f11b396eb6de1d5 100644 (file)
@@ -425,7 +425,7 @@ void sync_supers(void)
  *     mounted on the device given. %NULL is returned if no match is found.
  */
 
-struct super_block * get_super(struct block_device *bdev)
+struct super_block *get_super(struct block_device *bdev)
 {
        struct super_block *sb;
 
@@ -441,13 +441,14 @@ rescan:
                        sb->s_count++;
                        spin_unlock(&sb_lock);
                        down_read(&sb->s_umount);
+                       /* still alive? */
                        if (sb->s_root)
                                return sb;
                        up_read(&sb->s_umount);
-                       /* restart only when sb is no longer on the list */
+                       /* nope, got unmounted */
                        spin_lock(&sb_lock);
-                       if (__put_super_and_need_restart(sb))
-                               goto rescan;
+                       __put_super(sb);
+                       goto rescan;
                }
        }
        spin_unlock(&sb_lock);
@@ -487,7 +488,7 @@ restart:
        return NULL;
 }
  
-struct super_block * user_get_super(dev_t dev)
+struct super_block *user_get_super(dev_t dev)
 {
        struct super_block *sb;
 
@@ -500,13 +501,14 @@ rescan:
                        sb->s_count++;
                        spin_unlock(&sb_lock);
                        down_read(&sb->s_umount);
+                       /* still alive? */
                        if (sb->s_root)
                                return sb;
                        up_read(&sb->s_umount);
-                       /* restart only when sb is no longer on the list */
+                       /* nope, got unmounted */
                        spin_lock(&sb_lock);
-                       if (__put_super_and_need_restart(sb))
-                               goto rescan;
+                       __put_super(sb);
+                       goto rescan;
                }
        }
        spin_unlock(&sb_lock);