diff options
| -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_ */ |
