|
@@ -48,44 +48,6 @@ static int check_quotactl_permission(struct super_block *sb, int type, int cmd,
|
|
|
return security_quotactl(cmd, type, id, sb);
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_QUOTA
|
|
|
-void sync_quota_sb(struct super_block *sb, int type)
|
|
|
-{
|
|
|
- int cnt;
|
|
|
-
|
|
|
- if (!sb->s_qcop || !sb->s_qcop->quota_sync)
|
|
|
- return;
|
|
|
-
|
|
|
- sb->s_qcop->quota_sync(sb, type);
|
|
|
-
|
|
|
- if (sb_dqopt(sb)->flags & DQUOT_QUOTA_SYS_FILE)
|
|
|
- return;
|
|
|
- /* This is not very clever (and fast) but currently I don't know about
|
|
|
- * any other simple way of getting quota data to disk and we must get
|
|
|
- * them there for userspace to be visible... */
|
|
|
- if (sb->s_op->sync_fs)
|
|
|
- sb->s_op->sync_fs(sb, 1);
|
|
|
- sync_blockdev(sb->s_bdev);
|
|
|
-
|
|
|
- /*
|
|
|
- * Now when everything is written we can discard the pagecache so
|
|
|
- * that userspace sees the changes.
|
|
|
- */
|
|
|
- mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
|
|
|
- for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
|
|
|
- if (type != -1 && cnt != type)
|
|
|
- continue;
|
|
|
- if (!sb_has_quota_active(sb, cnt))
|
|
|
- continue;
|
|
|
- mutex_lock_nested(&sb_dqopt(sb)->files[cnt]->i_mutex,
|
|
|
- I_MUTEX_QUOTA);
|
|
|
- truncate_inode_pages(&sb_dqopt(sb)->files[cnt]->i_data, 0);
|
|
|
- mutex_unlock(&sb_dqopt(sb)->files[cnt]->i_mutex);
|
|
|
- }
|
|
|
- mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
static int quota_sync_all(int type)
|
|
|
{
|
|
|
struct super_block *sb;
|
|
@@ -101,6 +63,9 @@ static int quota_sync_all(int type)
|
|
|
spin_lock(&sb_lock);
|
|
|
restart:
|
|
|
list_for_each_entry(sb, &super_blocks, s_list) {
|
|
|
+ if (!sb->s_qcop || !sb->s_qcop->quota_sync)
|
|
|
+ continue;
|
|
|
+
|
|
|
/* This test just improves performance so it needn't be
|
|
|
* reliable... */
|
|
|
for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
|
|
@@ -119,7 +84,7 @@ restart:
|
|
|
spin_unlock(&sb_lock);
|
|
|
down_read(&sb->s_umount);
|
|
|
if (sb->s_root)
|
|
|
- sync_quota_sb(sb, type);
|
|
|
+ sb->s_qcop->quota_sync(sb, type, 1);
|
|
|
up_read(&sb->s_umount);
|
|
|
spin_lock(&sb_lock);
|
|
|
if (__put_super_and_need_restart(sb))
|
|
@@ -306,8 +271,7 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
|
|
|
case Q_SYNC:
|
|
|
if (!sb->s_qcop->quota_sync)
|
|
|
return -ENOSYS;
|
|
|
- sync_quota_sb(sb, type);
|
|
|
- return 0;
|
|
|
+ return sb->s_qcop->quota_sync(sb, type, 1);
|
|
|
case Q_XQUOTAON:
|
|
|
case Q_XQUOTAOFF:
|
|
|
case Q_XQUOTARM:
|