90 lines
2.5 KiB
Plaintext
90 lines
2.5 KiB
Plaintext
|
From: Olaf Kirch <okir@suse.de>
|
||
|
Subject: Do not call shrink_dcache_sb when remounting procfs etc
|
||
|
Patch-mainline: Not yet
|
||
|
References: 165672
|
||
|
Patch-mainline: not yet
|
||
|
|
||
|
Avoid calls to shrink_dcache_sb when mounting a file system that
|
||
|
uses get_sb_single. shrink_dcache_sb is costly. On large ia64
|
||
|
systems, this will keep the dcache lock for > 60 seconds at
|
||
|
a stretch.
|
||
|
|
||
|
Signed-off-by: Olaf Kirch <okir@suse.de>
|
||
|
|
||
|
fs/super.c | 36 +++++++++++++++++++++++-------------
|
||
|
1 file changed, 23 insertions(+), 13 deletions(-)
|
||
|
|
||
|
--- a/fs/super.c
|
||
|
+++ b/fs/super.c
|
||
|
@@ -556,16 +556,10 @@ out:
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
-/**
|
||
|
- * do_remount_sb - asks filesystem to change mount options.
|
||
|
- * @sb: superblock in question
|
||
|
- * @flags: numeric part of options
|
||
|
- * @data: the rest of options
|
||
|
- * @force: whether or not to force the change
|
||
|
- *
|
||
|
- * Alters the mount options of a mounted file system.
|
||
|
- */
|
||
|
-int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
|
||
|
+#define REMOUNT_FORCE 1
|
||
|
+#define REMOUNT_SHRINK_DCACHE 2
|
||
|
+
|
||
|
+static int __do_remount_sb(struct super_block *sb, int flags, void *data, int rflags)
|
||
|
{
|
||
|
int retval;
|
||
|
int remount_rw, remount_ro;
|
||
|
@@ -580,7 +574,8 @@ int do_remount_sb(struct super_block *sb
|
||
|
|
||
|
if (flags & MS_RDONLY)
|
||
|
acct_auto_close(sb);
|
||
|
- shrink_dcache_sb(sb);
|
||
|
+ if (rflags & REMOUNT_SHRINK_DCACHE)
|
||
|
+ shrink_dcache_sb(sb);
|
||
|
sync_filesystem(sb);
|
||
|
|
||
|
remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY);
|
||
|
@@ -589,7 +584,7 @@ int do_remount_sb(struct super_block *sb
|
||
|
/* If we are remounting RDONLY and current sb is read/write,
|
||
|
make sure there are no rw files opened */
|
||
|
if (remount_ro) {
|
||
|
- if (force)
|
||
|
+ if (rflags & REMOUNT_FORCE)
|
||
|
mark_files_ro(sb);
|
||
|
else if (!fs_may_remount_ro(sb))
|
||
|
return -EBUSY;
|
||
|
@@ -619,6 +614,21 @@ int do_remount_sb(struct super_block *sb
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+/**
|
||
|
+ * do_remount_sb - asks filesystem to change mount options.
|
||
|
+ * @sb: superblock in question
|
||
|
+ * @flags: numeric part of options
|
||
|
+ * @data: the rest of options
|
||
|
+ * @force: whether or not to force the change
|
||
|
+ *
|
||
|
+ * Alters the mount options of a mounted file system.
|
||
|
+ */
|
||
|
+int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
|
||
|
+{
|
||
|
+ return __do_remount_sb(sb, flags, data,
|
||
|
+ REMOUNT_SHRINK_DCACHE|(force? REMOUNT_FORCE : 0));
|
||
|
+}
|
||
|
+
|
||
|
static void do_emergency_remount(struct work_struct *work)
|
||
|
{
|
||
|
struct super_block *sb;
|
||
|
@@ -914,7 +924,7 @@ int get_sb_single(struct file_system_typ
|
||
|
}
|
||
|
s->s_flags |= MS_ACTIVE;
|
||
|
} else {
|
||
|
- do_remount_sb(s, flags, data, 0);
|
||
|
+ __do_remount_sb(s, flags, data, 0);
|
||
|
}
|
||
|
simple_set_mnt(mnt, s);
|
||
|
return 0;
|