aboutsummaryrefslogtreecommitdiffstats
path: root/fs/quota/quota.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2014-10-08 10:07:12 -0400
committerJan Kara <jack@suse.cz>2015-01-30 06:50:16 -0500
commitd3b863248577504f6eecca2a464d6ddf86b71584 (patch)
treea2ccfaebc2d005b7e6a3b1956064403b3aab7d2d /fs/quota/quota.c
parent38e478c4489a845a5e8baf7849c286af5fed5b66 (diff)
quota: Wire up ->quota_{enable,disable} callbacks into Q_QUOTA{ON,OFF}
Make Q_QUOTAON / Q_QUOTAOFF quotactl call ->quota_enable / ->quota_disable callback when provided. To match current behavior of ocfs2 & ext4 we make these quotactls turn on / off quota enforcement for appropriate quota type. Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/quota/quota.c')
-rw-r--r--fs/quota/quota.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/fs/quota/quota.c b/fs/quota/quota.c
index e2ae2b99e555..ce78a70a596f 100644
--- a/fs/quota/quota.c
+++ b/fs/quota/quota.c
@@ -66,18 +66,43 @@ static int quota_sync_all(int type)
66 return ret; 66 return ret;
67} 67}
68 68
69unsigned int qtype_enforce_flag(int type)
70{
71 switch (type) {
72 case USRQUOTA:
73 return FS_QUOTA_UDQ_ENFD;
74 case GRPQUOTA:
75 return FS_QUOTA_GDQ_ENFD;
76 case PRJQUOTA:
77 return FS_QUOTA_PDQ_ENFD;
78 }
79 return 0;
80}
81
69static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id, 82static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id,
70 struct path *path) 83 struct path *path)
71{ 84{
72 if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_on_meta) 85 if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_on_meta &&
86 !sb->s_qcop->quota_enable)
73 return -ENOSYS; 87 return -ENOSYS;
74 if (sb->s_qcop->quota_on_meta) 88 if (sb->s_qcop->quota_on_meta)
75 return sb->s_qcop->quota_on_meta(sb, type, id); 89 return sb->s_qcop->quota_on_meta(sb, type, id);
90 if (sb->s_qcop->quota_enable)
91 return sb->s_qcop->quota_enable(sb, qtype_enforce_flag(type));
76 if (IS_ERR(path)) 92 if (IS_ERR(path))
77 return PTR_ERR(path); 93 return PTR_ERR(path);
78 return sb->s_qcop->quota_on(sb, type, id, path); 94 return sb->s_qcop->quota_on(sb, type, id, path);
79} 95}
80 96
97static int quota_quotaoff(struct super_block *sb, int type)
98{
99 if (!sb->s_qcop->quota_off && !sb->s_qcop->quota_disable)
100 return -ENOSYS;
101 if (sb->s_qcop->quota_disable)
102 return sb->s_qcop->quota_disable(sb, qtype_enforce_flag(type));
103 return sb->s_qcop->quota_off(sb, type);
104}
105
81static int quota_getfmt(struct super_block *sb, int type, void __user *addr) 106static int quota_getfmt(struct super_block *sb, int type, void __user *addr)
82{ 107{
83 __u32 fmt; 108 __u32 fmt;
@@ -440,9 +465,7 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
440 case Q_QUOTAON: 465 case Q_QUOTAON:
441 return quota_quotaon(sb, type, cmd, id, path); 466 return quota_quotaon(sb, type, cmd, id, path);
442 case Q_QUOTAOFF: 467 case Q_QUOTAOFF:
443 if (!sb->s_qcop->quota_off) 468 return quota_quotaoff(sb, type);
444 return -ENOSYS;
445 return sb->s_qcop->quota_off(sb, type);
446 case Q_GETFMT: 469 case Q_GETFMT:
447 return quota_getfmt(sb, type, addr); 470 return quota_getfmt(sb, type, addr);
448 case Q_GETINFO: 471 case Q_GETINFO: