/* This is the system call interface. This communicates with the user-level programs. Currently this only supports diskquota calls. Maybe we need to add the process quotas etc. in the future, but we probably should use rlimits for that.  */
SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr)
/* This is the system call interface. This communicates with the user-level programs. Currently this only supports diskquota calls. Maybe we need to add the process quotas etc. in the future, but we probably should use rlimits for that.  */
SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr)
{
	uint cmds, type;
	struct super_block *sb = NULL;
	int ret;
	cmds = cmd >> SUBCMDSHIFT;
	type = cmd & SUBCMDMASK;
	if (cmds != Q_SYNC || special) {
		sb = quotactl_block(special);
		if (IS_ERR(sb))
			return PTR_ERR(sb);
	}
	ret = check_quotactl_valid(sb, type, cmds, id);
	if (ret >= 0)
		ret = do_quotactl(sb, type, cmds, id, addr);
	if (sb)
		drop_super(sb);
	return ret;
}