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 | |
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>
-rw-r--r-- | fs/quota/quota.c | 31 | ||||
-rw-r--r-- | include/linux/quotaops.h | 2 |
2 files changed, 29 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: |
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 29e3455f7d41..ff0b665591d0 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h | |||
@@ -386,4 +386,6 @@ static inline void dquot_release_reservation_block(struct inode *inode, | |||
386 | __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE); | 386 | __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE); |
387 | } | 387 | } |
388 | 388 | ||
389 | unsigned int qtype_enforce_flag(int type); | ||
390 | |||
389 | #endif /* _LINUX_QUOTAOPS_ */ | 391 | #endif /* _LINUX_QUOTAOPS_ */ |