|
@@ -1118,6 +1118,7 @@ static int ext4_mark_dquot_dirty(struct dquot *dquot);
|
|
|
static int ext4_write_info(struct super_block *sb, int type);
|
|
|
static int ext4_quota_on(struct super_block *sb, int type, int format_id,
|
|
|
char *path);
|
|
|
+static int ext4_quota_off(struct super_block *sb, int type);
|
|
|
static int ext4_quota_on_mount(struct super_block *sb, int type);
|
|
|
static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data,
|
|
|
size_t len, loff_t off);
|
|
@@ -1139,7 +1140,7 @@ static const struct dquot_operations ext4_quota_operations = {
|
|
|
|
|
|
static const struct quotactl_ops ext4_qctl_operations = {
|
|
|
.quota_on = ext4_quota_on,
|
|
|
- .quota_off = dquot_quota_off,
|
|
|
+ .quota_off = ext4_quota_off,
|
|
|
.quota_sync = dquot_quota_sync,
|
|
|
.get_info = dquot_get_dqinfo,
|
|
|
.set_info = dquot_set_dqinfo,
|
|
@@ -4098,6 +4099,18 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id,
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static int ext4_quota_off(struct super_block *sb, int type)
|
|
|
+{
|
|
|
+ /* Force all delayed allocation blocks to be allocated */
|
|
|
+ if (test_opt(sb, DELALLOC)) {
|
|
|
+ down_read(&sb->s_umount);
|
|
|
+ sync_filesystem(sb);
|
|
|
+ up_read(&sb->s_umount);
|
|
|
+ }
|
|
|
+
|
|
|
+ return dquot_quota_off(sb, type);
|
|
|
+}
|
|
|
+
|
|
|
/* Read data from quotafile - avoid pagecache and such because we cannot afford
|
|
|
* acquiring the locks... As quota files are never truncated and quota code
|
|
|
* itself serializes the operations (and noone else should touch the files)
|