Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c411e5f6 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jan Kara
Browse files

quota: split do_quotactl



Split out a helper for each non-trivial command from do_quotactl.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 0a5a9c72
Loading
Loading
Loading
Loading
+146 −104
Original line number Diff line number Diff line
@@ -234,15 +234,11 @@ static void sync_dquots(int type)
	spin_unlock(&sb_lock);
}

/* Copy parameters and call proper function */
static int do_quotactl(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,
		         void __user *addr)
{
	int ret;

	switch (cmd) {
		case Q_QUOTAON: {
	char *pathname;
	int ret;

	pathname = getname(addr);
	if (IS_ERR(pathname))
@@ -251,10 +247,9 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
	putname(pathname);
	return ret;
}
		case Q_QUOTAOFF:
			return sb->s_qcop->quota_off(sb, type, 0);

		case Q_GETFMT: {
static int quota_getfmt(struct super_block *sb, int type, void __user *addr)
{
	__u32 fmt;

	down_read(&sb_dqopt(sb)->dqptr_sem);
@@ -268,25 +263,32 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
		return -EFAULT;
	return 0;
}
		case Q_GETINFO: {

static int quota_getinfo(struct super_block *sb, int type, void __user *addr)
{
	struct if_dqinfo info;
	int ret;

	ret = sb->s_qcop->get_info(sb, type, &info);
			if (ret)
				return ret;
			if (copy_to_user(addr, &info, sizeof(info)))
	if (!ret && copy_to_user(addr, &info, sizeof(info)))
		return -EFAULT;
			return 0;
	return ret;
}
		case Q_SETINFO: {

static int quota_setinfo(struct super_block *sb, int type, void __user *addr)
{
	struct if_dqinfo info;

	if (copy_from_user(&info, addr, sizeof(info)))
		return -EFAULT;
	return sb->s_qcop->set_info(sb, type, &info);
}
		case Q_GETQUOTA: {

static int quota_getquota(struct super_block *sb, int type, qid_t id,
			  void __user *addr)
{
	struct if_dqblk idq;
	int ret;

	ret = sb->s_qcop->get_dqblk(sb, type, id, &idq);
	if (ret)
@@ -295,61 +297,101 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
		return -EFAULT;
	return 0;
}
		case Q_SETQUOTA: {

static int quota_setquota(struct super_block *sb, int type, qid_t id,
			  void __user *addr)
{
	struct if_dqblk idq;

	if (copy_from_user(&idq, addr, sizeof(idq)))
		return -EFAULT;
	return sb->s_qcop->set_dqblk(sb, type, id, &idq);
}
		case Q_SYNC:
			if (sb)
				sync_quota_sb(sb, type);
			else
				sync_dquots(type);
			return 0;

		case Q_XQUOTAON:
		case Q_XQUOTAOFF:
		case Q_XQUOTARM: {
static int quota_setxstate(struct super_block *sb, int cmd, void __user *addr)
{
	__u32 flags;

	if (copy_from_user(&flags, addr, sizeof(flags)))
		return -EFAULT;
	return sb->s_qcop->set_xstate(sb, flags, cmd);
}
		case Q_XGETQSTAT: {

static int quota_getxstate(struct super_block *sb, void __user *addr)
{
	struct fs_quota_stat fqs;
	int ret;
		
			if ((ret = sb->s_qcop->get_xstate(sb, &fqs)))
				return ret;
			if (copy_to_user(addr, &fqs, sizeof(fqs)))
	ret = sb->s_qcop->get_xstate(sb, &fqs);
	if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
		return -EFAULT;
			return 0;
	return ret;
}
		case Q_XSETQLIM: {

static int quota_setxquota(struct super_block *sb, int type, qid_t id,
			   void __user *addr)
{
	struct fs_disk_quota fdq;

	if (copy_from_user(&fdq, addr, sizeof(fdq)))
		return -EFAULT;
	return sb->s_qcop->set_xquota(sb, type, id, &fdq);
}
		case Q_XGETQUOTA: {

static int quota_getxquota(struct super_block *sb, int type, qid_t id,
			   void __user *addr)
{
	struct fs_disk_quota fdq;
	int ret;

	ret = sb->s_qcop->get_xquota(sb, type, id, &fdq);
			if (ret)
				return ret;
			if (copy_to_user(addr, &fdq, sizeof(fdq)))
	if (!ret && copy_to_user(addr, &fdq, sizeof(fdq)))
		return -EFAULT;
			return 0;
	return ret;
}

/* Copy parameters and call proper function */
static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
		       void __user *addr)
{
	switch (cmd) {
	case Q_QUOTAON:
		return quota_quotaon(sb, type, cmd, id, addr);
	case Q_QUOTAOFF:
		return sb->s_qcop->quota_off(sb, type, 0);
	case Q_GETFMT:
		return quota_getfmt(sb, type, addr);
	case Q_GETINFO:
		return quota_getinfo(sb, type, addr);
	case Q_SETINFO:
		return quota_setinfo(sb, type, addr);
	case Q_GETQUOTA:
		return quota_getquota(sb, type, id, addr);
	case Q_SETQUOTA:
		return quota_setquota(sb, type, id, addr);
	case Q_SYNC:
		if (sb)
			sync_quota_sb(sb, type);
		else
			sync_dquots(type);
		return 0;
	case Q_XQUOTAON:
	case Q_XQUOTAOFF:
	case Q_XQUOTARM:
		return quota_setxstate(sb, cmd, addr);
	case Q_XGETQSTAT:
		return quota_getxstate(sb, addr);
	case Q_XSETQLIM:
		return quota_setxquota(sb, type, id, addr);
	case Q_XGETQUOTA:
		return quota_getxquota(sb, type, id, addr);
	case Q_XQUOTASYNC:
		return sb->s_qcop->quota_sync(sb, type);
	/* We never reach here unless validity check is broken */
	default:
		BUG();
	}

	return 0;
}