|
@@ -66,18 +66,43 @@ static int quota_sync_all(int type)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+unsigned int qtype_enforce_flag(int type)
|
|
|
|
+{
|
|
|
|
+ switch (type) {
|
|
|
|
+ case USRQUOTA:
|
|
|
|
+ return FS_QUOTA_UDQ_ENFD;
|
|
|
|
+ case GRPQUOTA:
|
|
|
|
+ return FS_QUOTA_GDQ_ENFD;
|
|
|
|
+ case PRJQUOTA:
|
|
|
|
+ return FS_QUOTA_PDQ_ENFD;
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id,
|
|
static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id,
|
|
struct path *path)
|
|
struct path *path)
|
|
{
|
|
{
|
|
- if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_on_meta)
|
|
|
|
|
|
+ if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_on_meta &&
|
|
|
|
+ !sb->s_qcop->quota_enable)
|
|
return -ENOSYS;
|
|
return -ENOSYS;
|
|
if (sb->s_qcop->quota_on_meta)
|
|
if (sb->s_qcop->quota_on_meta)
|
|
return sb->s_qcop->quota_on_meta(sb, type, id);
|
|
return sb->s_qcop->quota_on_meta(sb, type, id);
|
|
|
|
+ if (sb->s_qcop->quota_enable)
|
|
|
|
+ return sb->s_qcop->quota_enable(sb, qtype_enforce_flag(type));
|
|
if (IS_ERR(path))
|
|
if (IS_ERR(path))
|
|
return PTR_ERR(path);
|
|
return PTR_ERR(path);
|
|
return sb->s_qcop->quota_on(sb, type, id, path);
|
|
return sb->s_qcop->quota_on(sb, type, id, path);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int quota_quotaoff(struct super_block *sb, int type)
|
|
|
|
+{
|
|
|
|
+ if (!sb->s_qcop->quota_off && !sb->s_qcop->quota_disable)
|
|
|
|
+ return -ENOSYS;
|
|
|
|
+ if (sb->s_qcop->quota_disable)
|
|
|
|
+ return sb->s_qcop->quota_disable(sb, qtype_enforce_flag(type));
|
|
|
|
+ return sb->s_qcop->quota_off(sb, type);
|
|
|
|
+}
|
|
|
|
+
|
|
static int quota_getfmt(struct super_block *sb, int type, void __user *addr)
|
|
static int quota_getfmt(struct super_block *sb, int type, void __user *addr)
|
|
{
|
|
{
|
|
__u32 fmt;
|
|
__u32 fmt;
|
|
@@ -440,9 +465,7 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
|
|
case Q_QUOTAON:
|
|
case Q_QUOTAON:
|
|
return quota_quotaon(sb, type, cmd, id, path);
|
|
return quota_quotaon(sb, type, cmd, id, path);
|
|
case Q_QUOTAOFF:
|
|
case Q_QUOTAOFF:
|
|
- if (!sb->s_qcop->quota_off)
|
|
|
|
- return -ENOSYS;
|
|
|
|
- return sb->s_qcop->quota_off(sb, type);
|
|
|
|
|
|
+ return quota_quotaoff(sb, type);
|
|
case Q_GETFMT:
|
|
case Q_GETFMT:
|
|
return quota_getfmt(sb, type, addr);
|
|
return quota_getfmt(sb, type, addr);
|
|
case Q_GETINFO:
|
|
case Q_GETINFO:
|