- Update to 3.3-rc2.
[linux-flexiantxendom0-3.2.10.git] / fs / super.c
index 6015c02..3664170 100644 (file)
@@ -691,16 +691,10 @@ rescan:
        return NULL;
 }
 
-/**
- *     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_ro;
@@ -715,7 +709,8 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
 
        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);
@@ -723,7 +718,7 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
        /* 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 {
                        retval = sb_prepare_remount_readonly(sb);
@@ -735,7 +730,7 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
        if (sb->s_op->remount_fs) {
                retval = sb->s_op->remount_fs(sb, &flags, data);
                if (retval) {
-                       if (!force)
+                       if (!(rflags & REMOUNT_FORCE))
                                goto cancel_readonly;
                        /* If forced remount, go ahead despite any errors */
                        WARN(1, "forced remount of a %s fs returned %i\n",
@@ -764,6 +759,21 @@ cancel_readonly:
        return retval;
 }
 
+/**
+ *     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, *p = NULL;
@@ -1080,7 +1090,7 @@ struct dentry *mount_single(struct file_system_type *fs_type,
                }
                s->s_flags |= MS_ACTIVE;
        } else {
-               do_remount_sb(s, flags, data, 0);
+               __do_remount_sb(s, flags, data, 0);
        }
        return dget(s->s_root);
 }