aboutsummaryrefslogtreecommitdiffstats
path: root/fs/sync.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2010-03-23 06:06:58 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2010-05-21 18:31:16 -0400
commit01a05b337a5b647909e1d6670f57e7202318a5fb (patch)
tree7877f08db14877d06346c8e1ef52aa17f2483e93 /fs/sync.c
parent35cf7ba0b46dc3582a01c3860b14bff122662aa3 (diff)
new helper: iterate_supers()
... and switch the simple "loop over superblocks and do something" loops to it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/sync.c')
-rw-r--r--fs/sync.c25
1 files changed, 6 insertions, 19 deletions
diff --git a/fs/sync.c b/fs/sync.c
index f3f0a0e1948f..d5369203f8e4 100644
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -77,31 +77,18 @@ int sync_filesystem(struct super_block *sb)
77} 77}
78EXPORT_SYMBOL_GPL(sync_filesystem); 78EXPORT_SYMBOL_GPL(sync_filesystem);
79 79
80static void sync_one_sb(struct super_block *sb, void *arg)
81{
82 if (!(sb->s_flags & MS_RDONLY) && sb->s_bdi)
83 __sync_filesystem(sb, *(int *)arg);
84}
80/* 85/*
81 * Sync all the data for all the filesystems (called by sys_sync() and 86 * Sync all the data for all the filesystems (called by sys_sync() and
82 * emergency sync) 87 * emergency sync)
83 */ 88 */
84static void sync_filesystems(int wait) 89static void sync_filesystems(int wait)
85{ 90{
86 struct super_block *sb, *n; 91 iterate_supers(sync_one_sb, &wait);
87
88 spin_lock(&sb_lock);
89 list_for_each_entry_safe(sb, n, &super_blocks, s_list) {
90 if (list_empty(&sb->s_instances))
91 continue;
92 sb->s_count++;
93 spin_unlock(&sb_lock);
94
95 down_read(&sb->s_umount);
96 if (!(sb->s_flags & MS_RDONLY) && sb->s_root && sb->s_bdi)
97 __sync_filesystem(sb, wait);
98 up_read(&sb->s_umount);
99
100 /* restart only when sb is no longer on the list */
101 spin_lock(&sb_lock);
102 __put_super(sb);
103 }
104 spin_unlock(&sb_lock);
105} 92}
106 93
107/* 94/*