aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2010-03-22 21:13:53 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2010-05-21 18:31:16 -0400
commit35cf7ba0b46dc3582a01c3860b14bff122662aa3 (patch)
tree2b38e9333600f468f0c8371c657c02e3aa8ec43b /fs
parent79893c17b45dec0d3c25bc22d28d9f319b14f573 (diff)
Bury __put_super_and_need_restart()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r--fs/drop_caches.c1
-rw-r--r--fs/internal.h2
-rw-r--r--fs/quota/quota.c1
-rw-r--r--fs/super.c30
4 files changed, 6 insertions, 28 deletions
diff --git a/fs/drop_caches.c b/fs/drop_caches.c
index 42728a1f795f..52047cf4177f 100644
--- a/fs/drop_caches.c
+++ b/fs/drop_caches.c
@@ -8,6 +8,7 @@
8#include <linux/writeback.h> 8#include <linux/writeback.h>
9#include <linux/sysctl.h> 9#include <linux/sysctl.h>
10#include <linux/gfp.h> 10#include <linux/gfp.h>
11#include "internal.h"
11 12
12/* A global variable is a bit ugly, but it keeps the code simple */ 13/* A global variable is a bit ugly, but it keeps the code simple */
13int sysctl_drop_caches; 14int sysctl_drop_caches;
diff --git a/fs/internal.h b/fs/internal.h
index 8a03a5447bdf..6b706bc60a66 100644
--- a/fs/internal.h
+++ b/fs/internal.h
@@ -87,6 +87,8 @@ extern struct file *get_empty_filp(void);
87 * super.c 87 * super.c
88 */ 88 */
89extern int do_remount_sb(struct super_block *, int, void *, int); 89extern int do_remount_sb(struct super_block *, int, void *, int);
90extern void __put_super(struct super_block *sb);
91extern void put_super(struct super_block *sb);
90 92
91/* 93/*
92 * open.c 94 * open.c
diff --git a/fs/quota/quota.c b/fs/quota/quota.c
index 2196f8b07c1f..3ce1553ea7eb 100644
--- a/fs/quota/quota.c
+++ b/fs/quota/quota.c
@@ -18,6 +18,7 @@
18#include <linux/quotaops.h> 18#include <linux/quotaops.h>
19#include <linux/types.h> 19#include <linux/types.h>
20#include <linux/writeback.h> 20#include <linux/writeback.h>
21#include "../internal.h"
21 22
22static int check_quotactl_permission(struct super_block *sb, int type, int cmd, 23static int check_quotactl_permission(struct super_block *sb, int type, int cmd,
23 qid_t id) 24 qid_t id)
diff --git a/fs/super.c b/fs/super.c
index 1f72e0d42d8f..95adbb3d8e58 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -127,40 +127,14 @@ static inline void destroy_super(struct super_block *s)
127/* Superblock refcounting */ 127/* Superblock refcounting */
128 128
129/* 129/*
130 * Drop a superblock's refcount. Returns non-zero if the superblock was 130 * Drop a superblock's refcount. The caller must hold sb_lock.
131 * destroyed. The caller must hold sb_lock.
132 */ 131 */
133int __put_super(struct super_block *sb) 132void __put_super(struct super_block *sb)
134{ 133{
135 int ret = 0;
136
137 if (!--sb->s_count) { 134 if (!--sb->s_count) {
138 list_del_init(&sb->s_list); 135 list_del_init(&sb->s_list);
139 destroy_super(sb); 136 destroy_super(sb);
140 ret = 1;
141 }
142 return ret;
143}
144
145/*
146 * Drop a superblock's refcount.
147 * Returns non-zero if the superblock is about to be destroyed and
148 * at least is already removed from super_blocks list, so if we are
149 * making a loop through super blocks then we need to restart.
150 * The caller must hold sb_lock.
151 */
152int __put_super_and_need_restart(struct super_block *sb)
153{
154 /* check for race with generic_shutdown_super() */
155 if (list_empty(&sb->s_instances)) {
156 /* super block is removed, need to restart... */
157 __put_super(sb);
158 return 1;
159 } 137 }
160 /* can't be the last, since s_list is still in use */
161 sb->s_count--;
162 BUG_ON(sb->s_count == 0);
163 return 0;
164} 138}
165 139
166/** 140/**