diff options
Diffstat (limited to 'fs/quota/quota.c')
-rw-r--r-- | fs/quota/quota.c | 52 |
1 files changed, 42 insertions, 10 deletions
diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 6f3856328eea..d14a799c7785 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c | |||
@@ -66,18 +66,40 @@ 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_enable) |
73 | return -ENOSYS; | 86 | return -ENOSYS; |
74 | if (sb->s_qcop->quota_on_meta) | 87 | if (sb->s_qcop->quota_enable) |
75 | return sb->s_qcop->quota_on_meta(sb, type, id); | 88 | return sb->s_qcop->quota_enable(sb, qtype_enforce_flag(type)); |
76 | if (IS_ERR(path)) | 89 | if (IS_ERR(path)) |
77 | return PTR_ERR(path); | 90 | return PTR_ERR(path); |
78 | return sb->s_qcop->quota_on(sb, type, id, path); | 91 | return sb->s_qcop->quota_on(sb, type, id, path); |
79 | } | 92 | } |
80 | 93 | ||
94 | static int quota_quotaoff(struct super_block *sb, int type) | ||
95 | { | ||
96 | if (!sb->s_qcop->quota_off && !sb->s_qcop->quota_disable) | ||
97 | return -ENOSYS; | ||
98 | if (sb->s_qcop->quota_disable) | ||
99 | return sb->s_qcop->quota_disable(sb, qtype_enforce_flag(type)); | ||
100 | return sb->s_qcop->quota_off(sb, type); | ||
101 | } | ||
102 | |||
81 | static int quota_getfmt(struct super_block *sb, int type, void __user *addr) | 103 | static int quota_getfmt(struct super_block *sb, int type, void __user *addr) |
82 | { | 104 | { |
83 | __u32 fmt; | 105 | __u32 fmt; |
@@ -208,15 +230,26 @@ static int quota_setquota(struct super_block *sb, int type, qid_t id, | |||
208 | return sb->s_qcop->set_dqblk(sb, qid, &fdq); | 230 | return sb->s_qcop->set_dqblk(sb, qid, &fdq); |
209 | } | 231 | } |
210 | 232 | ||
211 | static int quota_setxstate(struct super_block *sb, int cmd, void __user *addr) | 233 | static int quota_enable(struct super_block *sb, void __user *addr) |
212 | { | 234 | { |
213 | __u32 flags; | 235 | __u32 flags; |
214 | 236 | ||
215 | if (copy_from_user(&flags, addr, sizeof(flags))) | 237 | if (copy_from_user(&flags, addr, sizeof(flags))) |
216 | return -EFAULT; | 238 | return -EFAULT; |
217 | if (!sb->s_qcop->set_xstate) | 239 | if (!sb->s_qcop->quota_enable) |
218 | return -ENOSYS; | 240 | return -ENOSYS; |
219 | return sb->s_qcop->set_xstate(sb, flags, cmd); | 241 | return sb->s_qcop->quota_enable(sb, flags); |
242 | } | ||
243 | |||
244 | static int quota_disable(struct super_block *sb, void __user *addr) | ||
245 | { | ||
246 | __u32 flags; | ||
247 | |||
248 | if (copy_from_user(&flags, addr, sizeof(flags))) | ||
249 | return -EFAULT; | ||
250 | if (!sb->s_qcop->quota_disable) | ||
251 | return -ENOSYS; | ||
252 | return sb->s_qcop->quota_disable(sb, flags); | ||
220 | } | 253 | } |
221 | 254 | ||
222 | static int quota_getxstate(struct super_block *sb, void __user *addr) | 255 | static int quota_getxstate(struct super_block *sb, void __user *addr) |
@@ -429,9 +462,7 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, | |||
429 | case Q_QUOTAON: | 462 | case Q_QUOTAON: |
430 | return quota_quotaon(sb, type, cmd, id, path); | 463 | return quota_quotaon(sb, type, cmd, id, path); |
431 | case Q_QUOTAOFF: | 464 | case Q_QUOTAOFF: |
432 | if (!sb->s_qcop->quota_off) | 465 | return quota_quotaoff(sb, type); |
433 | return -ENOSYS; | ||
434 | return sb->s_qcop->quota_off(sb, type); | ||
435 | case Q_GETFMT: | 466 | case Q_GETFMT: |
436 | return quota_getfmt(sb, type, addr); | 467 | return quota_getfmt(sb, type, addr); |
437 | case Q_GETINFO: | 468 | case Q_GETINFO: |
@@ -447,8 +478,9 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, | |||
447 | return -ENOSYS; | 478 | return -ENOSYS; |
448 | return sb->s_qcop->quota_sync(sb, type); | 479 | return sb->s_qcop->quota_sync(sb, type); |
449 | case Q_XQUOTAON: | 480 | case Q_XQUOTAON: |
481 | return quota_enable(sb, addr); | ||
450 | case Q_XQUOTAOFF: | 482 | case Q_XQUOTAOFF: |
451 | return quota_setxstate(sb, cmd, addr); | 483 | return quota_disable(sb, addr); |
452 | case Q_XQUOTARM: | 484 | case Q_XQUOTARM: |
453 | return quota_rmxquota(sb, addr); | 485 | return quota_rmxquota(sb, addr); |
454 | case Q_XGETQSTAT: | 486 | case Q_XGETQSTAT: |