diff options
| -rw-r--r-- | fs/ext2/super.c | 13 | ||||
| -rw-r--r-- | fs/ext3/super.c | 11 | ||||
| -rw-r--r-- | fs/ext4/super.c | 10 | ||||
| -rw-r--r-- | fs/jfs/super.c | 10 | ||||
| -rw-r--r-- | fs/reiserfs/super.c | 8 | ||||
| -rw-r--r-- | fs/super.c | 9 | ||||
| -rw-r--r-- | fs/udf/super.c | 25 | ||||
| -rw-r--r-- | fs/ufs/super.c | 12 |
8 files changed, 84 insertions, 14 deletions
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 71e9eb1fa696..73346de9af5c 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
| @@ -1241,6 +1241,7 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
| 1241 | spin_unlock(&sbi->s_lock); | 1241 | spin_unlock(&sbi->s_lock); |
| 1242 | return 0; | 1242 | return 0; |
| 1243 | } | 1243 | } |
| 1244 | |||
| 1244 | /* | 1245 | /* |
| 1245 | * OK, we are remounting a valid rw partition rdonly, so set | 1246 | * OK, we are remounting a valid rw partition rdonly, so set |
| 1246 | * the rdonly flag and then mark the partition as valid again. | 1247 | * 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) | |||
| 1248 | es->s_state = cpu_to_le16(sbi->s_mount_state); | 1249 | es->s_state = cpu_to_le16(sbi->s_mount_state); |
| 1249 | es->s_mtime = cpu_to_le32(get_seconds()); | 1250 | es->s_mtime = cpu_to_le32(get_seconds()); |
| 1250 | spin_unlock(&sbi->s_lock); | 1251 | spin_unlock(&sbi->s_lock); |
| 1252 | |||
| 1253 | err = vfs_dq_off(sb, 1); | ||
| 1254 | if (err < 0 && err != -ENOSYS) { | ||
| 1255 | err = -EBUSY; | ||
| 1256 | spin_lock(&sbi->s_lock); | ||
| 1257 | goto restore_opts; | ||
| 1258 | } | ||
| 1259 | |||
| 1251 | ext2_sync_super(sb, es, 1); | 1260 | ext2_sync_super(sb, es, 1); |
| 1252 | } else { | 1261 | } else { |
| 1253 | __le32 ret = EXT2_HAS_RO_COMPAT_FEATURE(sb, | 1262 | __le32 ret = EXT2_HAS_RO_COMPAT_FEATURE(sb, |
| @@ -1269,8 +1278,12 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
| 1269 | if (!ext2_setup_super (sb, es, 0)) | 1278 | if (!ext2_setup_super (sb, es, 0)) |
| 1270 | sb->s_flags &= ~MS_RDONLY; | 1279 | sb->s_flags &= ~MS_RDONLY; |
| 1271 | spin_unlock(&sbi->s_lock); | 1280 | spin_unlock(&sbi->s_lock); |
| 1281 | |||
| 1272 | ext2_write_super(sb); | 1282 | ext2_write_super(sb); |
| 1283 | |||
| 1284 | vfs_dq_quota_on_remount(sb); | ||
| 1273 | } | 1285 | } |
| 1286 | |||
| 1274 | return 0; | 1287 | return 0; |
| 1275 | restore_opts: | 1288 | restore_opts: |
| 1276 | sbi->s_mount_opt = old_opts.s_mount_opt; | 1289 | sbi->s_mount_opt = old_opts.s_mount_opt; |
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) | |||
| 2551 | ext3_fsblk_t n_blocks_count = 0; | 2551 | ext3_fsblk_t n_blocks_count = 0; |
| 2552 | unsigned long old_sb_flags; | 2552 | unsigned long old_sb_flags; |
| 2553 | struct ext3_mount_options old_opts; | 2553 | struct ext3_mount_options old_opts; |
| 2554 | int enable_quota = 0; | ||
| 2554 | int err; | 2555 | int err; |
| 2555 | #ifdef CONFIG_QUOTA | 2556 | #ifdef CONFIG_QUOTA |
| 2556 | int i; | 2557 | int i; |
| @@ -2597,6 +2598,12 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) | |||
| 2597 | } | 2598 | } |
| 2598 | 2599 | ||
| 2599 | if (*flags & MS_RDONLY) { | 2600 | if (*flags & MS_RDONLY) { |
| 2601 | err = vfs_dq_off(sb, 1); | ||
| 2602 | if (err < 0 && err != -ENOSYS) { | ||
| 2603 | err = -EBUSY; | ||
| 2604 | goto restore_opts; | ||
| 2605 | } | ||
| 2606 | |||
| 2600 | /* | 2607 | /* |
| 2601 | * First of all, the unconditional stuff we have to do | 2608 | * First of all, the unconditional stuff we have to do |
| 2602 | * to disable replay of the journal when we next remount | 2609 | * 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) | |||
| 2651 | goto restore_opts; | 2658 | goto restore_opts; |
| 2652 | if (!ext3_setup_super (sb, es, 0)) | 2659 | if (!ext3_setup_super (sb, es, 0)) |
| 2653 | sb->s_flags &= ~MS_RDONLY; | 2660 | sb->s_flags &= ~MS_RDONLY; |
| 2661 | enable_quota = 1; | ||
| 2654 | } | 2662 | } |
| 2655 | } | 2663 | } |
| 2656 | #ifdef CONFIG_QUOTA | 2664 | #ifdef CONFIG_QUOTA |
| @@ -2662,6 +2670,9 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) | |||
| 2662 | #endif | 2670 | #endif |
| 2663 | unlock_super(sb); | 2671 | unlock_super(sb); |
| 2664 | unlock_kernel(); | 2672 | unlock_kernel(); |
| 2673 | |||
| 2674 | if (enable_quota) | ||
| 2675 | vfs_dq_quota_on_remount(sb); | ||
| 2665 | return 0; | 2676 | return 0; |
| 2666 | restore_opts: | 2677 | restore_opts: |
| 2667 | sb->s_flags = old_sb_flags; | 2678 | sb->s_flags = old_sb_flags; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index e14d22c170d5..fb1e191d0fa9 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -3574,6 +3574,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
| 3574 | ext4_fsblk_t n_blocks_count = 0; | 3574 | ext4_fsblk_t n_blocks_count = 0; |
| 3575 | unsigned long old_sb_flags; | 3575 | unsigned long old_sb_flags; |
| 3576 | struct ext4_mount_options old_opts; | 3576 | struct ext4_mount_options old_opts; |
| 3577 | int enable_quota = 0; | ||
| 3577 | ext4_group_t g; | 3578 | ext4_group_t g; |
| 3578 | unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; | 3579 | unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; |
| 3579 | int err; | 3580 | int err; |
| @@ -3630,6 +3631,12 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
| 3630 | } | 3631 | } |
| 3631 | 3632 | ||
| 3632 | if (*flags & MS_RDONLY) { | 3633 | if (*flags & MS_RDONLY) { |
| 3634 | err = vfs_dq_off(sb, 1); | ||
| 3635 | if (err < 0 && err != -ENOSYS) { | ||
| 3636 | err = -EBUSY; | ||
| 3637 | goto restore_opts; | ||
| 3638 | } | ||
| 3639 | |||
| 3633 | /* | 3640 | /* |
| 3634 | * First of all, the unconditional stuff we have to do | 3641 | * First of all, the unconditional stuff we have to do |
| 3635 | * to disable replay of the journal when we next remount | 3642 | * 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) | |||
| 3698 | goto restore_opts; | 3705 | goto restore_opts; |
| 3699 | if (!ext4_setup_super(sb, es, 0)) | 3706 | if (!ext4_setup_super(sb, es, 0)) |
| 3700 | sb->s_flags &= ~MS_RDONLY; | 3707 | sb->s_flags &= ~MS_RDONLY; |
| 3708 | enable_quota = 1; | ||
| 3701 | } | 3709 | } |
| 3702 | } | 3710 | } |
| 3703 | ext4_setup_system_zone(sb); | 3711 | ext4_setup_system_zone(sb); |
| @@ -3713,6 +3721,8 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
| 3713 | #endif | 3721 | #endif |
| 3714 | unlock_super(sb); | 3722 | unlock_super(sb); |
| 3715 | unlock_kernel(); | 3723 | unlock_kernel(); |
| 3724 | if (enable_quota) | ||
| 3725 | vfs_dq_quota_on_remount(sb); | ||
| 3716 | return 0; | 3726 | return 0; |
| 3717 | 3727 | ||
| 3718 | restore_opts: | 3728 | restore_opts: |
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index b66832ac33ac..5329d66a9704 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
| @@ -396,10 +396,20 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data) | |||
| 396 | 396 | ||
| 397 | JFS_SBI(sb)->flag = flag; | 397 | JFS_SBI(sb)->flag = flag; |
| 398 | ret = jfs_mount_rw(sb, 1); | 398 | ret = jfs_mount_rw(sb, 1); |
| 399 | |||
| 400 | /* mark the fs r/w for quota activity */ | ||
| 401 | sb->s_flags &= ~MS_RDONLY; | ||
| 402 | |||
| 399 | unlock_kernel(); | 403 | unlock_kernel(); |
| 404 | vfs_dq_quota_on_remount(sb); | ||
| 400 | return ret; | 405 | return ret; |
| 401 | } | 406 | } |
| 402 | if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) { | 407 | if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) { |
| 408 | rc = vfs_dq_off(sb, 1); | ||
| 409 | if (rc < 0 && rc != -ENOSYS) { | ||
| 410 | unlock_kernel(); | ||
| 411 | return -EBUSY; | ||
| 412 | } | ||
| 403 | rc = jfs_umount_rw(sb); | 413 | rc = jfs_umount_rw(sb); |
| 404 | JFS_SBI(sb)->flag = flag; | 414 | JFS_SBI(sb)->flag = flag; |
| 405 | unlock_kernel(); | 415 | unlock_kernel(); |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 59125fb36d42..49a8ba02bc17 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
| @@ -1242,6 +1242,13 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
| 1242 | if (s->s_flags & MS_RDONLY) | 1242 | if (s->s_flags & MS_RDONLY) |
| 1243 | /* it is read-only already */ | 1243 | /* it is read-only already */ |
| 1244 | goto out_ok; | 1244 | goto out_ok; |
| 1245 | |||
| 1246 | err = vfs_dq_off(s, 1); | ||
| 1247 | if (err < 0 && err != -ENOSYS) { | ||
| 1248 | err = -EBUSY; | ||
| 1249 | goto out_err; | ||
| 1250 | } | ||
| 1251 | |||
| 1245 | /* try to remount file system with read-only permissions */ | 1252 | /* try to remount file system with read-only permissions */ |
| 1246 | if (sb_umount_state(rs) == REISERFS_VALID_FS | 1253 | if (sb_umount_state(rs) == REISERFS_VALID_FS |
| 1247 | || REISERFS_SB(s)->s_mount_state != REISERFS_VALID_FS) { | 1254 | || 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) | |||
| 1295 | s->s_dirt = 0; | 1302 | s->s_dirt = 0; |
| 1296 | 1303 | ||
| 1297 | if (!(*mount_flags & MS_RDONLY)) { | 1304 | if (!(*mount_flags & MS_RDONLY)) { |
| 1305 | vfs_dq_quota_on_remount(s); | ||
| 1298 | finish_unfinished(s); | 1306 | finish_unfinished(s); |
| 1299 | reiserfs_xattr_init(s, *mount_flags); | 1307 | reiserfs_xattr_init(s, *mount_flags); |
| 1300 | } | 1308 | } |
diff --git a/fs/super.c b/fs/super.c index 69688b15f1fa..a38e6e9b6f69 100644 --- a/fs/super.c +++ b/fs/super.c | |||
| @@ -524,7 +524,7 @@ rescan: | |||
| 524 | int do_remount_sb(struct super_block *sb, int flags, void *data, int force) | 524 | int do_remount_sb(struct super_block *sb, int flags, void *data, int force) |
| 525 | { | 525 | { |
| 526 | int retval; | 526 | int retval; |
| 527 | int remount_rw, remount_ro; | 527 | int remount_ro; |
| 528 | 528 | ||
| 529 | if (sb->s_frozen != SB_UNFROZEN) | 529 | if (sb->s_frozen != SB_UNFROZEN) |
| 530 | return -EBUSY; | 530 | return -EBUSY; |
| @@ -540,7 +540,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) | |||
| 540 | sync_filesystem(sb); | 540 | sync_filesystem(sb); |
| 541 | 541 | ||
| 542 | remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY); | 542 | remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY); |
| 543 | remount_rw = !(flags & MS_RDONLY) && (sb->s_flags & MS_RDONLY); | ||
| 544 | 543 | ||
| 545 | /* If we are remounting RDONLY and current sb is read/write, | 544 | /* If we are remounting RDONLY and current sb is read/write, |
| 546 | make sure there are no rw files opened */ | 545 | make sure there are no rw files opened */ |
| @@ -549,9 +548,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) | |||
| 549 | mark_files_ro(sb); | 548 | mark_files_ro(sb); |
| 550 | else if (!fs_may_remount_ro(sb)) | 549 | else if (!fs_may_remount_ro(sb)) |
| 551 | return -EBUSY; | 550 | return -EBUSY; |
| 552 | retval = vfs_dq_off(sb, 1); | ||
| 553 | if (retval < 0 && retval != -ENOSYS) | ||
| 554 | return -EBUSY; | ||
| 555 | } | 551 | } |
| 556 | 552 | ||
| 557 | if (sb->s_op->remount_fs) { | 553 | if (sb->s_op->remount_fs) { |
| @@ -560,8 +556,7 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) | |||
| 560 | return retval; | 556 | return retval; |
| 561 | } | 557 | } |
| 562 | sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK); | 558 | sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK); |
| 563 | if (remount_rw) | 559 | |
| 564 | vfs_dq_quota_on_remount(sb); | ||
| 565 | /* | 560 | /* |
| 566 | * Some filesystems modify their metadata via some other path than the | 561 | * Some filesystems modify their metadata via some other path than the |
| 567 | * bdev buffer cache (eg. use a private mapping, or directories in | 562 | * bdev buffer cache (eg. use a private mapping, or directories in |
diff --git a/fs/udf/super.c b/fs/udf/super.c index 1e4543cbcd27..9ab4e259404b 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | #include <linux/vmalloc.h> | 54 | #include <linux/vmalloc.h> |
| 55 | #include <linux/errno.h> | 55 | #include <linux/errno.h> |
| 56 | #include <linux/mount.h> | 56 | #include <linux/mount.h> |
| 57 | #include <linux/quotaops.h> | ||
| 57 | #include <linux/seq_file.h> | 58 | #include <linux/seq_file.h> |
| 58 | #include <linux/bitmap.h> | 59 | #include <linux/bitmap.h> |
| 59 | #include <linux/crc-itu-t.h> | 60 | #include <linux/crc-itu-t.h> |
| @@ -557,6 +558,7 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | |||
| 557 | { | 558 | { |
| 558 | struct udf_options uopt; | 559 | struct udf_options uopt; |
| 559 | struct udf_sb_info *sbi = UDF_SB(sb); | 560 | struct udf_sb_info *sbi = UDF_SB(sb); |
| 561 | int error = 0; | ||
| 560 | 562 | ||
| 561 | uopt.flags = sbi->s_flags; | 563 | uopt.flags = sbi->s_flags; |
| 562 | uopt.uid = sbi->s_uid; | 564 | uopt.uid = sbi->s_uid; |
| @@ -582,17 +584,26 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | |||
| 582 | *flags |= MS_RDONLY; | 584 | *flags |= MS_RDONLY; |
| 583 | } | 585 | } |
| 584 | 586 | ||
| 585 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { | 587 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) |
| 586 | unlock_kernel(); | 588 | goto out_unlock; |
| 587 | return 0; | 589 | |
| 588 | } | 590 | if (*flags & MS_RDONLY) { |
| 589 | if (*flags & MS_RDONLY) | ||
| 590 | udf_close_lvid(sb); | 591 | udf_close_lvid(sb); |
| 591 | else | 592 | |
| 593 | error = vfs_dq_off(sb, 1); | ||
| 594 | if (error < 0 && error != -ENOSYS) | ||
| 595 | error = -EBUSY; | ||
| 596 | } else { | ||
| 592 | udf_open_lvid(sb); | 597 | udf_open_lvid(sb); |
| 593 | 598 | ||
| 599 | /* mark the fs r/w for quota activity */ | ||
| 600 | sb->s_flags &= ~MS_RDONLY; | ||
| 601 | vfs_dq_quota_on_remount(sb); | ||
| 602 | } | ||
| 603 | |||
| 604 | out_unlock: | ||
| 594 | unlock_kernel(); | 605 | unlock_kernel(); |
| 595 | return 0; | 606 | return error; |
| 596 | } | 607 | } |
| 597 | 608 | ||
| 598 | /* Check Volume Structure Descriptors (ECMA 167 2/9.1) */ | 609 | /* Check Volume Structure Descriptors (ECMA 167 2/9.1) */ |
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index 14743d935a93..be1f7b05bc28 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
| @@ -1248,7 +1248,9 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
| 1248 | struct ufs_super_block_first * usb1; | 1248 | struct ufs_super_block_first * usb1; |
| 1249 | struct ufs_super_block_third * usb3; | 1249 | struct ufs_super_block_third * usb3; |
| 1250 | unsigned new_mount_opt, ufstype; | 1250 | unsigned new_mount_opt, ufstype; |
| 1251 | int enable_quota = 0; | ||
| 1251 | unsigned flags; | 1252 | unsigned flags; |
| 1253 | int err; | ||
| 1252 | 1254 | ||
| 1253 | lock_kernel(); | 1255 | lock_kernel(); |
| 1254 | lock_super(sb); | 1256 | lock_super(sb); |
| @@ -1289,6 +1291,13 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
| 1289 | * fs was mouted as rw, remounting ro | 1291 | * fs was mouted as rw, remounting ro |
| 1290 | */ | 1292 | */ |
| 1291 | if (*mount_flags & MS_RDONLY) { | 1293 | if (*mount_flags & MS_RDONLY) { |
| 1294 | err = vfs_dq_off(sb, 1); | ||
| 1295 | if (err < 0 && err != -ENOSYS) { | ||
| 1296 | unlock_super(sb); | ||
| 1297 | unlock_kernel(); | ||
| 1298 | return -EBUSY; | ||
| 1299 | } | ||
| 1300 | |||
| 1292 | ufs_put_super_internal(sb); | 1301 | ufs_put_super_internal(sb); |
| 1293 | usb1->fs_time = cpu_to_fs32(sb, get_seconds()); | 1302 | usb1->fs_time = cpu_to_fs32(sb, get_seconds()); |
| 1294 | if ((flags & UFS_ST_MASK) == UFS_ST_SUN | 1303 | if ((flags & UFS_ST_MASK) == UFS_ST_SUN |
| @@ -1327,11 +1336,14 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
| 1327 | return -EPERM; | 1336 | return -EPERM; |
| 1328 | } | 1337 | } |
| 1329 | sb->s_flags &= ~MS_RDONLY; | 1338 | sb->s_flags &= ~MS_RDONLY; |
| 1339 | enable_quota = 1; | ||
| 1330 | #endif | 1340 | #endif |
| 1331 | } | 1341 | } |
| 1332 | UFS_SB(sb)->s_mount_opt = new_mount_opt; | 1342 | UFS_SB(sb)->s_mount_opt = new_mount_opt; |
| 1333 | unlock_super(sb); | 1343 | unlock_super(sb); |
| 1334 | unlock_kernel(); | 1344 | unlock_kernel(); |
| 1345 | if (enable_quota) | ||
| 1346 | vfs_dq_quota_on_remount(sb); | ||
| 1335 | return 0; | 1347 | return 0; |
| 1336 | } | 1348 | } |
| 1337 | 1349 | ||
