|
@@ -47,8 +47,11 @@ static int check_quotactl_permission(struct super_block *sb, int type, int cmd,
|
|
|
|
|
|
static void quota_sync_one(struct super_block *sb, void *arg)
|
|
|
{
|
|
|
- if (sb->s_qcop && sb->s_qcop->quota_sync)
|
|
|
- sb->s_qcop->quota_sync(sb, *(int *)arg);
|
|
|
+ int type = *(int *)arg;
|
|
|
+
|
|
|
+ if (sb->s_qcop && sb->s_qcop->quota_sync &&
|
|
|
+ (sb->s_quota_types & (1 << type)))
|
|
|
+ sb->s_qcop->quota_sync(sb, type);
|
|
|
}
|
|
|
|
|
|
static int quota_sync_all(int type)
|
|
@@ -297,8 +300,14 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
|
|
|
|
|
|
if (type >= (XQM_COMMAND(cmd) ? XQM_MAXQUOTAS : MAXQUOTAS))
|
|
|
return -EINVAL;
|
|
|
+ /*
|
|
|
+ * Quota not supported on this fs? Check this before s_quota_types
|
|
|
+ * since they needn't be set if quota is not supported at all.
|
|
|
+ */
|
|
|
if (!sb->s_qcop)
|
|
|
return -ENOSYS;
|
|
|
+ if (!(sb->s_quota_types & (1 << type)))
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
ret = check_quotactl_permission(sb, type, cmd, id);
|
|
|
if (ret < 0)
|