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>
spin_unlock(&sbi->s_lock);
return 0;
}
spin_unlock(&sbi->s_lock);
return 0;
}
/*
* OK, we are remounting a valid rw partition rdonly, so set
* the rdonly flag and then mark the partition as valid again.
/*
* OK, we are remounting a valid rw partition rdonly, so set
* the rdonly flag and then mark the partition as valid again.
es->s_state = cpu_to_le16(sbi->s_mount_state);
es->s_mtime = cpu_to_le32(get_seconds());
spin_unlock(&sbi->s_lock);
es->s_state = cpu_to_le16(sbi->s_mount_state);
es->s_mtime = cpu_to_le32(get_seconds());
spin_unlock(&sbi->s_lock);
+
+ err = vfs_dq_off(sb, 1);
+ if (err < 0 && err != -ENOSYS) {
+ err = -EBUSY;
+ spin_lock(&sbi->s_lock);
+ goto restore_opts;
+ }
+
ext2_sync_super(sb, es, 1);
} else {
__le32 ret = EXT2_HAS_RO_COMPAT_FEATURE(sb,
ext2_sync_super(sb, es, 1);
} else {
__le32 ret = EXT2_HAS_RO_COMPAT_FEATURE(sb,
if (!ext2_setup_super (sb, es, 0))
sb->s_flags &= ~MS_RDONLY;
spin_unlock(&sbi->s_lock);
if (!ext2_setup_super (sb, es, 0))
sb->s_flags &= ~MS_RDONLY;
spin_unlock(&sbi->s_lock);
+
+ vfs_dq_quota_on_remount(sb);
return 0;
restore_opts:
sbi->s_mount_opt = old_opts.s_mount_opt;
return 0;
restore_opts:
sbi->s_mount_opt = old_opts.s_mount_opt;
ext3_fsblk_t n_blocks_count = 0;
unsigned long old_sb_flags;
struct ext3_mount_options old_opts;
ext3_fsblk_t n_blocks_count = 0;
unsigned long old_sb_flags;
struct ext3_mount_options old_opts;
int err;
#ifdef CONFIG_QUOTA
int i;
int err;
#ifdef CONFIG_QUOTA
int i;
}
if (*flags & MS_RDONLY) {
}
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
/*
* First of all, the unconditional stuff we have to do
* to disable replay of the journal when we next remount
goto restore_opts;
if (!ext3_setup_super (sb, es, 0))
sb->s_flags &= ~MS_RDONLY;
goto restore_opts;
if (!ext3_setup_super (sb, es, 0))
sb->s_flags &= ~MS_RDONLY;
#endif
unlock_super(sb);
unlock_kernel();
#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;
return 0;
restore_opts:
sb->s_flags = old_sb_flags;
ext4_fsblk_t n_blocks_count = 0;
unsigned long old_sb_flags;
struct ext4_mount_options old_opts;
ext4_fsblk_t n_blocks_count = 0;
unsigned long old_sb_flags;
struct ext4_mount_options old_opts;
ext4_group_t g;
unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO;
int err;
ext4_group_t g;
unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO;
int err;
}
if (*flags & MS_RDONLY) {
}
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
/*
* First of all, the unconditional stuff we have to do
* to disable replay of the journal when we next remount
goto restore_opts;
if (!ext4_setup_super(sb, es, 0))
sb->s_flags &= ~MS_RDONLY;
goto restore_opts;
if (!ext4_setup_super(sb, es, 0))
sb->s_flags &= ~MS_RDONLY;
}
}
ext4_setup_system_zone(sb);
}
}
ext4_setup_system_zone(sb);
#endif
unlock_super(sb);
unlock_kernel();
#endif
unlock_super(sb);
unlock_kernel();
+ if (enable_quota)
+ vfs_dq_quota_on_remount(sb);
JFS_SBI(sb)->flag = flag;
ret = jfs_mount_rw(sb, 1);
JFS_SBI(sb)->flag = flag;
ret = jfs_mount_rw(sb, 1);
+
+ /* mark the fs r/w for quota activity */
+ sb->s_flags &= ~MS_RDONLY;
+
+ vfs_dq_quota_on_remount(sb);
return ret;
}
if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) {
return ret;
}
if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) {
+ rc = vfs_dq_off(sb, 1);
+ if (rc < 0 && rc != -ENOSYS) {
+ unlock_kernel();
+ return -EBUSY;
+ }
rc = jfs_umount_rw(sb);
JFS_SBI(sb)->flag = flag;
unlock_kernel();
rc = jfs_umount_rw(sb);
JFS_SBI(sb)->flag = flag;
unlock_kernel();
if (s->s_flags & MS_RDONLY)
/* it is read-only already */
goto out_ok;
if (s->s_flags & MS_RDONLY)
/* it is read-only already */
goto out_ok;
+
+ err = vfs_dq_off(s, 1);
+ if (err < 0 && err != -ENOSYS) {
+ err = -EBUSY;
+ goto out_err;
+ }
+
/* try to remount file system with read-only permissions */
if (sb_umount_state(rs) == REISERFS_VALID_FS
|| REISERFS_SB(s)->s_mount_state != REISERFS_VALID_FS) {
/* try to remount file system with read-only permissions */
if (sb_umount_state(rs) == REISERFS_VALID_FS
|| REISERFS_SB(s)->s_mount_state != REISERFS_VALID_FS) {
s->s_dirt = 0;
if (!(*mount_flags & MS_RDONLY)) {
s->s_dirt = 0;
if (!(*mount_flags & MS_RDONLY)) {
+ vfs_dq_quota_on_remount(s);
finish_unfinished(s);
reiserfs_xattr_init(s, *mount_flags);
}
finish_unfinished(s);
reiserfs_xattr_init(s, *mount_flags);
}
int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
{
int retval;
int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
{
int retval;
- int remount_rw, remount_ro;
if (sb->s_frozen != SB_UNFROZEN)
return -EBUSY;
if (sb->s_frozen != SB_UNFROZEN)
return -EBUSY;
sync_filesystem(sb);
remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY);
sync_filesystem(sb);
remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY);
- remount_rw = !(flags & MS_RDONLY) && (sb->s_flags & MS_RDONLY);
/* If we are remounting RDONLY and current sb is read/write,
make sure there are no rw files opened */
/* If we are remounting RDONLY and current sb is read/write,
make sure there are no rw files opened */
mark_files_ro(sb);
else if (!fs_may_remount_ro(sb))
return -EBUSY;
mark_files_ro(sb);
else if (!fs_may_remount_ro(sb))
return -EBUSY;
- retval = vfs_dq_off(sb, 1);
- if (retval < 0 && retval != -ENOSYS)
- return -EBUSY;
}
if (sb->s_op->remount_fs) {
}
if (sb->s_op->remount_fs) {
return retval;
}
sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
return retval;
}
sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
- if (remount_rw)
- vfs_dq_quota_on_remount(sb);
/*
* Some filesystems modify their metadata via some other path than the
* bdev buffer cache (eg. use a private mapping, or directories in
/*
* Some filesystems modify their metadata via some other path than the
* bdev buffer cache (eg. use a private mapping, or directories in
#include <linux/vmalloc.h>
#include <linux/errno.h>
#include <linux/mount.h>
#include <linux/vmalloc.h>
#include <linux/errno.h>
#include <linux/mount.h>
+#include <linux/quotaops.h>
#include <linux/seq_file.h>
#include <linux/bitmap.h>
#include <linux/crc-itu-t.h>
#include <linux/seq_file.h>
#include <linux/bitmap.h>
#include <linux/crc-itu-t.h>
{
struct udf_options uopt;
struct udf_sb_info *sbi = UDF_SB(sb);
{
struct udf_options uopt;
struct udf_sb_info *sbi = UDF_SB(sb);
uopt.flags = sbi->s_flags;
uopt.uid = sbi->s_uid;
uopt.flags = sbi->s_flags;
uopt.uid = sbi->s_uid;
- if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) {
- unlock_kernel();
- return 0;
- }
- if (*flags & MS_RDONLY)
+ if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+ goto out_unlock;
+
+ if (*flags & MS_RDONLY) {
+
+ error = vfs_dq_off(sb, 1);
+ if (error < 0 && error != -ENOSYS)
+ error = -EBUSY;
+ } else {
+ /* mark the fs r/w for quota activity */
+ sb->s_flags &= ~MS_RDONLY;
+ vfs_dq_quota_on_remount(sb);
+ }
+
+out_unlock:
}
/* Check Volume Structure Descriptors (ECMA 167 2/9.1) */
}
/* Check Volume Structure Descriptors (ECMA 167 2/9.1) */
struct ufs_super_block_first * usb1;
struct ufs_super_block_third * usb3;
unsigned new_mount_opt, ufstype;
struct ufs_super_block_first * usb1;
struct ufs_super_block_third * usb3;
unsigned new_mount_opt, ufstype;
lock_kernel();
lock_super(sb);
lock_kernel();
lock_super(sb);
* fs was mouted as rw, remounting ro
*/
if (*mount_flags & MS_RDONLY) {
* fs was mouted as rw, remounting ro
*/
if (*mount_flags & MS_RDONLY) {
+ err = vfs_dq_off(sb, 1);
+ if (err < 0 && err != -ENOSYS) {
+ unlock_super(sb);
+ unlock_kernel();
+ return -EBUSY;
+ }
+
ufs_put_super_internal(sb);
usb1->fs_time = cpu_to_fs32(sb, get_seconds());
if ((flags & UFS_ST_MASK) == UFS_ST_SUN
ufs_put_super_internal(sb);
usb1->fs_time = cpu_to_fs32(sb, get_seconds());
if ((flags & UFS_ST_MASK) == UFS_ST_SUN
return -EPERM;
}
sb->s_flags &= ~MS_RDONLY;
return -EPERM;
}
sb->s_flags &= ~MS_RDONLY;
#endif
}
UFS_SB(sb)->s_mount_opt = new_mount_opt;
unlock_super(sb);
unlock_kernel();
#endif
}
UFS_SB(sb)->s_mount_opt = new_mount_opt;
unlock_super(sb);
unlock_kernel();
+ if (enable_quota)
+ vfs_dq_quota_on_remount(sb);