Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c79d967d authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jan Kara
Browse files

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: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent eea7feb0
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -1241,6 +1241,7 @@ 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.
@@ -1248,6 +1249,14 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data)
		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,
@@ -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;
+11 −0
Original line number Diff line number Diff line
@@ -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;
+10 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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);
@@ -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:
+10 −0
Original line number Diff line number Diff line
@@ -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();
+8 −0
Original line number Diff line number Diff line
@@ -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) {
@@ -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);
	}
Loading