提交 8edd64bd 编写于 作者: A Al Viro

get rid of restarts in sync_filesystems()

At the same time we can kill s_need_restart and local mutex in there.
__put_super() made public for a while; will be gone later.
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 551de6f3
master alk-4.19.24 alk-4.19.30 alk-4.19.34 alk-4.19.36 alk-4.19.43 alk-4.19.48 alk-4.19.57 ck-4.19.67 ck-4.19.81 ck-4.19.91 github/fork/deepanshu1422/fix-typo-in-comment github/fork/haosdent/fix-typo linux-next v4.19.91 v4.19.90 v4.19.89 v4.19.88 v4.19.87 v4.19.86 v4.19.85 v4.19.84 v4.19.83 v4.19.82 v4.19.81 v4.19.80 v4.19.79 v4.19.78 v4.19.77 v4.19.76 v4.19.75 v4.19.74 v4.19.73 v4.19.72 v4.19.71 v4.19.70 v4.19.69 v4.19.68 v4.19.67 v4.19.66 v4.19.65 v4.19.64 v4.19.63 v4.19.62 v4.19.61 v4.19.60 v4.19.59 v4.19.58 v4.19.57 v4.19.56 v4.19.55 v4.19.54 v4.19.53 v4.19.52 v4.19.51 v4.19.50 v4.19.49 v4.19.48 v4.19.47 v4.19.46 v4.19.45 v4.19.44 v4.19.43 v4.19.42 v4.19.41 v4.19.40 v4.19.39 v4.19.38 v4.19.37 v4.19.36 v4.19.35 v4.19.34 v4.19.33 v4.19.32 v4.19.31 v4.19.30 v4.19.29 v4.19.28 v4.19.27 v4.19.26 v4.19.25 v4.19.24 v4.19.23 v4.19.22 v4.19.21 v4.19.20 v4.19.19 v4.19.18 v4.19.17 v4.19.16 v4.19.15 v4.19.14 v4.19.13 v4.19.12 v4.19.11 v4.19.10 v4.19.9 v4.19.8 v4.19.7 v4.19.6 v4.19.5 v4.19.4 v4.19.3 v4.19.2 v4.19.1 v4.19 v4.19-rc8 v4.19-rc7 v4.19-rc6 v4.19-rc5 v4.19-rc4 v4.19-rc3 v4.19-rc2 v4.19-rc1 ck-release-21 ck-release-20 ck-release-19.2 ck-release-19.1 ck-release-19 ck-release-18 ck-release-17.2 ck-release-17.1 ck-release-17 ck-release-16 ck-release-15.1 ck-release-15 ck-release-14 ck-release-13.2 ck-release-13 ck-release-12 ck-release-11 ck-release-10 ck-release-9 ck-release-7 alk-release-15 alk-release-14 alk-release-13.2 alk-release-13 alk-release-12 alk-release-11 alk-release-10 alk-release-9 alk-release-7
无相关合并请求
...@@ -130,7 +130,7 @@ static inline void destroy_super(struct super_block *s) ...@@ -130,7 +130,7 @@ static inline void destroy_super(struct super_block *s)
* Drop a superblock's refcount. Returns non-zero if the superblock was * Drop a superblock's refcount. Returns non-zero if the superblock was
* destroyed. The caller must hold sb_lock. * destroyed. The caller must hold sb_lock.
*/ */
static int __put_super(struct super_block *sb) int __put_super(struct super_block *sb)
{ {
int ret = 0; int ret = 0;
......
...@@ -80,35 +80,15 @@ EXPORT_SYMBOL_GPL(sync_filesystem); ...@@ -80,35 +80,15 @@ EXPORT_SYMBOL_GPL(sync_filesystem);
/* /*
* Sync all the data for all the filesystems (called by sys_sync() and * Sync all the data for all the filesystems (called by sys_sync() and
* emergency sync) * emergency sync)
*
* This operation is careful to avoid the livelock which could easily happen
* if two or more filesystems are being continuously dirtied. s_need_sync
* is used only here. We set it against all filesystems and then clear it as
* we sync them. So redirtied filesystems are skipped.
*
* But if process A is currently running sync_filesystems and then process B
* calls sync_filesystems as well, process B will set all the s_need_sync
* flags again, which will cause process A to resync everything. Fix that with
* a local mutex.
*/ */
static void sync_filesystems(int wait) static void sync_filesystems(int wait)
{ {
struct super_block *sb; struct super_block *sb, *n;
static DEFINE_MUTEX(mutex);
mutex_lock(&mutex); /* Could be down_interruptible */
spin_lock(&sb_lock); spin_lock(&sb_lock);
list_for_each_entry(sb, &super_blocks, s_list) list_for_each_entry_safe(sb, n, &super_blocks, s_list) {
if (!list_empty(&sb->s_instances))
sb->s_need_sync = 1;
restart:
list_for_each_entry(sb, &super_blocks, s_list) {
if (list_empty(&sb->s_instances)) if (list_empty(&sb->s_instances))
continue; continue;
if (!sb->s_need_sync)
continue;
sb->s_need_sync = 0;
sb->s_count++; sb->s_count++;
spin_unlock(&sb_lock); spin_unlock(&sb_lock);
...@@ -119,11 +99,9 @@ static void sync_filesystems(int wait) ...@@ -119,11 +99,9 @@ static void sync_filesystems(int wait)
/* restart only when sb is no longer on the list */ /* restart only when sb is no longer on the list */
spin_lock(&sb_lock); spin_lock(&sb_lock);
if (__put_super_and_need_restart(sb)) __put_super(sb);
goto restart;
} }
spin_unlock(&sb_lock); spin_unlock(&sb_lock);
mutex_unlock(&mutex);
} }
/* /*
......
...@@ -1332,7 +1332,6 @@ struct super_block { ...@@ -1332,7 +1332,6 @@ struct super_block {
struct rw_semaphore s_umount; struct rw_semaphore s_umount;
struct mutex s_lock; struct mutex s_lock;
int s_count; int s_count;
int s_need_sync;
atomic_t s_active; atomic_t s_active;
#ifdef CONFIG_SECURITY #ifdef CONFIG_SECURITY
void *s_security; void *s_security;
...@@ -1780,6 +1779,7 @@ extern int get_sb_pseudo(struct file_system_type *, char *, ...@@ -1780,6 +1779,7 @@ extern int get_sb_pseudo(struct file_system_type *, char *,
struct vfsmount *mnt); struct vfsmount *mnt);
extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb); extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb);
int __put_super_and_need_restart(struct super_block *sb); int __put_super_and_need_restart(struct super_block *sb);
int __put_super(struct super_block *sb);
void put_super(struct super_block *sb); void put_super(struct super_block *sb);
/* Alas, no aliases. Too much hassle with bringing module.h everywhere */ /* Alas, no aliases. Too much hassle with bringing module.h everywhere */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
反馈
建议
客服 返回
顶部