Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 199347
b: refs/heads/master
c: c79d967
h: refs/heads/master
i:
  199345: 34344ce
  199343: 9583066
v: v3
  • Loading branch information
Christoph Hellwig authored and Jan Kara committed May 24, 2010
1 parent c6427ca commit 46cd5a7
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 15 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: eea7feb072f5914ecafa95b3d83be0c229244d90
refs/heads/master: c79d967de3741ceb60c5bbbf1b6f97eab9a89838
13 changes: 13 additions & 0 deletions trunk/fs/ext2/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -1241,13 +1241,22 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data)
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.
*/
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,
Expand All @@ -1269,8 +1278,12 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data)
if (!ext2_setup_super (sb, es, 0))
sb->s_flags &= ~MS_RDONLY;
spin_unlock(&sbi->s_lock);

ext2_write_super(sb);

vfs_dq_quota_on_remount(sb);
}

return 0;
restore_opts:
sbi->s_mount_opt = old_opts.s_mount_opt;
Expand Down
11 changes: 11 additions & 0 deletions trunk/fs/ext3/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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;
Expand Down
10 changes: 10 additions & 0 deletions trunk/fs/ext4/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -3574,6 +3574,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
ext4_fsblk_t n_blocks_count = 0;
unsigned long old_sb_flags;
struct ext4_mount_options old_opts;
int enable_quota = 0;
ext4_group_t g;
unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO;
int err;
Expand Down Expand Up @@ -3630,6 +3631,12 @@ static int ext4_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
Expand Down Expand Up @@ -3698,6 +3705,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
goto restore_opts;
if (!ext4_setup_super(sb, es, 0))
sb->s_flags &= ~MS_RDONLY;
enable_quota = 1;
}
}
ext4_setup_system_zone(sb);
Expand All @@ -3713,6 +3721,8 @@ static int ext4_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:
Expand Down
10 changes: 10 additions & 0 deletions trunk/fs/jfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,10 +396,20 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data)

JFS_SBI(sb)->flag = flag;
ret = jfs_mount_rw(sb, 1);

/* mark the fs r/w for quota activity */
sb->s_flags &= ~MS_RDONLY;

unlock_kernel();
vfs_dq_quota_on_remount(sb);
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();
Expand Down
8 changes: 8 additions & 0 deletions trunk/fs/reiserfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -1242,6 +1242,13 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg)
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) {
Expand Down Expand Up @@ -1295,6 +1302,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg)
s->s_dirt = 0;

if (!(*mount_flags & MS_RDONLY)) {
vfs_dq_quota_on_remount(s);
finish_unfinished(s);
reiserfs_xattr_init(s, *mount_flags);
}
Expand Down
9 changes: 2 additions & 7 deletions trunk/fs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,7 @@ struct super_block *user_get_super(dev_t dev)
int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
{
int retval;
int remount_rw, remount_ro;
int remount_ro;

if (sb->s_frozen != SB_UNFROZEN)
return -EBUSY;
Expand All @@ -540,7 +540,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
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 */
Expand All @@ -549,9 +548,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
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) {
Expand All @@ -560,8 +556,7 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
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
Expand Down
25 changes: 18 additions & 7 deletions trunk/fs/udf/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
#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>
Expand Down Expand Up @@ -557,6 +558,7 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options)
{
struct udf_options uopt;
struct udf_sb_info *sbi = UDF_SB(sb);
int error = 0;

uopt.flags = sbi->s_flags;
uopt.uid = sbi->s_uid;
Expand All @@ -582,17 +584,26 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options)
*flags |= MS_RDONLY;
}

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) {
udf_close_lvid(sb);
else

error = vfs_dq_off(sb, 1);
if (error < 0 && error != -ENOSYS)
error = -EBUSY;
} else {
udf_open_lvid(sb);

/* mark the fs r/w for quota activity */
sb->s_flags &= ~MS_RDONLY;
vfs_dq_quota_on_remount(sb);
}

out_unlock:
unlock_kernel();
return 0;
return error;
}

/* Check Volume Structure Descriptors (ECMA 167 2/9.1) */
Expand Down
12 changes: 12 additions & 0 deletions trunk/fs/ufs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -1248,7 +1248,9 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
struct ufs_super_block_first * usb1;
struct ufs_super_block_third * usb3;
unsigned new_mount_opt, ufstype;
int enable_quota = 0;
unsigned flags;
int err;

lock_kernel();
lock_super(sb);
Expand Down Expand Up @@ -1289,6 +1291,13 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
* 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
Expand Down Expand Up @@ -1327,11 +1336,14 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
return -EPERM;
}
sb->s_flags &= ~MS_RDONLY;
enable_quota = 1;
#endif
}
UFS_SB(sb)->s_mount_opt = new_mount_opt;
unlock_super(sb);
unlock_kernel();
if (enable_quota)
vfs_dq_quota_on_remount(sb);
return 0;
}

Expand Down

0 comments on commit 46cd5a7

Please sign in to comment.