aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2010-05-19 07:16:42 -0400
committerJan Kara <jack@suse.cz>2010-05-24 08:09:12 -0400
commite0ccfd959cd8907bcb66cc2042e0f4fd7fcbff2b (patch)
treea62a84034243e75e07bb063526e10ea0b837062f
parent0f0dd62fddcbd0f6830ed8ef3d3426ccc46b9250 (diff)
quota: move unmount handling into the filesystem
Currently the VFS calls into the quotactl interface for unmounting filesystems. This means filesystems with their own quota handling can't easily distinguish between user-space originating quotaoff and an unount. Instead move the responsibily of the unmount handling into the filesystem to be consistent with all other dquot handling. Note that we do call dquot_disable a lot later now, e.g. after a sync_filesystem. But this is fine as the quota code does all its writes via blockdev's mapping and that is synced even later. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r--fs/ext2/super.c2
-rw-r--r--fs/ext3/super.c2
-rw-r--r--fs/ext4/super.c2
-rw-r--r--fs/jfs/super.c2
-rw-r--r--fs/reiserfs/super.c2
-rw-r--r--fs/super.c1
-rw-r--r--fs/udf/super.c2
-rw-r--r--fs/ufs/super.c2
-rw-r--r--include/linux/quotaops.h15
9 files changed, 14 insertions, 16 deletions
diff --git a/fs/ext2/super.c b/fs/ext2/super.c
index 318ebc58bb7b..b9b77c3e7ae0 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
diff --git a/fs/ext3/super.c b/fs/ext3/super.c
index 9d5e582b514a..b2f3715988ba 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);
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 08d31101eb05..808aca3a22f5 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -645,6 +645,8 @@ static void ext4_put_super(struct super_block *sb)
645 struct ext4_super_block *es = sbi->s_es; 645 struct ext4_super_block *es = sbi->s_es;
646 int i, err; 646 int i, err;
647 647
648 dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
649
648 flush_workqueue(sbi->dio_unwritten_wq); 650 flush_workqueue(sbi->dio_unwritten_wq);
649 destroy_workqueue(sbi->dio_unwritten_wq); 651 destroy_workqueue(sbi->dio_unwritten_wq);
650 652
diff --git a/fs/jfs/super.c b/fs/jfs/super.c
index b8a07d4c108e..7d940a3a3d93 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);
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
index 5dad5a2707bc..08879af0af0d 100644
--- a/fs/reiserfs/super.c
+++ b/fs/reiserfs/super.c
@@ -466,6 +466,8 @@ static void reiserfs_put_super(struct super_block *s)
466 struct reiserfs_transaction_handle th; 466 struct reiserfs_transaction_handle th;
467 th.t_trans_id = 0; 467 th.t_trans_id = 0;
468 468
469 dquot_disable(s, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
470
469 reiserfs_write_lock(s); 471 reiserfs_write_lock(s);
470 472
471 if (s->s_dirt) 473 if (s->s_dirt)
diff --git a/fs/super.c b/fs/super.c
index a38e6e9b6f69..05f62e5d464d 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -160,7 +160,6 @@ void deactivate_locked_super(struct super_block *s)
160{ 160{
161 struct file_system_type *fs = s->s_type; 161 struct file_system_type *fs = s->s_type;
162 if (atomic_dec_and_test(&s->s_active)) { 162 if (atomic_dec_and_test(&s->s_active)) {
163 vfs_dq_off(s, 0);
164 fs->kill_sb(s); 163 fs->kill_sb(s);
165 put_filesystem(fs); 164 put_filesystem(fs);
166 put_super(s); 165 put_super(s);
diff --git a/fs/udf/super.c b/fs/udf/super.c
index b154c41a7a9a..76a61566f299 100644
--- a/fs/udf/super.c
+++ b/fs/udf/super.c
@@ -2102,6 +2102,8 @@ static void udf_put_super(struct super_block *sb)
2102 int i; 2102 int i;
2103 struct udf_sb_info *sbi; 2103 struct udf_sb_info *sbi;
2104 2104
2105 dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
2106
2105 sbi = UDF_SB(sb); 2107 sbi = UDF_SB(sb);
2106 2108
2107 lock_kernel(); 2109 lock_kernel();
diff --git a/fs/ufs/super.c b/fs/ufs/super.c
index 495fdc1df7eb..d3977c7128e3 100644
--- a/fs/ufs/super.c
+++ b/fs/ufs/super.c
@@ -1227,6 +1227,8 @@ static void ufs_put_super(struct super_block *sb)
1227 1227
1228 UFSD("ENTER\n"); 1228 UFSD("ENTER\n");
1229 1229
1230 dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
1231
1230 if (sb->s_dirt) 1232 if (sb->s_dirt)
1231 ufs_write_super(sb); 1233 ufs_write_super(sb);
1232 1234
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h
index 811529241e33..cfa2abb1b6d1 100644
--- a/include/linux/quotaops.h
+++ b/include/linux/quotaops.h
@@ -156,16 +156,6 @@ extern const struct quotactl_ops vfs_quotactl_ops;
156#define sb_dquot_ops (&dquot_operations) 156#define sb_dquot_ops (&dquot_operations)
157#define sb_quotactl_ops (&vfs_quotactl_ops) 157#define sb_quotactl_ops (&vfs_quotactl_ops)
158 158
159/* Cannot be called inside a transaction */
160static inline int vfs_dq_off(struct super_block *sb, int remount)
161{
162 int ret = -ENOSYS;
163
164 if (sb->s_qcop && sb->s_qcop->quota_off)
165 ret = sb->s_qcop->quota_off(sb, -1, remount);
166 return ret;
167}
168
169#else 159#else
170 160
171static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type) 161static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
@@ -232,11 +222,6 @@ static inline void dquot_free_inode(const struct inode *inode)
232{ 222{
233} 223}
234 224
235static inline int vfs_dq_off(struct super_block *sb, int remount)
236{
237 return 0;
238}
239
240static inline int dquot_transfer(struct inode *inode, struct iattr *iattr) 225static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
241{ 226{
242 return 0; 227 return 0;