diff options
author | Jan Kara <jack@suse.cz> | 2014-10-08 10:07:12 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2015-01-30 06:50:16 -0500 |
commit | d3b863248577504f6eecca2a464d6ddf86b71584 (patch) | |
tree | a2ccfaebc2d005b7e6a3b1956064403b3aab7d2d /fs/quota/quota.c | |
parent | 38e478c4489a845a5e8baf7849c286af5fed5b66 (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.c | 31 |
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 | ||
69 | unsigned 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 | |||
69 | static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id, | 82 | static 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 | ||
97 | static 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 | |||
81 | static int quota_getfmt(struct super_block *sb, int type, void __user *addr) | 106 | static 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: |