summaryrefslogtreecommitdiff
path: root/fs/ext3
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2010-05-19 15:16:40 +0400
committerJan Kara <jack@suse.cz>2010-05-24 16:06:39 +0400
commitc79d967de3741ceb60c5bbbf1b6f97eab9a89838 (patch)
tree5494e7b504cffb0ddc6942d1542c2b4a472207ed /fs/ext3
parenteea7feb072f5914ecafa95b3d83be0c229244d90 (diff)
downloadlinux-c79d967de3741ceb60c5bbbf1b6f97eab9a89838.tar.xz
quota: move remount handling into the filesystem
Currently do_remount_sb calls into the dquot code to tell it about going from rw to ro and ro to rw. Move this code into the filesystem to not depend on the dquot code in the VFS - note ocfs2 already ignores these calls and handles remount by itself. This gets rid of overloading the quotactl calls and allows to unify the VFS and XFS codepaths in that area later. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext3')
-rw-r--r--fs/ext3/super.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/fs/ext3/super.c b/fs/ext3/super.c
index 0fc1293d0e96..d0f8837b6255 100644
--- a/fs/ext3/super.c
+++ b/fs/ext3/super.c
@@ -2551,6 +2551,7 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data)
ext3_fsblk_t n_blocks_count = 0;
unsigned long old_sb_flags;
struct ext3_mount_options old_opts;
+ int enable_quota = 0;
int err;
#ifdef CONFIG_QUOTA
int i;
@@ -2597,6 +2598,12 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data)
}
if (*flags & MS_RDONLY) {
+ err = vfs_dq_off(sb, 1);
+ if (err < 0 && err != -ENOSYS) {
+ err = -EBUSY;
+ goto restore_opts;
+ }
+
/*
* First of all, the unconditional stuff we have to do
* to disable replay of the journal when we next remount
@@ -2651,6 +2658,7 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data)
goto restore_opts;
if (!ext3_setup_super (sb, es, 0))
sb->s_flags &= ~MS_RDONLY;
+ enable_quota = 1;
}
}
#ifdef CONFIG_QUOTA
@@ -2662,6 +2670,9 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data)
#endif
unlock_super(sb);
unlock_kernel();
+
+ if (enable_quota)
+ vfs_dq_quota_on_remount(sb);
return 0;
restore_opts:
sb->s_flags = old_sb_flags;