diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-30 12:11:11 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-30 12:11:11 -0400 |
commit | d28619f1563140526e2f84eae436f39206f40a69 (patch) | |
tree | d93284016a0983c8f27b745a3c50738617e50995 | |
parent | 021fad8b706849c091f6e682bc5df3ce4f9ab4d7 (diff) | |
parent | f32764bd2bbb6ea003c158b1d276b4dc9f900348 (diff) |
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6:
quota: Convert quota statistics to generic percpu_counter
ext3 uses rb_node = NULL; to zero rb_root.
quota: Fixup dquot_transfer
reiserfs: Fix resuming of quotas on remount read-write
pohmelfs: Remove dead quota code
ufs: Remove dead quota code
udf: Remove dead quota code
quota: rename default quotactl methods to dquot_
quota: explicitly set ->dq_op and ->s_qcop
quota: drop remount argument to ->quota_on and ->quota_off
quota: move unmount handling into the filesystem
quota: kill the vfs_dq_off and vfs_dq_quota_on_remount wrappers
quota: move remount handling into the filesystem
ocfs2: Fix use after free on remount read-only
Fix up conflicts in fs/ext4/super.c and fs/ufs/file.c
-rw-r--r-- | drivers/staging/pohmelfs/inode.c | 8 | ||||
-rw-r--r-- | fs/ext2/super.c | 20 | ||||
-rw-r--r-- | fs/ext3/dir.c | 2 | ||||
-rw-r--r-- | fs/ext3/super.c | 38 | ||||
-rw-r--r-- | fs/ext4/super.c | 37 | ||||
-rw-r--r-- | fs/jfs/super.c | 16 | ||||
-rw-r--r-- | fs/ocfs2/super.c | 50 | ||||
-rw-r--r-- | fs/quota/dquot.c | 190 | ||||
-rw-r--r-- | fs/quota/quota.c | 4 | ||||
-rw-r--r-- | fs/reiserfs/super.c | 48 | ||||
-rw-r--r-- | fs/super.c | 13 | ||||
-rw-r--r-- | fs/udf/balloc.c | 43 | ||||
-rw-r--r-- | fs/udf/file.c | 26 | ||||
-rw-r--r-- | fs/udf/ialloc.c | 21 | ||||
-rw-r--r-- | fs/udf/inode.c | 5 | ||||
-rw-r--r-- | fs/udf/namei.c | 20 | ||||
-rw-r--r-- | fs/udf/super.c | 13 | ||||
-rw-r--r-- | fs/udf/udfdecl.h | 1 | ||||
-rw-r--r-- | fs/ufs/balloc.c | 24 | ||||
-rw-r--r-- | fs/ufs/file.c | 3 | ||||
-rw-r--r-- | fs/ufs/ialloc.c | 13 | ||||
-rw-r--r-- | fs/ufs/inode.c | 4 | ||||
-rw-r--r-- | fs/ufs/namei.c | 16 | ||||
-rw-r--r-- | fs/ufs/super.c | 110 | ||||
-rw-r--r-- | fs/ufs/truncate.c | 10 | ||||
-rw-r--r-- | include/linux/quota.h | 20 | ||||
-rw-r--r-- | include/linux/quotaops.h | 79 |
27 files changed, 274 insertions, 560 deletions
diff --git a/drivers/staging/pohmelfs/inode.c b/drivers/staging/pohmelfs/inode.c index e92595eff1b8..643b413d9f0f 100644 --- a/drivers/staging/pohmelfs/inode.c +++ b/drivers/staging/pohmelfs/inode.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
30 | #include <linux/statfs.h> | 30 | #include <linux/statfs.h> |
31 | #include <linux/writeback.h> | 31 | #include <linux/writeback.h> |
32 | #include <linux/quotaops.h> | ||
33 | 32 | ||
34 | #include "netfs.h" | 33 | #include "netfs.h" |
35 | 34 | ||
@@ -969,13 +968,6 @@ int pohmelfs_setattr_raw(struct inode *inode, struct iattr *attr) | |||
969 | goto err_out_exit; | 968 | goto err_out_exit; |
970 | } | 969 | } |
971 | 970 | ||
972 | if ((attr->ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || | ||
973 | (attr->ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { | ||
974 | err = dquot_transfer(inode, attr); | ||
975 | if (err) | ||
976 | goto err_out_exit; | ||
977 | } | ||
978 | |||
979 | err = inode_setattr(inode, attr); | 971 | err = inode_setattr(inode, attr); |
980 | if (err) { | 972 | if (err) { |
981 | dprintk("%s: ino: %llu, failed to set the attributes.\n", __func__, POHMELFS_I(inode)->ino); | 973 | dprintk("%s: ino: %llu, failed to set the attributes.\n", __func__, POHMELFS_I(inode)->ino); |
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 71e9eb1fa696..7ff43f4a59cd 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
@@ -119,6 +119,8 @@ static void ext2_put_super (struct super_block * sb) | |||
119 | int i; | 119 | int i; |
120 | struct ext2_sb_info *sbi = EXT2_SB(sb); | 120 | struct ext2_sb_info *sbi = EXT2_SB(sb); |
121 | 121 | ||
122 | dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); | ||
123 | |||
122 | if (sb->s_dirt) | 124 | if (sb->s_dirt) |
123 | ext2_write_super(sb); | 125 | ext2_write_super(sb); |
124 | 126 | ||
@@ -1063,6 +1065,12 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) | |||
1063 | sb->s_op = &ext2_sops; | 1065 | sb->s_op = &ext2_sops; |
1064 | sb->s_export_op = &ext2_export_ops; | 1066 | sb->s_export_op = &ext2_export_ops; |
1065 | sb->s_xattr = ext2_xattr_handlers; | 1067 | sb->s_xattr = ext2_xattr_handlers; |
1068 | |||
1069 | #ifdef CONFIG_QUOTA | ||
1070 | sb->dq_op = &dquot_operations; | ||
1071 | sb->s_qcop = &dquot_quotactl_ops; | ||
1072 | #endif | ||
1073 | |||
1066 | root = ext2_iget(sb, EXT2_ROOT_INO); | 1074 | root = ext2_iget(sb, EXT2_ROOT_INO); |
1067 | if (IS_ERR(root)) { | 1075 | if (IS_ERR(root)) { |
1068 | ret = PTR_ERR(root); | 1076 | ret = PTR_ERR(root); |
@@ -1241,6 +1249,7 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
1241 | spin_unlock(&sbi->s_lock); | 1249 | spin_unlock(&sbi->s_lock); |
1242 | return 0; | 1250 | return 0; |
1243 | } | 1251 | } |
1252 | |||
1244 | /* | 1253 | /* |
1245 | * OK, we are remounting a valid rw partition rdonly, so set | 1254 | * OK, we are remounting a valid rw partition rdonly, so set |
1246 | * the rdonly flag and then mark the partition as valid again. | 1255 | * the rdonly flag and then mark the partition as valid again. |
@@ -1248,6 +1257,13 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
1248 | es->s_state = cpu_to_le16(sbi->s_mount_state); | 1257 | es->s_state = cpu_to_le16(sbi->s_mount_state); |
1249 | es->s_mtime = cpu_to_le32(get_seconds()); | 1258 | es->s_mtime = cpu_to_le32(get_seconds()); |
1250 | spin_unlock(&sbi->s_lock); | 1259 | spin_unlock(&sbi->s_lock); |
1260 | |||
1261 | err = dquot_suspend(sb, -1); | ||
1262 | if (err < 0) { | ||
1263 | spin_lock(&sbi->s_lock); | ||
1264 | goto restore_opts; | ||
1265 | } | ||
1266 | |||
1251 | ext2_sync_super(sb, es, 1); | 1267 | ext2_sync_super(sb, es, 1); |
1252 | } else { | 1268 | } else { |
1253 | __le32 ret = EXT2_HAS_RO_COMPAT_FEATURE(sb, | 1269 | __le32 ret = EXT2_HAS_RO_COMPAT_FEATURE(sb, |
@@ -1269,8 +1285,12 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
1269 | if (!ext2_setup_super (sb, es, 0)) | 1285 | if (!ext2_setup_super (sb, es, 0)) |
1270 | sb->s_flags &= ~MS_RDONLY; | 1286 | sb->s_flags &= ~MS_RDONLY; |
1271 | spin_unlock(&sbi->s_lock); | 1287 | spin_unlock(&sbi->s_lock); |
1288 | |||
1272 | ext2_write_super(sb); | 1289 | ext2_write_super(sb); |
1290 | |||
1291 | dquot_resume(sb, -1); | ||
1273 | } | 1292 | } |
1293 | |||
1274 | return 0; | 1294 | return 0; |
1275 | restore_opts: | 1295 | restore_opts: |
1276 | sbi->s_mount_opt = old_opts.s_mount_opt; | 1296 | sbi->s_mount_opt = old_opts.s_mount_opt; |
diff --git a/fs/ext3/dir.c b/fs/ext3/dir.c index 373fa90c796a..e2e72c367cf6 100644 --- a/fs/ext3/dir.c +++ b/fs/ext3/dir.c | |||
@@ -297,7 +297,7 @@ static void free_rb_tree_fname(struct rb_root *root) | |||
297 | kfree (old); | 297 | kfree (old); |
298 | } | 298 | } |
299 | if (!parent) | 299 | if (!parent) |
300 | root->rb_node = NULL; | 300 | *root = RB_ROOT; |
301 | else if (parent->rb_left == n) | 301 | else if (parent->rb_left == n) |
302 | parent->rb_left = NULL; | 302 | parent->rb_left = NULL; |
303 | else if (parent->rb_right == n) | 303 | else if (parent->rb_right == n) |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 0fc1293d0e96..6c953bb255e7 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -410,6 +410,8 @@ static void ext3_put_super (struct super_block * sb) | |||
410 | struct ext3_super_block *es = sbi->s_es; | 410 | struct ext3_super_block *es = sbi->s_es; |
411 | int i, err; | 411 | int i, err; |
412 | 412 | ||
413 | dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); | ||
414 | |||
413 | lock_kernel(); | 415 | lock_kernel(); |
414 | 416 | ||
415 | ext3_xattr_put_super(sb); | 417 | ext3_xattr_put_super(sb); |
@@ -748,7 +750,7 @@ static int ext3_release_dquot(struct dquot *dquot); | |||
748 | static int ext3_mark_dquot_dirty(struct dquot *dquot); | 750 | static int ext3_mark_dquot_dirty(struct dquot *dquot); |
749 | static int ext3_write_info(struct super_block *sb, int type); | 751 | static int ext3_write_info(struct super_block *sb, int type); |
750 | static int ext3_quota_on(struct super_block *sb, int type, int format_id, | 752 | static int ext3_quota_on(struct super_block *sb, int type, int format_id, |
751 | char *path, int remount); | 753 | char *path); |
752 | static int ext3_quota_on_mount(struct super_block *sb, int type); | 754 | static int ext3_quota_on_mount(struct super_block *sb, int type); |
753 | static ssize_t ext3_quota_read(struct super_block *sb, int type, char *data, | 755 | static ssize_t ext3_quota_read(struct super_block *sb, int type, char *data, |
754 | size_t len, loff_t off); | 756 | size_t len, loff_t off); |
@@ -767,12 +769,12 @@ static const struct dquot_operations ext3_quota_operations = { | |||
767 | 769 | ||
768 | static const struct quotactl_ops ext3_qctl_operations = { | 770 | static const struct quotactl_ops ext3_qctl_operations = { |
769 | .quota_on = ext3_quota_on, | 771 | .quota_on = ext3_quota_on, |
770 | .quota_off = vfs_quota_off, | 772 | .quota_off = dquot_quota_off, |
771 | .quota_sync = vfs_quota_sync, | 773 | .quota_sync = dquot_quota_sync, |
772 | .get_info = vfs_get_dqinfo, | 774 | .get_info = dquot_get_dqinfo, |
773 | .set_info = vfs_set_dqinfo, | 775 | .set_info = dquot_set_dqinfo, |
774 | .get_dqblk = vfs_get_dqblk, | 776 | .get_dqblk = dquot_get_dqblk, |
775 | .set_dqblk = vfs_set_dqblk | 777 | .set_dqblk = dquot_set_dqblk |
776 | }; | 778 | }; |
777 | #endif | 779 | #endif |
778 | 780 | ||
@@ -1527,7 +1529,7 @@ static void ext3_orphan_cleanup (struct super_block * sb, | |||
1527 | /* Turn quotas off */ | 1529 | /* Turn quotas off */ |
1528 | for (i = 0; i < MAXQUOTAS; i++) { | 1530 | for (i = 0; i < MAXQUOTAS; i++) { |
1529 | if (sb_dqopt(sb)->files[i]) | 1531 | if (sb_dqopt(sb)->files[i]) |
1530 | vfs_quota_off(sb, i, 0); | 1532 | dquot_quota_off(sb, i); |
1531 | } | 1533 | } |
1532 | #endif | 1534 | #endif |
1533 | sb->s_flags = s_flags; /* Restore MS_RDONLY status */ | 1535 | sb->s_flags = s_flags; /* Restore MS_RDONLY status */ |
@@ -2551,6 +2553,7 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) | |||
2551 | ext3_fsblk_t n_blocks_count = 0; | 2553 | ext3_fsblk_t n_blocks_count = 0; |
2552 | unsigned long old_sb_flags; | 2554 | unsigned long old_sb_flags; |
2553 | struct ext3_mount_options old_opts; | 2555 | struct ext3_mount_options old_opts; |
2556 | int enable_quota = 0; | ||
2554 | int err; | 2557 | int err; |
2555 | #ifdef CONFIG_QUOTA | 2558 | #ifdef CONFIG_QUOTA |
2556 | int i; | 2559 | int i; |
@@ -2597,6 +2600,10 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) | |||
2597 | } | 2600 | } |
2598 | 2601 | ||
2599 | if (*flags & MS_RDONLY) { | 2602 | if (*flags & MS_RDONLY) { |
2603 | err = dquot_suspend(sb, -1); | ||
2604 | if (err < 0) | ||
2605 | goto restore_opts; | ||
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 | dquot_resume(sb, -1); | ||
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; |
@@ -2851,24 +2862,21 @@ static int ext3_write_info(struct super_block *sb, int type) | |||
2851 | */ | 2862 | */ |
2852 | static int ext3_quota_on_mount(struct super_block *sb, int type) | 2863 | static int ext3_quota_on_mount(struct super_block *sb, int type) |
2853 | { | 2864 | { |
2854 | return vfs_quota_on_mount(sb, EXT3_SB(sb)->s_qf_names[type], | 2865 | return dquot_quota_on_mount(sb, EXT3_SB(sb)->s_qf_names[type], |
2855 | EXT3_SB(sb)->s_jquota_fmt, type); | 2866 | EXT3_SB(sb)->s_jquota_fmt, type); |
2856 | } | 2867 | } |
2857 | 2868 | ||
2858 | /* | 2869 | /* |
2859 | * Standard function to be called on quota_on | 2870 | * Standard function to be called on quota_on |
2860 | */ | 2871 | */ |
2861 | static int ext3_quota_on(struct super_block *sb, int type, int format_id, | 2872 | static int ext3_quota_on(struct super_block *sb, int type, int format_id, |
2862 | char *name, int remount) | 2873 | char *name) |
2863 | { | 2874 | { |
2864 | int err; | 2875 | int err; |
2865 | struct path path; | 2876 | struct path path; |
2866 | 2877 | ||
2867 | if (!test_opt(sb, QUOTA)) | 2878 | if (!test_opt(sb, QUOTA)) |
2868 | return -EINVAL; | 2879 | return -EINVAL; |
2869 | /* When remounting, no checks are needed and in fact, name is NULL */ | ||
2870 | if (remount) | ||
2871 | return vfs_quota_on(sb, type, format_id, name, remount); | ||
2872 | 2880 | ||
2873 | err = kern_path(name, LOOKUP_FOLLOW, &path); | 2881 | err = kern_path(name, LOOKUP_FOLLOW, &path); |
2874 | if (err) | 2882 | if (err) |
@@ -2906,7 +2914,7 @@ static int ext3_quota_on(struct super_block *sb, int type, int format_id, | |||
2906 | } | 2914 | } |
2907 | } | 2915 | } |
2908 | 2916 | ||
2909 | err = vfs_quota_on_path(sb, type, format_id, &path); | 2917 | err = dquot_quota_on_path(sb, type, format_id, &path); |
2910 | path_put(&path); | 2918 | path_put(&path); |
2911 | return err; | 2919 | return err; |
2912 | } | 2920 | } |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 49d88c0597c4..4e8983a9811b 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -646,6 +646,8 @@ static void ext4_put_super(struct super_block *sb) | |||
646 | struct ext4_super_block *es = sbi->s_es; | 646 | struct ext4_super_block *es = sbi->s_es; |
647 | int i, err; | 647 | int i, err; |
648 | 648 | ||
649 | dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); | ||
650 | |||
649 | flush_workqueue(sbi->dio_unwritten_wq); | 651 | flush_workqueue(sbi->dio_unwritten_wq); |
650 | destroy_workqueue(sbi->dio_unwritten_wq); | 652 | destroy_workqueue(sbi->dio_unwritten_wq); |
651 | 653 | ||
@@ -1062,7 +1064,7 @@ static int ext4_release_dquot(struct dquot *dquot); | |||
1062 | static int ext4_mark_dquot_dirty(struct dquot *dquot); | 1064 | static int ext4_mark_dquot_dirty(struct dquot *dquot); |
1063 | static int ext4_write_info(struct super_block *sb, int type); | 1065 | static int ext4_write_info(struct super_block *sb, int type); |
1064 | static int ext4_quota_on(struct super_block *sb, int type, int format_id, | 1066 | static int ext4_quota_on(struct super_block *sb, int type, int format_id, |
1065 | char *path, int remount); | 1067 | char *path); |
1066 | static int ext4_quota_on_mount(struct super_block *sb, int type); | 1068 | static int ext4_quota_on_mount(struct super_block *sb, int type); |
1067 | static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data, | 1069 | static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data, |
1068 | size_t len, loff_t off); | 1070 | size_t len, loff_t off); |
@@ -1084,12 +1086,12 @@ static const struct dquot_operations ext4_quota_operations = { | |||
1084 | 1086 | ||
1085 | static const struct quotactl_ops ext4_qctl_operations = { | 1087 | static const struct quotactl_ops ext4_qctl_operations = { |
1086 | .quota_on = ext4_quota_on, | 1088 | .quota_on = ext4_quota_on, |
1087 | .quota_off = vfs_quota_off, | 1089 | .quota_off = dquot_quota_off, |
1088 | .quota_sync = vfs_quota_sync, | 1090 | .quota_sync = dquot_quota_sync, |
1089 | .get_info = vfs_get_dqinfo, | 1091 | .get_info = dquot_get_dqinfo, |
1090 | .set_info = vfs_set_dqinfo, | 1092 | .set_info = dquot_set_dqinfo, |
1091 | .get_dqblk = vfs_get_dqblk, | 1093 | .get_dqblk = dquot_get_dqblk, |
1092 | .set_dqblk = vfs_set_dqblk | 1094 | .set_dqblk = dquot_set_dqblk |
1093 | }; | 1095 | }; |
1094 | #endif | 1096 | #endif |
1095 | 1097 | ||
@@ -2054,7 +2056,7 @@ static void ext4_orphan_cleanup(struct super_block *sb, | |||
2054 | /* Turn quotas off */ | 2056 | /* Turn quotas off */ |
2055 | for (i = 0; i < MAXQUOTAS; i++) { | 2057 | for (i = 0; i < MAXQUOTAS; i++) { |
2056 | if (sb_dqopt(sb)->files[i]) | 2058 | if (sb_dqopt(sb)->files[i]) |
2057 | vfs_quota_off(sb, i, 0); | 2059 | dquot_quota_off(sb, i); |
2058 | } | 2060 | } |
2059 | #endif | 2061 | #endif |
2060 | sb->s_flags = s_flags; /* Restore MS_RDONLY status */ | 2062 | sb->s_flags = s_flags; /* Restore MS_RDONLY status */ |
@@ -3576,6 +3578,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
3576 | ext4_fsblk_t n_blocks_count = 0; | 3578 | ext4_fsblk_t n_blocks_count = 0; |
3577 | unsigned long old_sb_flags; | 3579 | unsigned long old_sb_flags; |
3578 | struct ext4_mount_options old_opts; | 3580 | struct ext4_mount_options old_opts; |
3581 | int enable_quota = 0; | ||
3579 | ext4_group_t g; | 3582 | ext4_group_t g; |
3580 | unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; | 3583 | unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; |
3581 | int err; | 3584 | int err; |
@@ -3633,6 +3636,10 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
3633 | } | 3636 | } |
3634 | 3637 | ||
3635 | if (*flags & MS_RDONLY) { | 3638 | if (*flags & MS_RDONLY) { |
3639 | err = dquot_suspend(sb, -1); | ||
3640 | if (err < 0) | ||
3641 | goto restore_opts; | ||
3642 | |||
3636 | /* | 3643 | /* |
3637 | * First of all, the unconditional stuff we have to do | 3644 | * First of all, the unconditional stuff we have to do |
3638 | * to disable replay of the journal when we next remount | 3645 | * to disable replay of the journal when we next remount |
@@ -3701,6 +3708,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
3701 | goto restore_opts; | 3708 | goto restore_opts; |
3702 | if (!ext4_setup_super(sb, es, 0)) | 3709 | if (!ext4_setup_super(sb, es, 0)) |
3703 | sb->s_flags &= ~MS_RDONLY; | 3710 | sb->s_flags &= ~MS_RDONLY; |
3711 | enable_quota = 1; | ||
3704 | } | 3712 | } |
3705 | } | 3713 | } |
3706 | ext4_setup_system_zone(sb); | 3714 | ext4_setup_system_zone(sb); |
@@ -3716,6 +3724,8 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
3716 | #endif | 3724 | #endif |
3717 | unlock_super(sb); | 3725 | unlock_super(sb); |
3718 | unlock_kernel(); | 3726 | unlock_kernel(); |
3727 | if (enable_quota) | ||
3728 | dquot_resume(sb, -1); | ||
3719 | 3729 | ||
3720 | ext4_msg(sb, KERN_INFO, "re-mounted. Opts: %s", orig_data); | 3730 | ext4_msg(sb, KERN_INFO, "re-mounted. Opts: %s", orig_data); |
3721 | kfree(orig_data); | 3731 | kfree(orig_data); |
@@ -3913,24 +3923,21 @@ static int ext4_write_info(struct super_block *sb, int type) | |||
3913 | */ | 3923 | */ |
3914 | static int ext4_quota_on_mount(struct super_block *sb, int type) | 3924 | static int ext4_quota_on_mount(struct super_block *sb, int type) |
3915 | { | 3925 | { |
3916 | return vfs_quota_on_mount(sb, EXT4_SB(sb)->s_qf_names[type], | 3926 | return dquot_quota_on_mount(sb, EXT4_SB(sb)->s_qf_names[type], |
3917 | EXT4_SB(sb)->s_jquota_fmt, type); | 3927 | EXT4_SB(sb)->s_jquota_fmt, type); |
3918 | } | 3928 | } |
3919 | 3929 | ||
3920 | /* | 3930 | /* |
3921 | * Standard function to be called on quota_on | 3931 | * Standard function to be called on quota_on |
3922 | */ | 3932 | */ |
3923 | static int ext4_quota_on(struct super_block *sb, int type, int format_id, | 3933 | static int ext4_quota_on(struct super_block *sb, int type, int format_id, |
3924 | char *name, int remount) | 3934 | char *name) |
3925 | { | 3935 | { |
3926 | int err; | 3936 | int err; |
3927 | struct path path; | 3937 | struct path path; |
3928 | 3938 | ||
3929 | if (!test_opt(sb, QUOTA)) | 3939 | if (!test_opt(sb, QUOTA)) |
3930 | return -EINVAL; | 3940 | return -EINVAL; |
3931 | /* When remounting, no checks are needed and in fact, name is NULL */ | ||
3932 | if (remount) | ||
3933 | return vfs_quota_on(sb, type, format_id, name, remount); | ||
3934 | 3941 | ||
3935 | err = kern_path(name, LOOKUP_FOLLOW, &path); | 3942 | err = kern_path(name, LOOKUP_FOLLOW, &path); |
3936 | if (err) | 3943 | if (err) |
@@ -3969,7 +3976,7 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id, | |||
3969 | } | 3976 | } |
3970 | } | 3977 | } |
3971 | 3978 | ||
3972 | err = vfs_quota_on_path(sb, type, format_id, &path); | 3979 | err = dquot_quota_on_path(sb, type, format_id, &path); |
3973 | path_put(&path); | 3980 | path_put(&path); |
3974 | return err; | 3981 | return err; |
3975 | } | 3982 | } |
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index b66832ac33ac..b38f96bef829 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
@@ -179,6 +179,8 @@ static void jfs_put_super(struct super_block *sb) | |||
179 | 179 | ||
180 | jfs_info("In jfs_put_super"); | 180 | jfs_info("In jfs_put_super"); |
181 | 181 | ||
182 | dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); | ||
183 | |||
182 | lock_kernel(); | 184 | lock_kernel(); |
183 | 185 | ||
184 | rc = jfs_umount(sb); | 186 | rc = jfs_umount(sb); |
@@ -396,10 +398,20 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data) | |||
396 | 398 | ||
397 | JFS_SBI(sb)->flag = flag; | 399 | JFS_SBI(sb)->flag = flag; |
398 | ret = jfs_mount_rw(sb, 1); | 400 | ret = jfs_mount_rw(sb, 1); |
401 | |||
402 | /* mark the fs r/w for quota activity */ | ||
403 | sb->s_flags &= ~MS_RDONLY; | ||
404 | |||
399 | unlock_kernel(); | 405 | unlock_kernel(); |
406 | dquot_resume(sb, -1); | ||
400 | return ret; | 407 | return ret; |
401 | } | 408 | } |
402 | if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) { | 409 | if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) { |
410 | rc = dquot_suspend(sb, -1); | ||
411 | if (rc < 0) { | ||
412 | unlock_kernel(); | ||
413 | return rc; | ||
414 | } | ||
403 | rc = jfs_umount_rw(sb); | 415 | rc = jfs_umount_rw(sb); |
404 | JFS_SBI(sb)->flag = flag; | 416 | JFS_SBI(sb)->flag = flag; |
405 | unlock_kernel(); | 417 | unlock_kernel(); |
@@ -469,6 +481,10 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) | |||
469 | */ | 481 | */ |
470 | sb->s_op = &jfs_super_operations; | 482 | sb->s_op = &jfs_super_operations; |
471 | sb->s_export_op = &jfs_export_operations; | 483 | sb->s_export_op = &jfs_export_operations; |
484 | #ifdef CONFIG_QUOTA | ||
485 | sb->dq_op = &dquot_operations; | ||
486 | sb->s_qcop = &dquot_quotactl_ops; | ||
487 | #endif | ||
472 | 488 | ||
473 | /* | 489 | /* |
474 | * Initialize direct-mapping inode/address-space | 490 | * Initialize direct-mapping inode/address-space |
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 2c26ce251cb3..0eaa929a4dbf 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
@@ -879,13 +879,15 @@ static int ocfs2_susp_quotas(struct ocfs2_super *osb, int unsuspend) | |||
879 | if (!OCFS2_HAS_RO_COMPAT_FEATURE(sb, feature[type])) | 879 | if (!OCFS2_HAS_RO_COMPAT_FEATURE(sb, feature[type])) |
880 | continue; | 880 | continue; |
881 | if (unsuspend) | 881 | if (unsuspend) |
882 | status = vfs_quota_enable( | 882 | status = dquot_resume(sb, type); |
883 | sb_dqopt(sb)->files[type], | 883 | else { |
884 | type, QFMT_OCFS2, | 884 | struct ocfs2_mem_dqinfo *oinfo; |
885 | DQUOT_SUSPENDED); | 885 | |
886 | else | 886 | /* Cancel periodic syncing before suspending */ |
887 | status = vfs_quota_disable(sb, type, | 887 | oinfo = sb_dqinfo(sb, type)->dqi_priv; |
888 | DQUOT_SUSPENDED); | 888 | cancel_delayed_work_sync(&oinfo->dqi_sync_work); |
889 | status = dquot_suspend(sb, type); | ||
890 | } | ||
889 | if (status < 0) | 891 | if (status < 0) |
890 | break; | 892 | break; |
891 | } | 893 | } |
@@ -916,8 +918,8 @@ static int ocfs2_enable_quotas(struct ocfs2_super *osb) | |||
916 | status = -ENOENT; | 918 | status = -ENOENT; |
917 | goto out_quota_off; | 919 | goto out_quota_off; |
918 | } | 920 | } |
919 | status = vfs_quota_enable(inode[type], type, QFMT_OCFS2, | 921 | status = dquot_enable(inode[type], type, QFMT_OCFS2, |
920 | DQUOT_USAGE_ENABLED); | 922 | DQUOT_USAGE_ENABLED); |
921 | if (status < 0) | 923 | if (status < 0) |
922 | goto out_quota_off; | 924 | goto out_quota_off; |
923 | } | 925 | } |
@@ -952,8 +954,8 @@ static void ocfs2_disable_quotas(struct ocfs2_super *osb) | |||
952 | /* Turn off quotas. This will remove all dquot structures from | 954 | /* Turn off quotas. This will remove all dquot structures from |
953 | * memory and so they will be automatically synced to global | 955 | * memory and so they will be automatically synced to global |
954 | * quota files */ | 956 | * quota files */ |
955 | vfs_quota_disable(sb, type, DQUOT_USAGE_ENABLED | | 957 | dquot_disable(sb, type, DQUOT_USAGE_ENABLED | |
956 | DQUOT_LIMITS_ENABLED); | 958 | DQUOT_LIMITS_ENABLED); |
957 | if (!inode) | 959 | if (!inode) |
958 | continue; | 960 | continue; |
959 | iput(inode); | 961 | iput(inode); |
@@ -962,7 +964,7 @@ static void ocfs2_disable_quotas(struct ocfs2_super *osb) | |||
962 | 964 | ||
963 | /* Handle quota on quotactl */ | 965 | /* Handle quota on quotactl */ |
964 | static int ocfs2_quota_on(struct super_block *sb, int type, int format_id, | 966 | static int ocfs2_quota_on(struct super_block *sb, int type, int format_id, |
965 | char *path, int remount) | 967 | char *path) |
966 | { | 968 | { |
967 | unsigned int feature[MAXQUOTAS] = { OCFS2_FEATURE_RO_COMPAT_USRQUOTA, | 969 | unsigned int feature[MAXQUOTAS] = { OCFS2_FEATURE_RO_COMPAT_USRQUOTA, |
968 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA}; | 970 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA}; |
@@ -970,30 +972,24 @@ static int ocfs2_quota_on(struct super_block *sb, int type, int format_id, | |||
970 | if (!OCFS2_HAS_RO_COMPAT_FEATURE(sb, feature[type])) | 972 | if (!OCFS2_HAS_RO_COMPAT_FEATURE(sb, feature[type])) |
971 | return -EINVAL; | 973 | return -EINVAL; |
972 | 974 | ||
973 | if (remount) | 975 | return dquot_enable(sb_dqopt(sb)->files[type], type, |
974 | return 0; /* Just ignore it has been handled in | 976 | format_id, DQUOT_LIMITS_ENABLED); |
975 | * ocfs2_remount() */ | ||
976 | return vfs_quota_enable(sb_dqopt(sb)->files[type], type, | ||
977 | format_id, DQUOT_LIMITS_ENABLED); | ||
978 | } | 977 | } |
979 | 978 | ||
980 | /* Handle quota off quotactl */ | 979 | /* Handle quota off quotactl */ |
981 | static int ocfs2_quota_off(struct super_block *sb, int type, int remount) | 980 | static int ocfs2_quota_off(struct super_block *sb, int type) |
982 | { | 981 | { |
983 | if (remount) | 982 | return dquot_disable(sb, type, DQUOT_LIMITS_ENABLED); |
984 | return 0; /* Ignore now and handle later in | ||
985 | * ocfs2_remount() */ | ||
986 | return vfs_quota_disable(sb, type, DQUOT_LIMITS_ENABLED); | ||
987 | } | 983 | } |
988 | 984 | ||
989 | static const struct quotactl_ops ocfs2_quotactl_ops = { | 985 | static const struct quotactl_ops ocfs2_quotactl_ops = { |
990 | .quota_on = ocfs2_quota_on, | 986 | .quota_on = ocfs2_quota_on, |
991 | .quota_off = ocfs2_quota_off, | 987 | .quota_off = ocfs2_quota_off, |
992 | .quota_sync = vfs_quota_sync, | 988 | .quota_sync = dquot_quota_sync, |
993 | .get_info = vfs_get_dqinfo, | 989 | .get_info = dquot_get_dqinfo, |
994 | .set_info = vfs_set_dqinfo, | 990 | .set_info = dquot_set_dqinfo, |
995 | .get_dqblk = vfs_get_dqblk, | 991 | .get_dqblk = dquot_get_dqblk, |
996 | .set_dqblk = vfs_set_dqblk, | 992 | .set_dqblk = dquot_set_dqblk, |
997 | }; | 993 | }; |
998 | 994 | ||
999 | static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | 995 | static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) |
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 1ad8bf076cfc..12c233da1b6b 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -228,10 +228,6 @@ static struct hlist_head *dquot_hash; | |||
228 | 228 | ||
229 | struct dqstats dqstats; | 229 | struct dqstats dqstats; |
230 | EXPORT_SYMBOL(dqstats); | 230 | EXPORT_SYMBOL(dqstats); |
231 | #ifdef CONFIG_SMP | ||
232 | struct dqstats *dqstats_pcpu; | ||
233 | EXPORT_SYMBOL(dqstats_pcpu); | ||
234 | #endif | ||
235 | 231 | ||
236 | static qsize_t inode_get_rsv_space(struct inode *inode); | 232 | static qsize_t inode_get_rsv_space(struct inode *inode); |
237 | static void __dquot_initialize(struct inode *inode, int type); | 233 | static void __dquot_initialize(struct inode *inode, int type); |
@@ -584,7 +580,7 @@ out: | |||
584 | } | 580 | } |
585 | EXPORT_SYMBOL(dquot_scan_active); | 581 | EXPORT_SYMBOL(dquot_scan_active); |
586 | 582 | ||
587 | int vfs_quota_sync(struct super_block *sb, int type, int wait) | 583 | int dquot_quota_sync(struct super_block *sb, int type, int wait) |
588 | { | 584 | { |
589 | struct list_head *dirty; | 585 | struct list_head *dirty; |
590 | struct dquot *dquot; | 586 | struct dquot *dquot; |
@@ -656,7 +652,7 @@ int vfs_quota_sync(struct super_block *sb, int type, int wait) | |||
656 | 652 | ||
657 | return 0; | 653 | return 0; |
658 | } | 654 | } |
659 | EXPORT_SYMBOL(vfs_quota_sync); | 655 | EXPORT_SYMBOL(dquot_quota_sync); |
660 | 656 | ||
661 | /* Free unused dquots from cache */ | 657 | /* Free unused dquots from cache */ |
662 | static void prune_dqcache(int count) | 658 | static void prune_dqcache(int count) |
@@ -676,27 +672,10 @@ static void prune_dqcache(int count) | |||
676 | } | 672 | } |
677 | } | 673 | } |
678 | 674 | ||
679 | static int dqstats_read(unsigned int type) | ||
680 | { | ||
681 | int count = 0; | ||
682 | #ifdef CONFIG_SMP | ||
683 | int cpu; | ||
684 | for_each_possible_cpu(cpu) | ||
685 | count += per_cpu_ptr(dqstats_pcpu, cpu)->stat[type]; | ||
686 | /* Statistics reading is racy, but absolute accuracy isn't required */ | ||
687 | if (count < 0) | ||
688 | count = 0; | ||
689 | #else | ||
690 | count = dqstats.stat[type]; | ||
691 | #endif | ||
692 | return count; | ||
693 | } | ||
694 | |||
695 | /* | 675 | /* |
696 | * This is called from kswapd when we think we need some | 676 | * This is called from kswapd when we think we need some |
697 | * more memory | 677 | * more memory |
698 | */ | 678 | */ |
699 | |||
700 | static int shrink_dqcache_memory(int nr, gfp_t gfp_mask) | 679 | static int shrink_dqcache_memory(int nr, gfp_t gfp_mask) |
701 | { | 680 | { |
702 | if (nr) { | 681 | if (nr) { |
@@ -704,7 +683,9 @@ static int shrink_dqcache_memory(int nr, gfp_t gfp_mask) | |||
704 | prune_dqcache(nr); | 683 | prune_dqcache(nr); |
705 | spin_unlock(&dq_list_lock); | 684 | spin_unlock(&dq_list_lock); |
706 | } | 685 | } |
707 | return (dqstats_read(DQST_FREE_DQUOTS)/100) * sysctl_vfs_cache_pressure; | 686 | return ((unsigned) |
687 | percpu_counter_read_positive(&dqstats.counter[DQST_FREE_DQUOTS]) | ||
688 | /100) * sysctl_vfs_cache_pressure; | ||
708 | } | 689 | } |
709 | 690 | ||
710 | static struct shrinker dqcache_shrinker = { | 691 | static struct shrinker dqcache_shrinker = { |
@@ -1815,7 +1796,7 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr) | |||
1815 | if (iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) | 1796 | if (iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) |
1816 | transfer_to[USRQUOTA] = dqget(sb, iattr->ia_uid, USRQUOTA); | 1797 | transfer_to[USRQUOTA] = dqget(sb, iattr->ia_uid, USRQUOTA); |
1817 | if (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid) | 1798 | if (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid) |
1818 | transfer_to[GRPQUOTA] = dqget(sb, iattr->ia_uid, GRPQUOTA); | 1799 | transfer_to[GRPQUOTA] = dqget(sb, iattr->ia_gid, GRPQUOTA); |
1819 | 1800 | ||
1820 | ret = __dquot_transfer(inode, transfer_to); | 1801 | ret = __dquot_transfer(inode, transfer_to); |
1821 | dqput_all(transfer_to); | 1802 | dqput_all(transfer_to); |
@@ -1850,6 +1831,7 @@ const struct dquot_operations dquot_operations = { | |||
1850 | .alloc_dquot = dquot_alloc, | 1831 | .alloc_dquot = dquot_alloc, |
1851 | .destroy_dquot = dquot_destroy, | 1832 | .destroy_dquot = dquot_destroy, |
1852 | }; | 1833 | }; |
1834 | EXPORT_SYMBOL(dquot_operations); | ||
1853 | 1835 | ||
1854 | /* | 1836 | /* |
1855 | * Generic helper for ->open on filesystems supporting disk quotas. | 1837 | * Generic helper for ->open on filesystems supporting disk quotas. |
@@ -1868,7 +1850,7 @@ EXPORT_SYMBOL(dquot_file_open); | |||
1868 | /* | 1850 | /* |
1869 | * Turn quota off on a device. type == -1 ==> quotaoff for all types (umount) | 1851 | * Turn quota off on a device. type == -1 ==> quotaoff for all types (umount) |
1870 | */ | 1852 | */ |
1871 | int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags) | 1853 | int dquot_disable(struct super_block *sb, int type, unsigned int flags) |
1872 | { | 1854 | { |
1873 | int cnt, ret = 0; | 1855 | int cnt, ret = 0; |
1874 | struct quota_info *dqopt = sb_dqopt(sb); | 1856 | struct quota_info *dqopt = sb_dqopt(sb); |
@@ -1998,14 +1980,15 @@ put_inodes: | |||
1998 | } | 1980 | } |
1999 | return ret; | 1981 | return ret; |
2000 | } | 1982 | } |
2001 | EXPORT_SYMBOL(vfs_quota_disable); | 1983 | EXPORT_SYMBOL(dquot_disable); |
2002 | 1984 | ||
2003 | int vfs_quota_off(struct super_block *sb, int type, int remount) | 1985 | int dquot_quota_off(struct super_block *sb, int type) |
2004 | { | 1986 | { |
2005 | return vfs_quota_disable(sb, type, remount ? DQUOT_SUSPENDED : | 1987 | return dquot_disable(sb, type, |
2006 | (DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED)); | 1988 | DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); |
2007 | } | 1989 | } |
2008 | EXPORT_SYMBOL(vfs_quota_off); | 1990 | EXPORT_SYMBOL(dquot_quota_off); |
1991 | |||
2009 | /* | 1992 | /* |
2010 | * Turn quotas on on a device | 1993 | * Turn quotas on on a device |
2011 | */ | 1994 | */ |
@@ -2123,36 +2106,43 @@ out_fmt: | |||
2123 | } | 2106 | } |
2124 | 2107 | ||
2125 | /* Reenable quotas on remount RW */ | 2108 | /* Reenable quotas on remount RW */ |
2126 | static int vfs_quota_on_remount(struct super_block *sb, int type) | 2109 | int dquot_resume(struct super_block *sb, int type) |
2127 | { | 2110 | { |
2128 | struct quota_info *dqopt = sb_dqopt(sb); | 2111 | struct quota_info *dqopt = sb_dqopt(sb); |
2129 | struct inode *inode; | 2112 | struct inode *inode; |
2130 | int ret; | 2113 | int ret = 0, cnt; |
2131 | unsigned int flags; | 2114 | unsigned int flags; |
2132 | 2115 | ||
2133 | mutex_lock(&dqopt->dqonoff_mutex); | 2116 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { |
2134 | if (!sb_has_quota_suspended(sb, type)) { | 2117 | if (type != -1 && cnt != type) |
2118 | continue; | ||
2119 | |||
2120 | mutex_lock(&dqopt->dqonoff_mutex); | ||
2121 | if (!sb_has_quota_suspended(sb, cnt)) { | ||
2122 | mutex_unlock(&dqopt->dqonoff_mutex); | ||
2123 | continue; | ||
2124 | } | ||
2125 | inode = dqopt->files[cnt]; | ||
2126 | dqopt->files[cnt] = NULL; | ||
2127 | spin_lock(&dq_state_lock); | ||
2128 | flags = dqopt->flags & dquot_state_flag(DQUOT_USAGE_ENABLED | | ||
2129 | DQUOT_LIMITS_ENABLED, | ||
2130 | cnt); | ||
2131 | dqopt->flags &= ~dquot_state_flag(DQUOT_STATE_FLAGS, cnt); | ||
2132 | spin_unlock(&dq_state_lock); | ||
2135 | mutex_unlock(&dqopt->dqonoff_mutex); | 2133 | mutex_unlock(&dqopt->dqonoff_mutex); |
2136 | return 0; | ||
2137 | } | ||
2138 | inode = dqopt->files[type]; | ||
2139 | dqopt->files[type] = NULL; | ||
2140 | spin_lock(&dq_state_lock); | ||
2141 | flags = dqopt->flags & dquot_state_flag(DQUOT_USAGE_ENABLED | | ||
2142 | DQUOT_LIMITS_ENABLED, type); | ||
2143 | dqopt->flags &= ~dquot_state_flag(DQUOT_STATE_FLAGS, type); | ||
2144 | spin_unlock(&dq_state_lock); | ||
2145 | mutex_unlock(&dqopt->dqonoff_mutex); | ||
2146 | 2134 | ||
2147 | flags = dquot_generic_flag(flags, type); | 2135 | flags = dquot_generic_flag(flags, cnt); |
2148 | ret = vfs_load_quota_inode(inode, type, dqopt->info[type].dqi_fmt_id, | 2136 | ret = vfs_load_quota_inode(inode, cnt, |
2149 | flags); | 2137 | dqopt->info[cnt].dqi_fmt_id, flags); |
2150 | iput(inode); | 2138 | iput(inode); |
2139 | } | ||
2151 | 2140 | ||
2152 | return ret; | 2141 | return ret; |
2153 | } | 2142 | } |
2143 | EXPORT_SYMBOL(dquot_resume); | ||
2154 | 2144 | ||
2155 | int vfs_quota_on_path(struct super_block *sb, int type, int format_id, | 2145 | int dquot_quota_on_path(struct super_block *sb, int type, int format_id, |
2156 | struct path *path) | 2146 | struct path *path) |
2157 | { | 2147 | { |
2158 | int error = security_quota_on(path->dentry); | 2148 | int error = security_quota_on(path->dentry); |
@@ -2167,40 +2157,36 @@ int vfs_quota_on_path(struct super_block *sb, int type, int format_id, | |||
2167 | DQUOT_LIMITS_ENABLED); | 2157 | DQUOT_LIMITS_ENABLED); |
2168 | return error; | 2158 | return error; |
2169 | } | 2159 | } |
2170 | EXPORT_SYMBOL(vfs_quota_on_path); | 2160 | EXPORT_SYMBOL(dquot_quota_on_path); |
2171 | 2161 | ||
2172 | int vfs_quota_on(struct super_block *sb, int type, int format_id, char *name, | 2162 | int dquot_quota_on(struct super_block *sb, int type, int format_id, char *name) |
2173 | int remount) | ||
2174 | { | 2163 | { |
2175 | struct path path; | 2164 | struct path path; |
2176 | int error; | 2165 | int error; |
2177 | 2166 | ||
2178 | if (remount) | ||
2179 | return vfs_quota_on_remount(sb, type); | ||
2180 | |||
2181 | error = kern_path(name, LOOKUP_FOLLOW, &path); | 2167 | error = kern_path(name, LOOKUP_FOLLOW, &path); |
2182 | if (!error) { | 2168 | if (!error) { |
2183 | error = vfs_quota_on_path(sb, type, format_id, &path); | 2169 | error = dquot_quota_on_path(sb, type, format_id, &path); |
2184 | path_put(&path); | 2170 | path_put(&path); |
2185 | } | 2171 | } |
2186 | return error; | 2172 | return error; |
2187 | } | 2173 | } |
2188 | EXPORT_SYMBOL(vfs_quota_on); | 2174 | EXPORT_SYMBOL(dquot_quota_on); |
2189 | 2175 | ||
2190 | /* | 2176 | /* |
2191 | * More powerful function for turning on quotas allowing setting | 2177 | * More powerful function for turning on quotas allowing setting |
2192 | * of individual quota flags | 2178 | * of individual quota flags |
2193 | */ | 2179 | */ |
2194 | int vfs_quota_enable(struct inode *inode, int type, int format_id, | 2180 | int dquot_enable(struct inode *inode, int type, int format_id, |
2195 | unsigned int flags) | 2181 | unsigned int flags) |
2196 | { | 2182 | { |
2197 | int ret = 0; | 2183 | int ret = 0; |
2198 | struct super_block *sb = inode->i_sb; | 2184 | struct super_block *sb = inode->i_sb; |
2199 | struct quota_info *dqopt = sb_dqopt(sb); | 2185 | struct quota_info *dqopt = sb_dqopt(sb); |
2200 | 2186 | ||
2201 | /* Just unsuspend quotas? */ | 2187 | /* Just unsuspend quotas? */ |
2202 | if (flags & DQUOT_SUSPENDED) | 2188 | BUG_ON(flags & DQUOT_SUSPENDED); |
2203 | return vfs_quota_on_remount(sb, type); | 2189 | |
2204 | if (!flags) | 2190 | if (!flags) |
2205 | return 0; | 2191 | return 0; |
2206 | /* Just updating flags needed? */ | 2192 | /* Just updating flags needed? */ |
@@ -2232,13 +2218,13 @@ out_lock: | |||
2232 | load_quota: | 2218 | load_quota: |
2233 | return vfs_load_quota_inode(inode, type, format_id, flags); | 2219 | return vfs_load_quota_inode(inode, type, format_id, flags); |
2234 | } | 2220 | } |
2235 | EXPORT_SYMBOL(vfs_quota_enable); | 2221 | EXPORT_SYMBOL(dquot_enable); |
2236 | 2222 | ||
2237 | /* | 2223 | /* |
2238 | * This function is used when filesystem needs to initialize quotas | 2224 | * This function is used when filesystem needs to initialize quotas |
2239 | * during mount time. | 2225 | * during mount time. |
2240 | */ | 2226 | */ |
2241 | int vfs_quota_on_mount(struct super_block *sb, char *qf_name, | 2227 | int dquot_quota_on_mount(struct super_block *sb, char *qf_name, |
2242 | int format_id, int type) | 2228 | int format_id, int type) |
2243 | { | 2229 | { |
2244 | struct dentry *dentry; | 2230 | struct dentry *dentry; |
@@ -2264,24 +2250,7 @@ out: | |||
2264 | dput(dentry); | 2250 | dput(dentry); |
2265 | return error; | 2251 | return error; |
2266 | } | 2252 | } |
2267 | EXPORT_SYMBOL(vfs_quota_on_mount); | 2253 | EXPORT_SYMBOL(dquot_quota_on_mount); |
2268 | |||
2269 | /* Wrapper to turn on quotas when remounting rw */ | ||
2270 | int vfs_dq_quota_on_remount(struct super_block *sb) | ||
2271 | { | ||
2272 | int cnt; | ||
2273 | int ret = 0, err; | ||
2274 | |||
2275 | if (!sb->s_qcop || !sb->s_qcop->quota_on) | ||
2276 | return -ENOSYS; | ||
2277 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { | ||
2278 | err = sb->s_qcop->quota_on(sb, cnt, 0, NULL, 1); | ||
2279 | if (err < 0 && !ret) | ||
2280 | ret = err; | ||
2281 | } | ||
2282 | return ret; | ||
2283 | } | ||
2284 | EXPORT_SYMBOL(vfs_dq_quota_on_remount); | ||
2285 | 2254 | ||
2286 | static inline qsize_t qbtos(qsize_t blocks) | 2255 | static inline qsize_t qbtos(qsize_t blocks) |
2287 | { | 2256 | { |
@@ -2316,8 +2285,8 @@ static void do_get_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | |||
2316 | spin_unlock(&dq_data_lock); | 2285 | spin_unlock(&dq_data_lock); |
2317 | } | 2286 | } |
2318 | 2287 | ||
2319 | int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, | 2288 | int dquot_get_dqblk(struct super_block *sb, int type, qid_t id, |
2320 | struct fs_disk_quota *di) | 2289 | struct fs_disk_quota *di) |
2321 | { | 2290 | { |
2322 | struct dquot *dquot; | 2291 | struct dquot *dquot; |
2323 | 2292 | ||
@@ -2329,7 +2298,7 @@ int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, | |||
2329 | 2298 | ||
2330 | return 0; | 2299 | return 0; |
2331 | } | 2300 | } |
2332 | EXPORT_SYMBOL(vfs_get_dqblk); | 2301 | EXPORT_SYMBOL(dquot_get_dqblk); |
2333 | 2302 | ||
2334 | #define VFS_FS_DQ_MASK \ | 2303 | #define VFS_FS_DQ_MASK \ |
2335 | (FS_DQ_BCOUNT | FS_DQ_BSOFT | FS_DQ_BHARD | \ | 2304 | (FS_DQ_BCOUNT | FS_DQ_BSOFT | FS_DQ_BHARD | \ |
@@ -2428,7 +2397,7 @@ static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) | |||
2428 | return 0; | 2397 | return 0; |
2429 | } | 2398 | } |
2430 | 2399 | ||
2431 | int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, | 2400 | int dquot_set_dqblk(struct super_block *sb, int type, qid_t id, |
2432 | struct fs_disk_quota *di) | 2401 | struct fs_disk_quota *di) |
2433 | { | 2402 | { |
2434 | struct dquot *dquot; | 2403 | struct dquot *dquot; |
@@ -2444,10 +2413,10 @@ int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, | |||
2444 | out: | 2413 | out: |
2445 | return rc; | 2414 | return rc; |
2446 | } | 2415 | } |
2447 | EXPORT_SYMBOL(vfs_set_dqblk); | 2416 | EXPORT_SYMBOL(dquot_set_dqblk); |
2448 | 2417 | ||
2449 | /* Generic routine for getting common part of quota file information */ | 2418 | /* Generic routine for getting common part of quota file information */ |
2450 | int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) | 2419 | int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) |
2451 | { | 2420 | { |
2452 | struct mem_dqinfo *mi; | 2421 | struct mem_dqinfo *mi; |
2453 | 2422 | ||
@@ -2466,10 +2435,10 @@ int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) | |||
2466 | mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex); | 2435 | mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex); |
2467 | return 0; | 2436 | return 0; |
2468 | } | 2437 | } |
2469 | EXPORT_SYMBOL(vfs_get_dqinfo); | 2438 | EXPORT_SYMBOL(dquot_get_dqinfo); |
2470 | 2439 | ||
2471 | /* Generic routine for setting common part of quota file information */ | 2440 | /* Generic routine for setting common part of quota file information */ |
2472 | int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) | 2441 | int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) |
2473 | { | 2442 | { |
2474 | struct mem_dqinfo *mi; | 2443 | struct mem_dqinfo *mi; |
2475 | int err = 0; | 2444 | int err = 0; |
@@ -2496,27 +2465,27 @@ out: | |||
2496 | mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex); | 2465 | mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex); |
2497 | return err; | 2466 | return err; |
2498 | } | 2467 | } |
2499 | EXPORT_SYMBOL(vfs_set_dqinfo); | 2468 | EXPORT_SYMBOL(dquot_set_dqinfo); |
2500 | 2469 | ||
2501 | const struct quotactl_ops vfs_quotactl_ops = { | 2470 | const struct quotactl_ops dquot_quotactl_ops = { |
2502 | .quota_on = vfs_quota_on, | 2471 | .quota_on = dquot_quota_on, |
2503 | .quota_off = vfs_quota_off, | 2472 | .quota_off = dquot_quota_off, |
2504 | .quota_sync = vfs_quota_sync, | 2473 | .quota_sync = dquot_quota_sync, |
2505 | .get_info = vfs_get_dqinfo, | 2474 | .get_info = dquot_get_dqinfo, |
2506 | .set_info = vfs_set_dqinfo, | 2475 | .set_info = dquot_set_dqinfo, |
2507 | .get_dqblk = vfs_get_dqblk, | 2476 | .get_dqblk = dquot_get_dqblk, |
2508 | .set_dqblk = vfs_set_dqblk | 2477 | .set_dqblk = dquot_set_dqblk |
2509 | }; | 2478 | }; |
2510 | 2479 | EXPORT_SYMBOL(dquot_quotactl_ops); | |
2511 | 2480 | ||
2512 | static int do_proc_dqstats(struct ctl_table *table, int write, | 2481 | static int do_proc_dqstats(struct ctl_table *table, int write, |
2513 | void __user *buffer, size_t *lenp, loff_t *ppos) | 2482 | void __user *buffer, size_t *lenp, loff_t *ppos) |
2514 | { | 2483 | { |
2515 | #ifdef CONFIG_SMP | ||
2516 | /* Update global table */ | ||
2517 | unsigned int type = (int *)table->data - dqstats.stat; | 2484 | unsigned int type = (int *)table->data - dqstats.stat; |
2518 | dqstats.stat[type] = dqstats_read(type); | 2485 | |
2519 | #endif | 2486 | /* Update global table */ |
2487 | dqstats.stat[type] = | ||
2488 | percpu_counter_sum_positive(&dqstats.counter[type]); | ||
2520 | return proc_dointvec(table, write, buffer, lenp, ppos); | 2489 | return proc_dointvec(table, write, buffer, lenp, ppos); |
2521 | } | 2490 | } |
2522 | 2491 | ||
@@ -2609,7 +2578,7 @@ static ctl_table sys_table[] = { | |||
2609 | 2578 | ||
2610 | static int __init dquot_init(void) | 2579 | static int __init dquot_init(void) |
2611 | { | 2580 | { |
2612 | int i; | 2581 | int i, ret; |
2613 | unsigned long nr_hash, order; | 2582 | unsigned long nr_hash, order; |
2614 | 2583 | ||
2615 | printk(KERN_NOTICE "VFS: Disk quotas %s\n", __DQUOT_VERSION__); | 2584 | printk(KERN_NOTICE "VFS: Disk quotas %s\n", __DQUOT_VERSION__); |
@@ -2627,12 +2596,11 @@ static int __init dquot_init(void) | |||
2627 | if (!dquot_hash) | 2596 | if (!dquot_hash) |
2628 | panic("Cannot create dquot hash table"); | 2597 | panic("Cannot create dquot hash table"); |
2629 | 2598 | ||
2630 | #ifdef CONFIG_SMP | 2599 | for (i = 0; i < _DQST_DQSTAT_LAST; i++) { |
2631 | dqstats_pcpu = alloc_percpu(struct dqstats); | 2600 | ret = percpu_counter_init(&dqstats.counter[i], 0); |
2632 | if (!dqstats_pcpu) | 2601 | if (ret) |
2633 | panic("Cannot create dquot stats table"); | 2602 | panic("Cannot create dquot stat counters"); |
2634 | #endif | 2603 | } |
2635 | memset(&dqstats, 0, sizeof(struct dqstats)); | ||
2636 | 2604 | ||
2637 | /* Find power-of-two hlist_heads which can fit into allocation */ | 2605 | /* Find power-of-two hlist_heads which can fit into allocation */ |
2638 | nr_hash = (1UL << order) * PAGE_SIZE / sizeof(struct hlist_head); | 2606 | nr_hash = (1UL << order) * PAGE_SIZE / sizeof(struct hlist_head); |
diff --git a/fs/quota/quota.c b/fs/quota/quota.c index ce3dfd066f59..b299961e1edb 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c | |||
@@ -73,7 +73,7 @@ static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id, | |||
73 | if (IS_ERR(pathname)) | 73 | if (IS_ERR(pathname)) |
74 | return PTR_ERR(pathname); | 74 | return PTR_ERR(pathname); |
75 | if (sb->s_qcop->quota_on) | 75 | if (sb->s_qcop->quota_on) |
76 | ret = sb->s_qcop->quota_on(sb, type, id, pathname, 0); | 76 | ret = sb->s_qcop->quota_on(sb, type, id, pathname); |
77 | putname(pathname); | 77 | putname(pathname); |
78 | return ret; | 78 | return ret; |
79 | } | 79 | } |
@@ -260,7 +260,7 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, | |||
260 | case Q_QUOTAOFF: | 260 | case Q_QUOTAOFF: |
261 | if (!sb->s_qcop->quota_off) | 261 | if (!sb->s_qcop->quota_off) |
262 | return -ENOSYS; | 262 | return -ENOSYS; |
263 | return sb->s_qcop->quota_off(sb, type, 0); | 263 | return sb->s_qcop->quota_off(sb, type); |
264 | case Q_GETFMT: | 264 | case Q_GETFMT: |
265 | return quota_getfmt(sb, type, addr); | 265 | return quota_getfmt(sb, type, addr); |
266 | case Q_GETINFO: | 266 | case Q_GETINFO: |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 59125fb36d42..9822fa15118b 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
@@ -158,6 +158,7 @@ static int finish_unfinished(struct super_block *s) | |||
158 | #ifdef CONFIG_QUOTA | 158 | #ifdef CONFIG_QUOTA |
159 | int i; | 159 | int i; |
160 | int ms_active_set; | 160 | int ms_active_set; |
161 | int quota_enabled[MAXQUOTAS]; | ||
161 | #endif | 162 | #endif |
162 | 163 | ||
163 | /* compose key to look for "save" links */ | 164 | /* compose key to look for "save" links */ |
@@ -179,8 +180,15 @@ static int finish_unfinished(struct super_block *s) | |||
179 | } | 180 | } |
180 | /* Turn on quotas so that they are updated correctly */ | 181 | /* Turn on quotas so that they are updated correctly */ |
181 | for (i = 0; i < MAXQUOTAS; i++) { | 182 | for (i = 0; i < MAXQUOTAS; i++) { |
183 | quota_enabled[i] = 1; | ||
182 | if (REISERFS_SB(s)->s_qf_names[i]) { | 184 | if (REISERFS_SB(s)->s_qf_names[i]) { |
183 | int ret = reiserfs_quota_on_mount(s, i); | 185 | int ret; |
186 | |||
187 | if (sb_has_quota_active(s, i)) { | ||
188 | quota_enabled[i] = 0; | ||
189 | continue; | ||
190 | } | ||
191 | ret = reiserfs_quota_on_mount(s, i); | ||
184 | if (ret < 0) | 192 | if (ret < 0) |
185 | reiserfs_warning(s, "reiserfs-2500", | 193 | reiserfs_warning(s, "reiserfs-2500", |
186 | "cannot turn on journaled " | 194 | "cannot turn on journaled " |
@@ -304,8 +312,8 @@ static int finish_unfinished(struct super_block *s) | |||
304 | #ifdef CONFIG_QUOTA | 312 | #ifdef CONFIG_QUOTA |
305 | /* Turn quotas off */ | 313 | /* Turn quotas off */ |
306 | for (i = 0; i < MAXQUOTAS; i++) { | 314 | for (i = 0; i < MAXQUOTAS; i++) { |
307 | if (sb_dqopt(s)->files[i]) | 315 | if (sb_dqopt(s)->files[i] && quota_enabled[i]) |
308 | vfs_quota_off(s, i, 0); | 316 | dquot_quota_off(s, i); |
309 | } | 317 | } |
310 | if (ms_active_set) | 318 | if (ms_active_set) |
311 | /* Restore the flag back */ | 319 | /* Restore the flag back */ |
@@ -466,6 +474,8 @@ static void reiserfs_put_super(struct super_block *s) | |||
466 | struct reiserfs_transaction_handle th; | 474 | struct reiserfs_transaction_handle th; |
467 | th.t_trans_id = 0; | 475 | th.t_trans_id = 0; |
468 | 476 | ||
477 | dquot_disable(s, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); | ||
478 | |||
469 | reiserfs_write_lock(s); | 479 | reiserfs_write_lock(s); |
470 | 480 | ||
471 | if (s->s_dirt) | 481 | if (s->s_dirt) |
@@ -620,7 +630,7 @@ static int reiserfs_acquire_dquot(struct dquot *); | |||
620 | static int reiserfs_release_dquot(struct dquot *); | 630 | static int reiserfs_release_dquot(struct dquot *); |
621 | static int reiserfs_mark_dquot_dirty(struct dquot *); | 631 | static int reiserfs_mark_dquot_dirty(struct dquot *); |
622 | static int reiserfs_write_info(struct super_block *, int); | 632 | static int reiserfs_write_info(struct super_block *, int); |
623 | static int reiserfs_quota_on(struct super_block *, int, int, char *, int); | 633 | static int reiserfs_quota_on(struct super_block *, int, int, char *); |
624 | 634 | ||
625 | static const struct dquot_operations reiserfs_quota_operations = { | 635 | static const struct dquot_operations reiserfs_quota_operations = { |
626 | .write_dquot = reiserfs_write_dquot, | 636 | .write_dquot = reiserfs_write_dquot, |
@@ -634,12 +644,12 @@ static const struct dquot_operations reiserfs_quota_operations = { | |||
634 | 644 | ||
635 | static const struct quotactl_ops reiserfs_qctl_operations = { | 645 | static const struct quotactl_ops reiserfs_qctl_operations = { |
636 | .quota_on = reiserfs_quota_on, | 646 | .quota_on = reiserfs_quota_on, |
637 | .quota_off = vfs_quota_off, | 647 | .quota_off = dquot_quota_off, |
638 | .quota_sync = vfs_quota_sync, | 648 | .quota_sync = dquot_quota_sync, |
639 | .get_info = vfs_get_dqinfo, | 649 | .get_info = dquot_get_dqinfo, |
640 | .set_info = vfs_set_dqinfo, | 650 | .set_info = dquot_set_dqinfo, |
641 | .get_dqblk = vfs_get_dqblk, | 651 | .get_dqblk = dquot_get_dqblk, |
642 | .set_dqblk = vfs_set_dqblk, | 652 | .set_dqblk = dquot_set_dqblk, |
643 | }; | 653 | }; |
644 | #endif | 654 | #endif |
645 | 655 | ||
@@ -1242,6 +1252,11 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
1242 | if (s->s_flags & MS_RDONLY) | 1252 | if (s->s_flags & MS_RDONLY) |
1243 | /* it is read-only already */ | 1253 | /* it is read-only already */ |
1244 | goto out_ok; | 1254 | goto out_ok; |
1255 | |||
1256 | err = dquot_suspend(s, -1); | ||
1257 | if (err < 0) | ||
1258 | goto out_err; | ||
1259 | |||
1245 | /* try to remount file system with read-only permissions */ | 1260 | /* try to remount file system with read-only permissions */ |
1246 | if (sb_umount_state(rs) == REISERFS_VALID_FS | 1261 | if (sb_umount_state(rs) == REISERFS_VALID_FS |
1247 | || REISERFS_SB(s)->s_mount_state != REISERFS_VALID_FS) { | 1262 | || REISERFS_SB(s)->s_mount_state != REISERFS_VALID_FS) { |
@@ -1295,6 +1310,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
1295 | s->s_dirt = 0; | 1310 | s->s_dirt = 0; |
1296 | 1311 | ||
1297 | if (!(*mount_flags & MS_RDONLY)) { | 1312 | if (!(*mount_flags & MS_RDONLY)) { |
1313 | dquot_resume(s, -1); | ||
1298 | finish_unfinished(s); | 1314 | finish_unfinished(s); |
1299 | reiserfs_xattr_init(s, *mount_flags); | 1315 | reiserfs_xattr_init(s, *mount_flags); |
1300 | } | 1316 | } |
@@ -2022,15 +2038,15 @@ static int reiserfs_write_info(struct super_block *sb, int type) | |||
2022 | */ | 2038 | */ |
2023 | static int reiserfs_quota_on_mount(struct super_block *sb, int type) | 2039 | static int reiserfs_quota_on_mount(struct super_block *sb, int type) |
2024 | { | 2040 | { |
2025 | return vfs_quota_on_mount(sb, REISERFS_SB(sb)->s_qf_names[type], | 2041 | return dquot_quota_on_mount(sb, REISERFS_SB(sb)->s_qf_names[type], |
2026 | REISERFS_SB(sb)->s_jquota_fmt, type); | 2042 | REISERFS_SB(sb)->s_jquota_fmt, type); |
2027 | } | 2043 | } |
2028 | 2044 | ||
2029 | /* | 2045 | /* |
2030 | * Standard function to be called on quota_on | 2046 | * Standard function to be called on quota_on |
2031 | */ | 2047 | */ |
2032 | static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, | 2048 | static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, |
2033 | char *name, int remount) | 2049 | char *name) |
2034 | { | 2050 | { |
2035 | int err; | 2051 | int err; |
2036 | struct path path; | 2052 | struct path path; |
@@ -2039,9 +2055,7 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, | |||
2039 | 2055 | ||
2040 | if (!(REISERFS_SB(sb)->s_mount_opt & (1 << REISERFS_QUOTA))) | 2056 | if (!(REISERFS_SB(sb)->s_mount_opt & (1 << REISERFS_QUOTA))) |
2041 | return -EINVAL; | 2057 | return -EINVAL; |
2042 | /* No more checks needed? Path and format_id are bogus anyway... */ | 2058 | |
2043 | if (remount) | ||
2044 | return vfs_quota_on(sb, type, format_id, name, 1); | ||
2045 | err = kern_path(name, LOOKUP_FOLLOW, &path); | 2059 | err = kern_path(name, LOOKUP_FOLLOW, &path); |
2046 | if (err) | 2060 | if (err) |
2047 | return err; | 2061 | return err; |
@@ -2085,7 +2099,7 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, | |||
2085 | if (err) | 2099 | if (err) |
2086 | goto out; | 2100 | goto out; |
2087 | } | 2101 | } |
2088 | err = vfs_quota_on_path(sb, type, format_id, &path); | 2102 | err = dquot_quota_on_path(sb, type, format_id, &path); |
2089 | out: | 2103 | out: |
2090 | path_put(&path); | 2104 | path_put(&path); |
2091 | return err; | 2105 | return err; |
diff --git a/fs/super.c b/fs/super.c index a67409e5ad94..5c35bc7a499e 100644 --- a/fs/super.c +++ b/fs/super.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | #include <linux/acct.h> | 25 | #include <linux/acct.h> |
26 | #include <linux/blkdev.h> | 26 | #include <linux/blkdev.h> |
27 | #include <linux/quotaops.h> | ||
28 | #include <linux/mount.h> | 27 | #include <linux/mount.h> |
29 | #include <linux/security.h> | 28 | #include <linux/security.h> |
30 | #include <linux/writeback.h> /* for the emergency remount stuff */ | 29 | #include <linux/writeback.h> /* for the emergency remount stuff */ |
@@ -94,8 +93,6 @@ static struct super_block *alloc_super(struct file_system_type *type) | |||
94 | init_rwsem(&s->s_dquot.dqptr_sem); | 93 | init_rwsem(&s->s_dquot.dqptr_sem); |
95 | init_waitqueue_head(&s->s_wait_unfrozen); | 94 | init_waitqueue_head(&s->s_wait_unfrozen); |
96 | s->s_maxbytes = MAX_NON_LFS; | 95 | s->s_maxbytes = MAX_NON_LFS; |
97 | s->dq_op = sb_dquot_ops; | ||
98 | s->s_qcop = sb_quotactl_ops; | ||
99 | s->s_op = &default_op; | 96 | s->s_op = &default_op; |
100 | s->s_time_gran = 1000000000; | 97 | s->s_time_gran = 1000000000; |
101 | } | 98 | } |
@@ -160,7 +157,6 @@ void deactivate_locked_super(struct super_block *s) | |||
160 | { | 157 | { |
161 | struct file_system_type *fs = s->s_type; | 158 | struct file_system_type *fs = s->s_type; |
162 | if (atomic_dec_and_test(&s->s_active)) { | 159 | if (atomic_dec_and_test(&s->s_active)) { |
163 | vfs_dq_off(s, 0); | ||
164 | fs->kill_sb(s); | 160 | fs->kill_sb(s); |
165 | put_filesystem(fs); | 161 | put_filesystem(fs); |
166 | put_super(s); | 162 | put_super(s); |
@@ -524,7 +520,7 @@ rescan: | |||
524 | int do_remount_sb(struct super_block *sb, int flags, void *data, int force) | 520 | int do_remount_sb(struct super_block *sb, int flags, void *data, int force) |
525 | { | 521 | { |
526 | int retval; | 522 | int retval; |
527 | int remount_rw, remount_ro; | 523 | int remount_ro; |
528 | 524 | ||
529 | if (sb->s_frozen != SB_UNFROZEN) | 525 | if (sb->s_frozen != SB_UNFROZEN) |
530 | return -EBUSY; | 526 | return -EBUSY; |
@@ -540,7 +536,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) | |||
540 | sync_filesystem(sb); | 536 | sync_filesystem(sb); |
541 | 537 | ||
542 | remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY); | 538 | remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY); |
543 | remount_rw = !(flags & MS_RDONLY) && (sb->s_flags & MS_RDONLY); | ||
544 | 539 | ||
545 | /* If we are remounting RDONLY and current sb is read/write, | 540 | /* If we are remounting RDONLY and current sb is read/write, |
546 | make sure there are no rw files opened */ | 541 | make sure there are no rw files opened */ |
@@ -549,9 +544,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) | |||
549 | mark_files_ro(sb); | 544 | mark_files_ro(sb); |
550 | else if (!fs_may_remount_ro(sb)) | 545 | else if (!fs_may_remount_ro(sb)) |
551 | return -EBUSY; | 546 | return -EBUSY; |
552 | retval = vfs_dq_off(sb, 1); | ||
553 | if (retval < 0 && retval != -ENOSYS) | ||
554 | return -EBUSY; | ||
555 | } | 547 | } |
556 | 548 | ||
557 | if (sb->s_op->remount_fs) { | 549 | if (sb->s_op->remount_fs) { |
@@ -560,8 +552,7 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) | |||
560 | return retval; | 552 | return retval; |
561 | } | 553 | } |
562 | sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK); | 554 | sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK); |
563 | if (remount_rw) | 555 | |
564 | vfs_dq_quota_on_remount(sb); | ||
565 | /* | 556 | /* |
566 | * Some filesystems modify their metadata via some other path than the | 557 | * Some filesystems modify their metadata via some other path than the |
567 | * bdev buffer cache (eg. use a private mapping, or directories in | 558 | * bdev buffer cache (eg. use a private mapping, or directories in |
diff --git a/fs/udf/balloc.c b/fs/udf/balloc.c index 9a9378b4eb5a..b608efaa4cee 100644 --- a/fs/udf/balloc.c +++ b/fs/udf/balloc.c | |||
@@ -21,7 +21,6 @@ | |||
21 | 21 | ||
22 | #include "udfdecl.h" | 22 | #include "udfdecl.h" |
23 | 23 | ||
24 | #include <linux/quotaops.h> | ||
25 | #include <linux/buffer_head.h> | 24 | #include <linux/buffer_head.h> |
26 | #include <linux/bitops.h> | 25 | #include <linux/bitops.h> |
27 | 26 | ||
@@ -159,8 +158,6 @@ static void udf_bitmap_free_blocks(struct super_block *sb, | |||
159 | udf_debug("byte=%2x\n", | 158 | udf_debug("byte=%2x\n", |
160 | ((char *)bh->b_data)[(bit + i) >> 3]); | 159 | ((char *)bh->b_data)[(bit + i) >> 3]); |
161 | } else { | 160 | } else { |
162 | if (inode) | ||
163 | dquot_free_block(inode, 1); | ||
164 | udf_add_free_space(sb, sbi->s_partition, 1); | 161 | udf_add_free_space(sb, sbi->s_partition, 1); |
165 | } | 162 | } |
166 | } | 163 | } |
@@ -210,15 +207,8 @@ static int udf_bitmap_prealloc_blocks(struct super_block *sb, | |||
210 | bit = block % (sb->s_blocksize << 3); | 207 | bit = block % (sb->s_blocksize << 3); |
211 | 208 | ||
212 | while (bit < (sb->s_blocksize << 3) && block_count > 0) { | 209 | while (bit < (sb->s_blocksize << 3) && block_count > 0) { |
213 | if (!udf_test_bit(bit, bh->b_data)) | 210 | if (!udf_clear_bit(bit, bh->b_data)) |
214 | goto out; | 211 | goto out; |
215 | else if (dquot_prealloc_block(inode, 1)) | ||
216 | goto out; | ||
217 | else if (!udf_clear_bit(bit, bh->b_data)) { | ||
218 | udf_debug("bit already cleared for block %d\n", bit); | ||
219 | dquot_free_block(inode, 1); | ||
220 | goto out; | ||
221 | } | ||
222 | block_count--; | 212 | block_count--; |
223 | alloc_count++; | 213 | alloc_count++; |
224 | bit++; | 214 | bit++; |
@@ -338,20 +328,6 @@ search_back: | |||
338 | } | 328 | } |
339 | 329 | ||
340 | got_block: | 330 | got_block: |
341 | |||
342 | /* | ||
343 | * Check quota for allocation of this block. | ||
344 | */ | ||
345 | if (inode) { | ||
346 | int ret = dquot_alloc_block(inode, 1); | ||
347 | |||
348 | if (ret) { | ||
349 | mutex_unlock(&sbi->s_alloc_mutex); | ||
350 | *err = ret; | ||
351 | return 0; | ||
352 | } | ||
353 | } | ||
354 | |||
355 | newblock = bit + (block_group << (sb->s_blocksize_bits + 3)) - | 331 | newblock = bit + (block_group << (sb->s_blocksize_bits + 3)) - |
356 | (sizeof(struct spaceBitmapDesc) << 3); | 332 | (sizeof(struct spaceBitmapDesc) << 3); |
357 | 333 | ||
@@ -401,10 +377,6 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
401 | } | 377 | } |
402 | 378 | ||
403 | iinfo = UDF_I(table); | 379 | iinfo = UDF_I(table); |
404 | /* We do this up front - There are some error conditions that | ||
405 | could occure, but.. oh well */ | ||
406 | if (inode) | ||
407 | dquot_free_block(inode, count); | ||
408 | udf_add_free_space(sb, sbi->s_partition, count); | 380 | udf_add_free_space(sb, sbi->s_partition, count); |
409 | 381 | ||
410 | start = bloc->logicalBlockNum + offset; | 382 | start = bloc->logicalBlockNum + offset; |
@@ -649,10 +621,7 @@ static int udf_table_prealloc_blocks(struct super_block *sb, | |||
649 | epos.offset -= adsize; | 621 | epos.offset -= adsize; |
650 | 622 | ||
651 | alloc_count = (elen >> sb->s_blocksize_bits); | 623 | alloc_count = (elen >> sb->s_blocksize_bits); |
652 | if (inode && dquot_prealloc_block(inode, | 624 | if (alloc_count > block_count) { |
653 | alloc_count > block_count ? block_count : alloc_count)) | ||
654 | alloc_count = 0; | ||
655 | else if (alloc_count > block_count) { | ||
656 | alloc_count = block_count; | 625 | alloc_count = block_count; |
657 | eloc.logicalBlockNum += alloc_count; | 626 | eloc.logicalBlockNum += alloc_count; |
658 | elen -= (alloc_count << sb->s_blocksize_bits); | 627 | elen -= (alloc_count << sb->s_blocksize_bits); |
@@ -752,14 +721,6 @@ static int udf_table_new_block(struct super_block *sb, | |||
752 | newblock = goal_eloc.logicalBlockNum; | 721 | newblock = goal_eloc.logicalBlockNum; |
753 | goal_eloc.logicalBlockNum++; | 722 | goal_eloc.logicalBlockNum++; |
754 | goal_elen -= sb->s_blocksize; | 723 | goal_elen -= sb->s_blocksize; |
755 | if (inode) { | ||
756 | *err = dquot_alloc_block(inode, 1); | ||
757 | if (*err) { | ||
758 | brelse(goal_epos.bh); | ||
759 | mutex_unlock(&sbi->s_alloc_mutex); | ||
760 | return 0; | ||
761 | } | ||
762 | } | ||
763 | 724 | ||
764 | if (goal_elen) | 725 | if (goal_elen) |
765 | udf_write_aext(table, &goal_epos, &goal_eloc, goal_elen, 1); | 726 | udf_write_aext(table, &goal_epos, &goal_eloc, goal_elen, 1); |
diff --git a/fs/udf/file.c b/fs/udf/file.c index 0660280aa180..94e06d6bddbd 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
@@ -34,7 +34,6 @@ | |||
34 | #include <linux/errno.h> | 34 | #include <linux/errno.h> |
35 | #include <linux/smp_lock.h> | 35 | #include <linux/smp_lock.h> |
36 | #include <linux/pagemap.h> | 36 | #include <linux/pagemap.h> |
37 | #include <linux/quotaops.h> | ||
38 | #include <linux/buffer_head.h> | 37 | #include <linux/buffer_head.h> |
39 | #include <linux/aio.h> | 38 | #include <linux/aio.h> |
40 | #include <linux/smp_lock.h> | 39 | #include <linux/smp_lock.h> |
@@ -219,7 +218,7 @@ const struct file_operations udf_file_operations = { | |||
219 | .read = do_sync_read, | 218 | .read = do_sync_read, |
220 | .aio_read = generic_file_aio_read, | 219 | .aio_read = generic_file_aio_read, |
221 | .unlocked_ioctl = udf_ioctl, | 220 | .unlocked_ioctl = udf_ioctl, |
222 | .open = dquot_file_open, | 221 | .open = generic_file_open, |
223 | .mmap = generic_file_mmap, | 222 | .mmap = generic_file_mmap, |
224 | .write = do_sync_write, | 223 | .write = do_sync_write, |
225 | .aio_write = udf_file_aio_write, | 224 | .aio_write = udf_file_aio_write, |
@@ -229,29 +228,6 @@ const struct file_operations udf_file_operations = { | |||
229 | .llseek = generic_file_llseek, | 228 | .llseek = generic_file_llseek, |
230 | }; | 229 | }; |
231 | 230 | ||
232 | int udf_setattr(struct dentry *dentry, struct iattr *iattr) | ||
233 | { | ||
234 | struct inode *inode = dentry->d_inode; | ||
235 | int error; | ||
236 | |||
237 | error = inode_change_ok(inode, iattr); | ||
238 | if (error) | ||
239 | return error; | ||
240 | |||
241 | if (is_quota_modification(inode, iattr)) | ||
242 | dquot_initialize(inode); | ||
243 | |||
244 | if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || | ||
245 | (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { | ||
246 | error = dquot_transfer(inode, iattr); | ||
247 | if (error) | ||
248 | return error; | ||
249 | } | ||
250 | |||
251 | return inode_setattr(inode, iattr); | ||
252 | } | ||
253 | |||
254 | const struct inode_operations udf_file_inode_operations = { | 231 | const struct inode_operations udf_file_inode_operations = { |
255 | .truncate = udf_truncate, | 232 | .truncate = udf_truncate, |
256 | .setattr = udf_setattr, | ||
257 | }; | 233 | }; |
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index 2b5586c7f02a..18cd7111185d 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c | |||
@@ -20,7 +20,6 @@ | |||
20 | 20 | ||
21 | #include "udfdecl.h" | 21 | #include "udfdecl.h" |
22 | #include <linux/fs.h> | 22 | #include <linux/fs.h> |
23 | #include <linux/quotaops.h> | ||
24 | #include <linux/sched.h> | 23 | #include <linux/sched.h> |
25 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
26 | 25 | ||
@@ -32,13 +31,6 @@ void udf_free_inode(struct inode *inode) | |||
32 | struct super_block *sb = inode->i_sb; | 31 | struct super_block *sb = inode->i_sb; |
33 | struct udf_sb_info *sbi = UDF_SB(sb); | 32 | struct udf_sb_info *sbi = UDF_SB(sb); |
34 | 33 | ||
35 | /* | ||
36 | * Note: we must free any quota before locking the superblock, | ||
37 | * as writing the quota to disk may need the lock as well. | ||
38 | */ | ||
39 | dquot_free_inode(inode); | ||
40 | dquot_drop(inode); | ||
41 | |||
42 | clear_inode(inode); | 34 | clear_inode(inode); |
43 | 35 | ||
44 | mutex_lock(&sbi->s_alloc_mutex); | 36 | mutex_lock(&sbi->s_alloc_mutex); |
@@ -61,7 +53,7 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
61 | struct super_block *sb = dir->i_sb; | 53 | struct super_block *sb = dir->i_sb; |
62 | struct udf_sb_info *sbi = UDF_SB(sb); | 54 | struct udf_sb_info *sbi = UDF_SB(sb); |
63 | struct inode *inode; | 55 | struct inode *inode; |
64 | int block, ret; | 56 | int block; |
65 | uint32_t start = UDF_I(dir)->i_location.logicalBlockNum; | 57 | uint32_t start = UDF_I(dir)->i_location.logicalBlockNum; |
66 | struct udf_inode_info *iinfo; | 58 | struct udf_inode_info *iinfo; |
67 | struct udf_inode_info *dinfo = UDF_I(dir); | 59 | struct udf_inode_info *dinfo = UDF_I(dir); |
@@ -146,17 +138,6 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
146 | insert_inode_hash(inode); | 138 | insert_inode_hash(inode); |
147 | mark_inode_dirty(inode); | 139 | mark_inode_dirty(inode); |
148 | 140 | ||
149 | dquot_initialize(inode); | ||
150 | ret = dquot_alloc_inode(inode); | ||
151 | if (ret) { | ||
152 | dquot_drop(inode); | ||
153 | inode->i_flags |= S_NOQUOTA; | ||
154 | inode->i_nlink = 0; | ||
155 | iput(inode); | ||
156 | *err = ret; | ||
157 | return NULL; | ||
158 | } | ||
159 | |||
160 | *err = 0; | 141 | *err = 0; |
161 | return inode; | 142 | return inode; |
162 | } | 143 | } |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 8a3fbd177cab..124852bcf6fe 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
@@ -36,7 +36,6 @@ | |||
36 | #include <linux/pagemap.h> | 36 | #include <linux/pagemap.h> |
37 | #include <linux/buffer_head.h> | 37 | #include <linux/buffer_head.h> |
38 | #include <linux/writeback.h> | 38 | #include <linux/writeback.h> |
39 | #include <linux/quotaops.h> | ||
40 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
41 | #include <linux/crc-itu-t.h> | 40 | #include <linux/crc-itu-t.h> |
42 | 41 | ||
@@ -71,9 +70,6 @@ static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int); | |||
71 | 70 | ||
72 | void udf_delete_inode(struct inode *inode) | 71 | void udf_delete_inode(struct inode *inode) |
73 | { | 72 | { |
74 | if (!is_bad_inode(inode)) | ||
75 | dquot_initialize(inode); | ||
76 | |||
77 | truncate_inode_pages(&inode->i_data, 0); | 73 | truncate_inode_pages(&inode->i_data, 0); |
78 | 74 | ||
79 | if (is_bad_inode(inode)) | 75 | if (is_bad_inode(inode)) |
@@ -113,7 +109,6 @@ void udf_clear_inode(struct inode *inode) | |||
113 | (unsigned long long)iinfo->i_lenExtents); | 109 | (unsigned long long)iinfo->i_lenExtents); |
114 | } | 110 | } |
115 | 111 | ||
116 | dquot_drop(inode); | ||
117 | kfree(iinfo->i_ext.i_data); | 112 | kfree(iinfo->i_ext.i_data); |
118 | iinfo->i_ext.i_data = NULL; | 113 | iinfo->i_ext.i_data = NULL; |
119 | } | 114 | } |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 585f733615dc..bf5fc674193c 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/errno.h> | 27 | #include <linux/errno.h> |
28 | #include <linux/mm.h> | 28 | #include <linux/mm.h> |
29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
30 | #include <linux/quotaops.h> | ||
31 | #include <linux/smp_lock.h> | 30 | #include <linux/smp_lock.h> |
32 | #include <linux/buffer_head.h> | 31 | #include <linux/buffer_head.h> |
33 | #include <linux/sched.h> | 32 | #include <linux/sched.h> |
@@ -563,8 +562,6 @@ static int udf_create(struct inode *dir, struct dentry *dentry, int mode, | |||
563 | int err; | 562 | int err; |
564 | struct udf_inode_info *iinfo; | 563 | struct udf_inode_info *iinfo; |
565 | 564 | ||
566 | dquot_initialize(dir); | ||
567 | |||
568 | lock_kernel(); | 565 | lock_kernel(); |
569 | inode = udf_new_inode(dir, mode, &err); | 566 | inode = udf_new_inode(dir, mode, &err); |
570 | if (!inode) { | 567 | if (!inode) { |
@@ -617,8 +614,6 @@ static int udf_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
617 | if (!old_valid_dev(rdev)) | 614 | if (!old_valid_dev(rdev)) |
618 | return -EINVAL; | 615 | return -EINVAL; |
619 | 616 | ||
620 | dquot_initialize(dir); | ||
621 | |||
622 | lock_kernel(); | 617 | lock_kernel(); |
623 | err = -EIO; | 618 | err = -EIO; |
624 | inode = udf_new_inode(dir, mode, &err); | 619 | inode = udf_new_inode(dir, mode, &err); |
@@ -664,8 +659,6 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
664 | struct udf_inode_info *dinfo = UDF_I(dir); | 659 | struct udf_inode_info *dinfo = UDF_I(dir); |
665 | struct udf_inode_info *iinfo; | 660 | struct udf_inode_info *iinfo; |
666 | 661 | ||
667 | dquot_initialize(dir); | ||
668 | |||
669 | lock_kernel(); | 662 | lock_kernel(); |
670 | err = -EMLINK; | 663 | err = -EMLINK; |
671 | if (dir->i_nlink >= (256 << sizeof(dir->i_nlink)) - 1) | 664 | if (dir->i_nlink >= (256 << sizeof(dir->i_nlink)) - 1) |
@@ -800,8 +793,6 @@ static int udf_rmdir(struct inode *dir, struct dentry *dentry) | |||
800 | struct fileIdentDesc *fi, cfi; | 793 | struct fileIdentDesc *fi, cfi; |
801 | struct kernel_lb_addr tloc; | 794 | struct kernel_lb_addr tloc; |
802 | 795 | ||
803 | dquot_initialize(dir); | ||
804 | |||
805 | retval = -ENOENT; | 796 | retval = -ENOENT; |
806 | lock_kernel(); | 797 | lock_kernel(); |
807 | fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi); | 798 | fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi); |
@@ -848,8 +839,6 @@ static int udf_unlink(struct inode *dir, struct dentry *dentry) | |||
848 | struct fileIdentDesc cfi; | 839 | struct fileIdentDesc cfi; |
849 | struct kernel_lb_addr tloc; | 840 | struct kernel_lb_addr tloc; |
850 | 841 | ||
851 | dquot_initialize(dir); | ||
852 | |||
853 | retval = -ENOENT; | 842 | retval = -ENOENT; |
854 | lock_kernel(); | 843 | lock_kernel(); |
855 | fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi); | 844 | fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi); |
@@ -904,8 +893,6 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
904 | struct buffer_head *bh; | 893 | struct buffer_head *bh; |
905 | struct udf_inode_info *iinfo; | 894 | struct udf_inode_info *iinfo; |
906 | 895 | ||
907 | dquot_initialize(dir); | ||
908 | |||
909 | lock_kernel(); | 896 | lock_kernel(); |
910 | inode = udf_new_inode(dir, S_IFLNK | S_IRWXUGO, &err); | 897 | inode = udf_new_inode(dir, S_IFLNK | S_IRWXUGO, &err); |
911 | if (!inode) | 898 | if (!inode) |
@@ -1075,8 +1062,6 @@ static int udf_link(struct dentry *old_dentry, struct inode *dir, | |||
1075 | int err; | 1062 | int err; |
1076 | struct buffer_head *bh; | 1063 | struct buffer_head *bh; |
1077 | 1064 | ||
1078 | dquot_initialize(dir); | ||
1079 | |||
1080 | lock_kernel(); | 1065 | lock_kernel(); |
1081 | if (inode->i_nlink >= (256 << sizeof(inode->i_nlink)) - 1) { | 1066 | if (inode->i_nlink >= (256 << sizeof(inode->i_nlink)) - 1) { |
1082 | unlock_kernel(); | 1067 | unlock_kernel(); |
@@ -1139,9 +1124,6 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1139 | struct kernel_lb_addr tloc; | 1124 | struct kernel_lb_addr tloc; |
1140 | struct udf_inode_info *old_iinfo = UDF_I(old_inode); | 1125 | struct udf_inode_info *old_iinfo = UDF_I(old_inode); |
1141 | 1126 | ||
1142 | dquot_initialize(old_dir); | ||
1143 | dquot_initialize(new_dir); | ||
1144 | |||
1145 | lock_kernel(); | 1127 | lock_kernel(); |
1146 | ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi); | 1128 | ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi); |
1147 | if (ofi) { | 1129 | if (ofi) { |
@@ -1387,7 +1369,6 @@ const struct export_operations udf_export_ops = { | |||
1387 | const struct inode_operations udf_dir_inode_operations = { | 1369 | const struct inode_operations udf_dir_inode_operations = { |
1388 | .lookup = udf_lookup, | 1370 | .lookup = udf_lookup, |
1389 | .create = udf_create, | 1371 | .create = udf_create, |
1390 | .setattr = udf_setattr, | ||
1391 | .link = udf_link, | 1372 | .link = udf_link, |
1392 | .unlink = udf_unlink, | 1373 | .unlink = udf_unlink, |
1393 | .symlink = udf_symlink, | 1374 | .symlink = udf_symlink, |
@@ -1400,5 +1381,4 @@ const struct inode_operations udf_symlink_inode_operations = { | |||
1400 | .readlink = generic_readlink, | 1381 | .readlink = generic_readlink, |
1401 | .follow_link = page_follow_link_light, | 1382 | .follow_link = page_follow_link_light, |
1402 | .put_link = page_put_link, | 1383 | .put_link = page_put_link, |
1403 | .setattr = udf_setattr, | ||
1404 | }; | 1384 | }; |
diff --git a/fs/udf/super.c b/fs/udf/super.c index 1e4543cbcd27..612d1e2e285a 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
@@ -557,6 +557,7 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | |||
557 | { | 557 | { |
558 | struct udf_options uopt; | 558 | struct udf_options uopt; |
559 | struct udf_sb_info *sbi = UDF_SB(sb); | 559 | struct udf_sb_info *sbi = UDF_SB(sb); |
560 | int error = 0; | ||
560 | 561 | ||
561 | uopt.flags = sbi->s_flags; | 562 | uopt.flags = sbi->s_flags; |
562 | uopt.uid = sbi->s_uid; | 563 | uopt.uid = sbi->s_uid; |
@@ -582,17 +583,17 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | |||
582 | *flags |= MS_RDONLY; | 583 | *flags |= MS_RDONLY; |
583 | } | 584 | } |
584 | 585 | ||
585 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { | 586 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) |
586 | unlock_kernel(); | 587 | goto out_unlock; |
587 | return 0; | 588 | |
588 | } | ||
589 | if (*flags & MS_RDONLY) | 589 | if (*flags & MS_RDONLY) |
590 | udf_close_lvid(sb); | 590 | udf_close_lvid(sb); |
591 | else | 591 | else |
592 | udf_open_lvid(sb); | 592 | udf_open_lvid(sb); |
593 | 593 | ||
594 | out_unlock: | ||
594 | unlock_kernel(); | 595 | unlock_kernel(); |
595 | return 0; | 596 | return error; |
596 | } | 597 | } |
597 | 598 | ||
598 | /* Check Volume Structure Descriptors (ECMA 167 2/9.1) */ | 599 | /* Check Volume Structure Descriptors (ECMA 167 2/9.1) */ |
@@ -1939,7 +1940,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
1939 | /* Fill in the rest of the superblock */ | 1940 | /* Fill in the rest of the superblock */ |
1940 | sb->s_op = &udf_sb_ops; | 1941 | sb->s_op = &udf_sb_ops; |
1941 | sb->s_export_op = &udf_export_ops; | 1942 | sb->s_export_op = &udf_export_ops; |
1942 | sb->dq_op = NULL; | 1943 | |
1943 | sb->s_dirt = 0; | 1944 | sb->s_dirt = 0; |
1944 | sb->s_magic = UDF_SUPER_MAGIC; | 1945 | sb->s_magic = UDF_SUPER_MAGIC; |
1945 | sb->s_time_gran = 1000; | 1946 | sb->s_time_gran = 1000; |
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index 9079ff7d6255..2bac0354891f 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h | |||
@@ -131,7 +131,6 @@ extern int udf_write_fi(struct inode *inode, struct fileIdentDesc *, | |||
131 | 131 | ||
132 | /* file.c */ | 132 | /* file.c */ |
133 | extern long udf_ioctl(struct file *, unsigned int, unsigned long); | 133 | extern long udf_ioctl(struct file *, unsigned int, unsigned long); |
134 | extern int udf_setattr(struct dentry *dentry, struct iattr *iattr); | ||
135 | /* inode.c */ | 134 | /* inode.c */ |
136 | extern struct inode *udf_iget(struct super_block *, struct kernel_lb_addr *); | 135 | extern struct inode *udf_iget(struct super_block *, struct kernel_lb_addr *); |
137 | extern int udf_sync_inode(struct inode *); | 136 | extern int udf_sync_inode(struct inode *); |
diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index 5cfa4d85ccf2..048484fb10d2 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <linux/stat.h> | 12 | #include <linux/stat.h> |
13 | #include <linux/time.h> | 13 | #include <linux/time.h> |
14 | #include <linux/string.h> | 14 | #include <linux/string.h> |
15 | #include <linux/quotaops.h> | ||
16 | #include <linux/buffer_head.h> | 15 | #include <linux/buffer_head.h> |
17 | #include <linux/capability.h> | 16 | #include <linux/capability.h> |
18 | #include <linux/bitops.h> | 17 | #include <linux/bitops.h> |
@@ -85,9 +84,6 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count) | |||
85 | "bit already cleared for fragment %u", i); | 84 | "bit already cleared for fragment %u", i); |
86 | } | 85 | } |
87 | 86 | ||
88 | dquot_free_block(inode, count); | ||
89 | |||
90 | |||
91 | fs32_add(sb, &ucg->cg_cs.cs_nffree, count); | 87 | fs32_add(sb, &ucg->cg_cs.cs_nffree, count); |
92 | uspi->cs_total.cs_nffree += count; | 88 | uspi->cs_total.cs_nffree += count; |
93 | fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count); | 89 | fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count); |
@@ -195,7 +191,6 @@ do_more: | |||
195 | ubh_setblock(UCPI_UBH(ucpi), ucpi->c_freeoff, blkno); | 191 | ubh_setblock(UCPI_UBH(ucpi), ucpi->c_freeoff, blkno); |
196 | if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD) | 192 | if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD) |
197 | ufs_clusteracct (sb, ucpi, blkno, 1); | 193 | ufs_clusteracct (sb, ucpi, blkno, 1); |
198 | dquot_free_block(inode, uspi->s_fpb); | ||
199 | 194 | ||
200 | fs32_add(sb, &ucg->cg_cs.cs_nbfree, 1); | 195 | fs32_add(sb, &ucg->cg_cs.cs_nbfree, 1); |
201 | uspi->cs_total.cs_nbfree++; | 196 | uspi->cs_total.cs_nbfree++; |
@@ -511,7 +506,6 @@ static u64 ufs_add_fragments(struct inode *inode, u64 fragment, | |||
511 | struct ufs_cg_private_info * ucpi; | 506 | struct ufs_cg_private_info * ucpi; |
512 | struct ufs_cylinder_group * ucg; | 507 | struct ufs_cylinder_group * ucg; |
513 | unsigned cgno, fragno, fragoff, count, fragsize, i; | 508 | unsigned cgno, fragno, fragoff, count, fragsize, i; |
514 | int ret; | ||
515 | 509 | ||
516 | UFSD("ENTER, fragment %llu, oldcount %u, newcount %u\n", | 510 | UFSD("ENTER, fragment %llu, oldcount %u, newcount %u\n", |
517 | (unsigned long long)fragment, oldcount, newcount); | 511 | (unsigned long long)fragment, oldcount, newcount); |
@@ -557,11 +551,6 @@ static u64 ufs_add_fragments(struct inode *inode, u64 fragment, | |||
557 | fs32_add(sb, &ucg->cg_frsum[fragsize - count], 1); | 551 | fs32_add(sb, &ucg->cg_frsum[fragsize - count], 1); |
558 | for (i = oldcount; i < newcount; i++) | 552 | for (i = oldcount; i < newcount; i++) |
559 | ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i); | 553 | ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i); |
560 | ret = dquot_alloc_block(inode, count); | ||
561 | if (ret) { | ||
562 | *err = ret; | ||
563 | return 0; | ||
564 | } | ||
565 | 554 | ||
566 | fs32_sub(sb, &ucg->cg_cs.cs_nffree, count); | 555 | fs32_sub(sb, &ucg->cg_cs.cs_nffree, count); |
567 | fs32_sub(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count); | 556 | fs32_sub(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count); |
@@ -598,7 +587,6 @@ static u64 ufs_alloc_fragments(struct inode *inode, unsigned cgno, | |||
598 | struct ufs_cylinder_group * ucg; | 587 | struct ufs_cylinder_group * ucg; |
599 | unsigned oldcg, i, j, k, allocsize; | 588 | unsigned oldcg, i, j, k, allocsize; |
600 | u64 result; | 589 | u64 result; |
601 | int ret; | ||
602 | 590 | ||
603 | UFSD("ENTER, ino %lu, cgno %u, goal %llu, count %u\n", | 591 | UFSD("ENTER, ino %lu, cgno %u, goal %llu, count %u\n", |
604 | inode->i_ino, cgno, (unsigned long long)goal, count); | 592 | inode->i_ino, cgno, (unsigned long long)goal, count); |
@@ -667,7 +655,6 @@ cg_found: | |||
667 | for (i = count; i < uspi->s_fpb; i++) | 655 | for (i = count; i < uspi->s_fpb; i++) |
668 | ubh_setbit (UCPI_UBH(ucpi), ucpi->c_freeoff, goal + i); | 656 | ubh_setbit (UCPI_UBH(ucpi), ucpi->c_freeoff, goal + i); |
669 | i = uspi->s_fpb - count; | 657 | i = uspi->s_fpb - count; |
670 | dquot_free_block(inode, i); | ||
671 | 658 | ||
672 | fs32_add(sb, &ucg->cg_cs.cs_nffree, i); | 659 | fs32_add(sb, &ucg->cg_cs.cs_nffree, i); |
673 | uspi->cs_total.cs_nffree += i; | 660 | uspi->cs_total.cs_nffree += i; |
@@ -679,11 +666,6 @@ cg_found: | |||
679 | result = ufs_bitmap_search (sb, ucpi, goal, allocsize); | 666 | result = ufs_bitmap_search (sb, ucpi, goal, allocsize); |
680 | if (result == INVBLOCK) | 667 | if (result == INVBLOCK) |
681 | return 0; | 668 | return 0; |
682 | ret = dquot_alloc_block(inode, count); | ||
683 | if (ret) { | ||
684 | *err = ret; | ||
685 | return 0; | ||
686 | } | ||
687 | for (i = 0; i < count; i++) | 669 | for (i = 0; i < count; i++) |
688 | ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, result + i); | 670 | ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, result + i); |
689 | 671 | ||
@@ -718,7 +700,6 @@ static u64 ufs_alloccg_block(struct inode *inode, | |||
718 | struct ufs_super_block_first * usb1; | 700 | struct ufs_super_block_first * usb1; |
719 | struct ufs_cylinder_group * ucg; | 701 | struct ufs_cylinder_group * ucg; |
720 | u64 result, blkno; | 702 | u64 result, blkno; |
721 | int ret; | ||
722 | 703 | ||
723 | UFSD("ENTER, goal %llu\n", (unsigned long long)goal); | 704 | UFSD("ENTER, goal %llu\n", (unsigned long long)goal); |
724 | 705 | ||
@@ -752,11 +733,6 @@ gotit: | |||
752 | ubh_clrblock (UCPI_UBH(ucpi), ucpi->c_freeoff, blkno); | 733 | ubh_clrblock (UCPI_UBH(ucpi), ucpi->c_freeoff, blkno); |
753 | if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD) | 734 | if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD) |
754 | ufs_clusteracct (sb, ucpi, blkno, -1); | 735 | ufs_clusteracct (sb, ucpi, blkno, -1); |
755 | ret = dquot_alloc_block(inode, uspi->s_fpb); | ||
756 | if (ret) { | ||
757 | *err = ret; | ||
758 | return INVBLOCK; | ||
759 | } | ||
760 | 736 | ||
761 | fs32_sub(sb, &ucg->cg_cs.cs_nbfree, 1); | 737 | fs32_sub(sb, &ucg->cg_cs.cs_nbfree, 1); |
762 | uspi->cs_total.cs_nbfree--; | 738 | uspi->cs_total.cs_nbfree--; |
diff --git a/fs/ufs/file.c b/fs/ufs/file.c index d4c30d1bef86..33afa20d4509 100644 --- a/fs/ufs/file.c +++ b/fs/ufs/file.c | |||
@@ -24,7 +24,6 @@ | |||
24 | */ | 24 | */ |
25 | 25 | ||
26 | #include <linux/fs.h> | 26 | #include <linux/fs.h> |
27 | #include <linux/quotaops.h> | ||
28 | 27 | ||
29 | #include "ufs_fs.h" | 28 | #include "ufs_fs.h" |
30 | #include "ufs.h" | 29 | #include "ufs.h" |
@@ -41,7 +40,7 @@ const struct file_operations ufs_file_operations = { | |||
41 | .write = do_sync_write, | 40 | .write = do_sync_write, |
42 | .aio_write = generic_file_aio_write, | 41 | .aio_write = generic_file_aio_write, |
43 | .mmap = generic_file_mmap, | 42 | .mmap = generic_file_mmap, |
44 | .open = dquot_file_open, | 43 | .open = generic_file_open, |
45 | .fsync = generic_file_fsync, | 44 | .fsync = generic_file_fsync, |
46 | .splice_read = generic_file_splice_read, | 45 | .splice_read = generic_file_splice_read, |
47 | }; | 46 | }; |
diff --git a/fs/ufs/ialloc.c b/fs/ufs/ialloc.c index 3a959d55084d..594480e537d2 100644 --- a/fs/ufs/ialloc.c +++ b/fs/ufs/ialloc.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/time.h> | 27 | #include <linux/time.h> |
28 | #include <linux/stat.h> | 28 | #include <linux/stat.h> |
29 | #include <linux/string.h> | 29 | #include <linux/string.h> |
30 | #include <linux/quotaops.h> | ||
31 | #include <linux/buffer_head.h> | 30 | #include <linux/buffer_head.h> |
32 | #include <linux/sched.h> | 31 | #include <linux/sched.h> |
33 | #include <linux/bitops.h> | 32 | #include <linux/bitops.h> |
@@ -95,9 +94,6 @@ void ufs_free_inode (struct inode * inode) | |||
95 | 94 | ||
96 | is_directory = S_ISDIR(inode->i_mode); | 95 | is_directory = S_ISDIR(inode->i_mode); |
97 | 96 | ||
98 | dquot_free_inode(inode); | ||
99 | dquot_drop(inode); | ||
100 | |||
101 | clear_inode (inode); | 97 | clear_inode (inode); |
102 | 98 | ||
103 | if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit)) | 99 | if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit)) |
@@ -347,21 +343,12 @@ cg_found: | |||
347 | 343 | ||
348 | unlock_super (sb); | 344 | unlock_super (sb); |
349 | 345 | ||
350 | dquot_initialize(inode); | ||
351 | err = dquot_alloc_inode(inode); | ||
352 | if (err) { | ||
353 | dquot_drop(inode); | ||
354 | goto fail_without_unlock; | ||
355 | } | ||
356 | |||
357 | UFSD("allocating inode %lu\n", inode->i_ino); | 346 | UFSD("allocating inode %lu\n", inode->i_ino); |
358 | UFSD("EXIT\n"); | 347 | UFSD("EXIT\n"); |
359 | return inode; | 348 | return inode; |
360 | 349 | ||
361 | fail_remove_inode: | 350 | fail_remove_inode: |
362 | unlock_super(sb); | 351 | unlock_super(sb); |
363 | fail_without_unlock: | ||
364 | inode->i_flags |= S_NOQUOTA; | ||
365 | inode->i_nlink = 0; | 352 | inode->i_nlink = 0; |
366 | iput(inode); | 353 | iput(inode); |
367 | UFSD("EXIT (FAILED): err %d\n", err); | 354 | UFSD("EXIT (FAILED): err %d\n", err); |
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index cffa756f1047..73fe773aa034 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #include <linux/smp_lock.h> | 37 | #include <linux/smp_lock.h> |
38 | #include <linux/buffer_head.h> | 38 | #include <linux/buffer_head.h> |
39 | #include <linux/writeback.h> | 39 | #include <linux/writeback.h> |
40 | #include <linux/quotaops.h> | ||
41 | 40 | ||
42 | #include "ufs_fs.h" | 41 | #include "ufs_fs.h" |
43 | #include "ufs.h" | 42 | #include "ufs.h" |
@@ -910,9 +909,6 @@ void ufs_delete_inode (struct inode * inode) | |||
910 | { | 909 | { |
911 | loff_t old_i_size; | 910 | loff_t old_i_size; |
912 | 911 | ||
913 | if (!is_bad_inode(inode)) | ||
914 | dquot_initialize(inode); | ||
915 | |||
916 | truncate_inode_pages(&inode->i_data, 0); | 912 | truncate_inode_pages(&inode->i_data, 0); |
917 | if (is_bad_inode(inode)) | 913 | if (is_bad_inode(inode)) |
918 | goto no_delete; | 914 | goto no_delete; |
diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index eabc02eb1294..b056f02b1fb3 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c | |||
@@ -30,7 +30,6 @@ | |||
30 | #include <linux/time.h> | 30 | #include <linux/time.h> |
31 | #include <linux/fs.h> | 31 | #include <linux/fs.h> |
32 | #include <linux/smp_lock.h> | 32 | #include <linux/smp_lock.h> |
33 | #include <linux/quotaops.h> | ||
34 | 33 | ||
35 | #include "ufs_fs.h" | 34 | #include "ufs_fs.h" |
36 | #include "ufs.h" | 35 | #include "ufs.h" |
@@ -86,8 +85,6 @@ static int ufs_create (struct inode * dir, struct dentry * dentry, int mode, | |||
86 | 85 | ||
87 | UFSD("BEGIN\n"); | 86 | UFSD("BEGIN\n"); |
88 | 87 | ||
89 | dquot_initialize(dir); | ||
90 | |||
91 | inode = ufs_new_inode(dir, mode); | 88 | inode = ufs_new_inode(dir, mode); |
92 | err = PTR_ERR(inode); | 89 | err = PTR_ERR(inode); |
93 | 90 | ||
@@ -112,8 +109,6 @@ static int ufs_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t | |||
112 | if (!old_valid_dev(rdev)) | 109 | if (!old_valid_dev(rdev)) |
113 | return -EINVAL; | 110 | return -EINVAL; |
114 | 111 | ||
115 | dquot_initialize(dir); | ||
116 | |||
117 | inode = ufs_new_inode(dir, mode); | 112 | inode = ufs_new_inode(dir, mode); |
118 | err = PTR_ERR(inode); | 113 | err = PTR_ERR(inode); |
119 | if (!IS_ERR(inode)) { | 114 | if (!IS_ERR(inode)) { |
@@ -138,8 +133,6 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry, | |||
138 | if (l > sb->s_blocksize) | 133 | if (l > sb->s_blocksize) |
139 | goto out_notlocked; | 134 | goto out_notlocked; |
140 | 135 | ||
141 | dquot_initialize(dir); | ||
142 | |||
143 | lock_kernel(); | 136 | lock_kernel(); |
144 | inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO); | 137 | inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO); |
145 | err = PTR_ERR(inode); | 138 | err = PTR_ERR(inode); |
@@ -185,8 +178,6 @@ static int ufs_link (struct dentry * old_dentry, struct inode * dir, | |||
185 | return -EMLINK; | 178 | return -EMLINK; |
186 | } | 179 | } |
187 | 180 | ||
188 | dquot_initialize(dir); | ||
189 | |||
190 | inode->i_ctime = CURRENT_TIME_SEC; | 181 | inode->i_ctime = CURRENT_TIME_SEC; |
191 | inode_inc_link_count(inode); | 182 | inode_inc_link_count(inode); |
192 | atomic_inc(&inode->i_count); | 183 | atomic_inc(&inode->i_count); |
@@ -204,8 +195,6 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, int mode) | |||
204 | if (dir->i_nlink >= UFS_LINK_MAX) | 195 | if (dir->i_nlink >= UFS_LINK_MAX) |
205 | goto out; | 196 | goto out; |
206 | 197 | ||
207 | dquot_initialize(dir); | ||
208 | |||
209 | lock_kernel(); | 198 | lock_kernel(); |
210 | inode_inc_link_count(dir); | 199 | inode_inc_link_count(dir); |
211 | 200 | ||
@@ -250,8 +239,6 @@ static int ufs_unlink(struct inode *dir, struct dentry *dentry) | |||
250 | struct page *page; | 239 | struct page *page; |
251 | int err = -ENOENT; | 240 | int err = -ENOENT; |
252 | 241 | ||
253 | dquot_initialize(dir); | ||
254 | |||
255 | de = ufs_find_entry(dir, &dentry->d_name, &page); | 242 | de = ufs_find_entry(dir, &dentry->d_name, &page); |
256 | if (!de) | 243 | if (!de) |
257 | goto out; | 244 | goto out; |
@@ -296,9 +283,6 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
296 | struct ufs_dir_entry *old_de; | 283 | struct ufs_dir_entry *old_de; |
297 | int err = -ENOENT; | 284 | int err = -ENOENT; |
298 | 285 | ||
299 | dquot_initialize(old_dir); | ||
300 | dquot_initialize(new_dir); | ||
301 | |||
302 | old_de = ufs_find_entry(old_dir, &old_dentry->d_name, &old_page); | 286 | old_de = ufs_find_entry(old_dir, &old_dentry->d_name, &old_page); |
303 | if (!old_de) | 287 | if (!old_de) |
304 | goto out; | 288 | goto out; |
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index ad9bc1ebd3a6..3ec5a9eb6efb 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
@@ -77,7 +77,6 @@ | |||
77 | 77 | ||
78 | #include <linux/errno.h> | 78 | #include <linux/errno.h> |
79 | #include <linux/fs.h> | 79 | #include <linux/fs.h> |
80 | #include <linux/quotaops.h> | ||
81 | #include <linux/slab.h> | 80 | #include <linux/slab.h> |
82 | #include <linux/time.h> | 81 | #include <linux/time.h> |
83 | #include <linux/stat.h> | 82 | #include <linux/stat.h> |
@@ -1047,7 +1046,7 @@ magic_found: | |||
1047 | */ | 1046 | */ |
1048 | sb->s_op = &ufs_super_ops; | 1047 | sb->s_op = &ufs_super_ops; |
1049 | sb->s_export_op = &ufs_export_ops; | 1048 | sb->s_export_op = &ufs_export_ops; |
1050 | sb->dq_op = NULL; /***/ | 1049 | |
1051 | sb->s_magic = fs32_to_cpu(sb, usb3->fs_magic); | 1050 | sb->s_magic = fs32_to_cpu(sb, usb3->fs_magic); |
1052 | 1051 | ||
1053 | uspi->s_sblkno = fs32_to_cpu(sb, usb1->fs_sblkno); | 1052 | uspi->s_sblkno = fs32_to_cpu(sb, usb1->fs_sblkno); |
@@ -1437,126 +1436,19 @@ static void destroy_inodecache(void) | |||
1437 | kmem_cache_destroy(ufs_inode_cachep); | 1436 | kmem_cache_destroy(ufs_inode_cachep); |
1438 | } | 1437 | } |
1439 | 1438 | ||
1440 | static void ufs_clear_inode(struct inode *inode) | ||
1441 | { | ||
1442 | dquot_drop(inode); | ||
1443 | } | ||
1444 | |||
1445 | #ifdef CONFIG_QUOTA | ||
1446 | static ssize_t ufs_quota_read(struct super_block *, int, char *,size_t, loff_t); | ||
1447 | static ssize_t ufs_quota_write(struct super_block *, int, const char *, size_t, loff_t); | ||
1448 | #endif | ||
1449 | |||
1450 | static const struct super_operations ufs_super_ops = { | 1439 | static const struct super_operations ufs_super_ops = { |
1451 | .alloc_inode = ufs_alloc_inode, | 1440 | .alloc_inode = ufs_alloc_inode, |
1452 | .destroy_inode = ufs_destroy_inode, | 1441 | .destroy_inode = ufs_destroy_inode, |
1453 | .write_inode = ufs_write_inode, | 1442 | .write_inode = ufs_write_inode, |
1454 | .delete_inode = ufs_delete_inode, | 1443 | .delete_inode = ufs_delete_inode, |
1455 | .clear_inode = ufs_clear_inode, | ||
1456 | .put_super = ufs_put_super, | 1444 | .put_super = ufs_put_super, |
1457 | .write_super = ufs_write_super, | 1445 | .write_super = ufs_write_super, |
1458 | .sync_fs = ufs_sync_fs, | 1446 | .sync_fs = ufs_sync_fs, |
1459 | .statfs = ufs_statfs, | 1447 | .statfs = ufs_statfs, |
1460 | .remount_fs = ufs_remount, | 1448 | .remount_fs = ufs_remount, |
1461 | .show_options = ufs_show_options, | 1449 | .show_options = ufs_show_options, |
1462 | #ifdef CONFIG_QUOTA | ||
1463 | .quota_read = ufs_quota_read, | ||
1464 | .quota_write = ufs_quota_write, | ||
1465 | #endif | ||
1466 | }; | 1450 | }; |
1467 | 1451 | ||
1468 | #ifdef CONFIG_QUOTA | ||
1469 | |||
1470 | /* Read data from quotafile - avoid pagecache and such because we cannot afford | ||
1471 | * acquiring the locks... As quota files are never truncated and quota code | ||
1472 | * itself serializes the operations (and noone else should touch the files) | ||
1473 | * we don't have to be afraid of races */ | ||
1474 | static ssize_t ufs_quota_read(struct super_block *sb, int type, char *data, | ||
1475 | size_t len, loff_t off) | ||
1476 | { | ||
1477 | struct inode *inode = sb_dqopt(sb)->files[type]; | ||
1478 | sector_t blk = off >> sb->s_blocksize_bits; | ||
1479 | int err = 0; | ||
1480 | int offset = off & (sb->s_blocksize - 1); | ||
1481 | int tocopy; | ||
1482 | size_t toread; | ||
1483 | struct buffer_head *bh; | ||
1484 | loff_t i_size = i_size_read(inode); | ||
1485 | |||
1486 | if (off > i_size) | ||
1487 | return 0; | ||
1488 | if (off+len > i_size) | ||
1489 | len = i_size-off; | ||
1490 | toread = len; | ||
1491 | while (toread > 0) { | ||
1492 | tocopy = sb->s_blocksize - offset < toread ? | ||
1493 | sb->s_blocksize - offset : toread; | ||
1494 | |||
1495 | bh = ufs_bread(inode, blk, 0, &err); | ||
1496 | if (err) | ||
1497 | return err; | ||
1498 | if (!bh) /* A hole? */ | ||
1499 | memset(data, 0, tocopy); | ||
1500 | else { | ||
1501 | memcpy(data, bh->b_data+offset, tocopy); | ||
1502 | brelse(bh); | ||
1503 | } | ||
1504 | offset = 0; | ||
1505 | toread -= tocopy; | ||
1506 | data += tocopy; | ||
1507 | blk++; | ||
1508 | } | ||
1509 | return len; | ||
1510 | } | ||
1511 | |||
1512 | /* Write to quotafile */ | ||
1513 | static ssize_t ufs_quota_write(struct super_block *sb, int type, | ||
1514 | const char *data, size_t len, loff_t off) | ||
1515 | { | ||
1516 | struct inode *inode = sb_dqopt(sb)->files[type]; | ||
1517 | sector_t blk = off >> sb->s_blocksize_bits; | ||
1518 | int err = 0; | ||
1519 | int offset = off & (sb->s_blocksize - 1); | ||
1520 | int tocopy; | ||
1521 | size_t towrite = len; | ||
1522 | struct buffer_head *bh; | ||
1523 | |||
1524 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); | ||
1525 | while (towrite > 0) { | ||
1526 | tocopy = sb->s_blocksize - offset < towrite ? | ||
1527 | sb->s_blocksize - offset : towrite; | ||
1528 | |||
1529 | bh = ufs_bread(inode, blk, 1, &err); | ||
1530 | if (!bh) | ||
1531 | goto out; | ||
1532 | lock_buffer(bh); | ||
1533 | memcpy(bh->b_data+offset, data, tocopy); | ||
1534 | flush_dcache_page(bh->b_page); | ||
1535 | set_buffer_uptodate(bh); | ||
1536 | mark_buffer_dirty(bh); | ||
1537 | unlock_buffer(bh); | ||
1538 | brelse(bh); | ||
1539 | offset = 0; | ||
1540 | towrite -= tocopy; | ||
1541 | data += tocopy; | ||
1542 | blk++; | ||
1543 | } | ||
1544 | out: | ||
1545 | if (len == towrite) { | ||
1546 | mutex_unlock(&inode->i_mutex); | ||
1547 | return err; | ||
1548 | } | ||
1549 | if (inode->i_size < off+len-towrite) | ||
1550 | i_size_write(inode, off+len-towrite); | ||
1551 | inode->i_version++; | ||
1552 | inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC; | ||
1553 | mark_inode_dirty(inode); | ||
1554 | mutex_unlock(&inode->i_mutex); | ||
1555 | return len - towrite; | ||
1556 | } | ||
1557 | |||
1558 | #endif | ||
1559 | |||
1560 | static int ufs_get_sb(struct file_system_type *fs_type, | 1452 | static int ufs_get_sb(struct file_system_type *fs_type, |
1561 | int flags, const char *dev_name, void *data, struct vfsmount *mnt) | 1453 | int flags, const char *dev_name, void *data, struct vfsmount *mnt) |
1562 | { | 1454 | { |
diff --git a/fs/ufs/truncate.c b/fs/ufs/truncate.c index 3733057e7833..589e01a465ba 100644 --- a/fs/ufs/truncate.c +++ b/fs/ufs/truncate.c | |||
@@ -44,7 +44,6 @@ | |||
44 | #include <linux/buffer_head.h> | 44 | #include <linux/buffer_head.h> |
45 | #include <linux/blkdev.h> | 45 | #include <linux/blkdev.h> |
46 | #include <linux/sched.h> | 46 | #include <linux/sched.h> |
47 | #include <linux/quotaops.h> | ||
48 | 47 | ||
49 | #include "ufs_fs.h" | 48 | #include "ufs_fs.h" |
50 | #include "ufs.h" | 49 | #include "ufs.h" |
@@ -516,15 +515,6 @@ int ufs_setattr(struct dentry *dentry, struct iattr *attr) | |||
516 | if (error) | 515 | if (error) |
517 | return error; | 516 | return error; |
518 | 517 | ||
519 | if (is_quota_modification(inode, attr)) | ||
520 | dquot_initialize(inode); | ||
521 | |||
522 | if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || | ||
523 | (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { | ||
524 | error = dquot_transfer(inode, attr); | ||
525 | if (error) | ||
526 | return error; | ||
527 | } | ||
528 | if (ia_valid & ATTR_SIZE && attr->ia_size != inode->i_size) { | 518 | if (ia_valid & ATTR_SIZE && attr->ia_size != inode->i_size) { |
529 | loff_t old_i_size = inode->i_size; | 519 | loff_t old_i_size = inode->i_size; |
530 | 520 | ||
diff --git a/include/linux/quota.h b/include/linux/quota.h index 7126a15467f1..94c1f03b50eb 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h | |||
@@ -174,8 +174,7 @@ enum { | |||
174 | #include <linux/rwsem.h> | 174 | #include <linux/rwsem.h> |
175 | #include <linux/spinlock.h> | 175 | #include <linux/spinlock.h> |
176 | #include <linux/wait.h> | 176 | #include <linux/wait.h> |
177 | #include <linux/percpu.h> | 177 | #include <linux/percpu_counter.h> |
178 | #include <linux/smp.h> | ||
179 | 178 | ||
180 | #include <linux/dqblk_xfs.h> | 179 | #include <linux/dqblk_xfs.h> |
181 | #include <linux/dqblk_v1.h> | 180 | #include <linux/dqblk_v1.h> |
@@ -254,6 +253,7 @@ enum { | |||
254 | 253 | ||
255 | struct dqstats { | 254 | struct dqstats { |
256 | int stat[_DQST_DQSTAT_LAST]; | 255 | int stat[_DQST_DQSTAT_LAST]; |
256 | struct percpu_counter counter[_DQST_DQSTAT_LAST]; | ||
257 | }; | 257 | }; |
258 | 258 | ||
259 | extern struct dqstats *dqstats_pcpu; | 259 | extern struct dqstats *dqstats_pcpu; |
@@ -261,20 +261,12 @@ extern struct dqstats dqstats; | |||
261 | 261 | ||
262 | static inline void dqstats_inc(unsigned int type) | 262 | static inline void dqstats_inc(unsigned int type) |
263 | { | 263 | { |
264 | #ifdef CONFIG_SMP | 264 | percpu_counter_inc(&dqstats.counter[type]); |
265 | per_cpu_ptr(dqstats_pcpu, smp_processor_id())->stat[type]++; | ||
266 | #else | ||
267 | dqstats.stat[type]++; | ||
268 | #endif | ||
269 | } | 265 | } |
270 | 266 | ||
271 | static inline void dqstats_dec(unsigned int type) | 267 | static inline void dqstats_dec(unsigned int type) |
272 | { | 268 | { |
273 | #ifdef CONFIG_SMP | 269 | percpu_counter_dec(&dqstats.counter[type]); |
274 | per_cpu_ptr(dqstats_pcpu, smp_processor_id())->stat[type]--; | ||
275 | #else | ||
276 | dqstats.stat[type]--; | ||
277 | #endif | ||
278 | } | 270 | } |
279 | 271 | ||
280 | #define DQ_MOD_B 0 /* dquot modified since read */ | 272 | #define DQ_MOD_B 0 /* dquot modified since read */ |
@@ -332,8 +324,8 @@ struct dquot_operations { | |||
332 | 324 | ||
333 | /* Operations handling requests from userspace */ | 325 | /* Operations handling requests from userspace */ |
334 | struct quotactl_ops { | 326 | struct quotactl_ops { |
335 | int (*quota_on)(struct super_block *, int, int, char *, int); | 327 | int (*quota_on)(struct super_block *, int, int, char *); |
336 | int (*quota_off)(struct super_block *, int, int); | 328 | int (*quota_off)(struct super_block *, int); |
337 | int (*quota_sync)(struct super_block *, int, int); | 329 | int (*quota_sync)(struct super_block *, int, int); |
338 | int (*get_info)(struct super_block *, int, struct if_dqinfo *); | 330 | int (*get_info)(struct super_block *, int, struct if_dqinfo *); |
339 | int (*set_info)(struct super_block *, int, struct if_dqinfo *); | 331 | int (*set_info)(struct super_block *, int, struct if_dqinfo *); |
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index e38ae53f3529..aa36793b48bd 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h | |||
@@ -53,6 +53,14 @@ int dquot_alloc_inode(const struct inode *inode); | |||
53 | int dquot_claim_space_nodirty(struct inode *inode, qsize_t number); | 53 | int dquot_claim_space_nodirty(struct inode *inode, qsize_t number); |
54 | void dquot_free_inode(const struct inode *inode); | 54 | void dquot_free_inode(const struct inode *inode); |
55 | 55 | ||
56 | int dquot_disable(struct super_block *sb, int type, unsigned int flags); | ||
57 | /* Suspend quotas on remount RO */ | ||
58 | static inline int dquot_suspend(struct super_block *sb, int type) | ||
59 | { | ||
60 | return dquot_disable(sb, type, DQUOT_SUSPENDED); | ||
61 | } | ||
62 | int dquot_resume(struct super_block *sb, int type); | ||
63 | |||
56 | int dquot_commit(struct dquot *dquot); | 64 | int dquot_commit(struct dquot *dquot); |
57 | int dquot_acquire(struct dquot *dquot); | 65 | int dquot_acquire(struct dquot *dquot); |
58 | int dquot_release(struct dquot *dquot); | 66 | int dquot_release(struct dquot *dquot); |
@@ -61,27 +69,25 @@ int dquot_mark_dquot_dirty(struct dquot *dquot); | |||
61 | 69 | ||
62 | int dquot_file_open(struct inode *inode, struct file *file); | 70 | int dquot_file_open(struct inode *inode, struct file *file); |
63 | 71 | ||
64 | int vfs_quota_on(struct super_block *sb, int type, int format_id, | 72 | int dquot_quota_on(struct super_block *sb, int type, int format_id, |
65 | char *path, int remount); | 73 | char *path); |
66 | int vfs_quota_enable(struct inode *inode, int type, int format_id, | 74 | int dquot_enable(struct inode *inode, int type, int format_id, |
67 | unsigned int flags); | 75 | unsigned int flags); |
68 | int vfs_quota_on_path(struct super_block *sb, int type, int format_id, | 76 | int dquot_quota_on_path(struct super_block *sb, int type, int format_id, |
69 | struct path *path); | 77 | struct path *path); |
70 | int vfs_quota_on_mount(struct super_block *sb, char *qf_name, | 78 | int dquot_quota_on_mount(struct super_block *sb, char *qf_name, |
71 | int format_id, int type); | 79 | int format_id, int type); |
72 | int vfs_quota_off(struct super_block *sb, int type, int remount); | 80 | int dquot_quota_off(struct super_block *sb, int type); |
73 | int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags); | 81 | int dquot_quota_sync(struct super_block *sb, int type, int wait); |
74 | int vfs_quota_sync(struct super_block *sb, int type, int wait); | 82 | int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); |
75 | int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); | 83 | int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); |
76 | int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); | 84 | int dquot_get_dqblk(struct super_block *sb, int type, qid_t id, |
77 | int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, | ||
78 | struct fs_disk_quota *di); | 85 | struct fs_disk_quota *di); |
79 | int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, | 86 | int dquot_set_dqblk(struct super_block *sb, int type, qid_t id, |
80 | struct fs_disk_quota *di); | 87 | struct fs_disk_quota *di); |
81 | 88 | ||
82 | int __dquot_transfer(struct inode *inode, struct dquot **transfer_to); | 89 | int __dquot_transfer(struct inode *inode, struct dquot **transfer_to); |
83 | int dquot_transfer(struct inode *inode, struct iattr *iattr); | 90 | int dquot_transfer(struct inode *inode, struct iattr *iattr); |
84 | int vfs_dq_quota_on_remount(struct super_block *sb); | ||
85 | 91 | ||
86 | static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type) | 92 | static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type) |
87 | { | 93 | { |
@@ -148,20 +154,7 @@ static inline unsigned sb_any_quota_active(struct super_block *sb) | |||
148 | * Operations supported for diskquotas. | 154 | * Operations supported for diskquotas. |
149 | */ | 155 | */ |
150 | extern const struct dquot_operations dquot_operations; | 156 | extern const struct dquot_operations dquot_operations; |
151 | extern const struct quotactl_ops vfs_quotactl_ops; | 157 | extern const struct quotactl_ops dquot_quotactl_ops; |
152 | |||
153 | #define sb_dquot_ops (&dquot_operations) | ||
154 | #define sb_quotactl_ops (&vfs_quotactl_ops) | ||
155 | |||
156 | /* Cannot be called inside a transaction */ | ||
157 | static inline int vfs_dq_off(struct super_block *sb, int remount) | ||
158 | { | ||
159 | int ret = -ENOSYS; | ||
160 | |||
161 | if (sb->s_qcop && sb->s_qcop->quota_off) | ||
162 | ret = sb->s_qcop->quota_off(sb, -1, remount); | ||
163 | return ret; | ||
164 | } | ||
165 | 158 | ||
166 | #else | 159 | #else |
167 | 160 | ||
@@ -206,12 +199,6 @@ static inline int sb_any_quota_active(struct super_block *sb) | |||
206 | return 0; | 199 | return 0; |
207 | } | 200 | } |
208 | 201 | ||
209 | /* | ||
210 | * NO-OP when quota not configured. | ||
211 | */ | ||
212 | #define sb_dquot_ops (NULL) | ||
213 | #define sb_quotactl_ops (NULL) | ||
214 | |||
215 | static inline void dquot_initialize(struct inode *inode) | 202 | static inline void dquot_initialize(struct inode *inode) |
216 | { | 203 | { |
217 | } | 204 | } |
@@ -229,16 +216,6 @@ static inline void dquot_free_inode(const struct inode *inode) | |||
229 | { | 216 | { |
230 | } | 217 | } |
231 | 218 | ||
232 | static inline int vfs_dq_off(struct super_block *sb, int remount) | ||
233 | { | ||
234 | return 0; | ||
235 | } | ||
236 | |||
237 | static inline int vfs_dq_quota_on_remount(struct super_block *sb) | ||
238 | { | ||
239 | return 0; | ||
240 | } | ||
241 | |||
242 | static inline int dquot_transfer(struct inode *inode, struct iattr *iattr) | 219 | static inline int dquot_transfer(struct inode *inode, struct iattr *iattr) |
243 | { | 220 | { |
244 | return 0; | 221 | return 0; |
@@ -265,6 +242,22 @@ static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number) | |||
265 | return 0; | 242 | return 0; |
266 | } | 243 | } |
267 | 244 | ||
245 | static inline int dquot_disable(struct super_block *sb, int type, | ||
246 | unsigned int flags) | ||
247 | { | ||
248 | return 0; | ||
249 | } | ||
250 | |||
251 | static inline int dquot_suspend(struct super_block *sb, int type) | ||
252 | { | ||
253 | return 0; | ||
254 | } | ||
255 | |||
256 | static inline int dquot_resume(struct super_block *sb, int type) | ||
257 | { | ||
258 | return 0; | ||
259 | } | ||
260 | |||
268 | #define dquot_file_open generic_file_open | 261 | #define dquot_file_open generic_file_open |
269 | 262 | ||
270 | #endif /* CONFIG_QUOTA */ | 263 | #endif /* CONFIG_QUOTA */ |