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

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
...@@ -234,15 +234,11 @@ restart: ...@@ -234,15 +234,11 @@ restart:
spin_unlock(&sb_lock); spin_unlock(&sb_lock);
} }
/* Copy parameters and call proper function */ static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id,
static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
void __user *addr) void __user *addr)
{ {
int ret;
switch (cmd) {
case Q_QUOTAON: {
char *pathname; char *pathname;
int ret;
pathname = getname(addr); pathname = getname(addr);
if (IS_ERR(pathname)) if (IS_ERR(pathname))
...@@ -250,11 +246,10 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, ...@@ -250,11 +246,10 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
ret = sb->s_qcop->quota_on(sb, type, id, pathname, 0); ret = sb->s_qcop->quota_on(sb, type, id, pathname, 0);
putname(pathname); putname(pathname);
return ret; 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; __u32 fmt;
down_read(&sb_dqopt(sb)->dqptr_sem); down_read(&sb_dqopt(sb)->dqptr_sem);
...@@ -267,26 +262,33 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, ...@@ -267,26 +262,33 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
if (copy_to_user(addr, &fmt, sizeof(fmt))) if (copy_to_user(addr, &fmt, sizeof(fmt)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
case Q_GETINFO: {
static int quota_getinfo(struct super_block *sb, int type, void __user *addr)
{
struct if_dqinfo info; struct if_dqinfo info;
int ret;
ret = sb->s_qcop->get_info(sb, type, &info); ret = sb->s_qcop->get_info(sb, type, &info);
if (ret) if (!ret && copy_to_user(addr, &info, sizeof(info)))
return ret;
if (copy_to_user(addr, &info, sizeof(info)))
return -EFAULT; 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; struct if_dqinfo info;
if (copy_from_user(&info, addr, sizeof(info))) if (copy_from_user(&info, addr, sizeof(info)))
return -EFAULT; return -EFAULT;
return sb->s_qcop->set_info(sb, type, &info); 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; struct if_dqblk idq;
int ret;
ret = sb->s_qcop->get_dqblk(sb, type, id, &idq); ret = sb->s_qcop->get_dqblk(sb, type, id, &idq);
if (ret) if (ret)
...@@ -294,62 +296,102 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, ...@@ -294,62 +296,102 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
if (copy_to_user(addr, &idq, sizeof(idq))) if (copy_to_user(addr, &idq, sizeof(idq)))
return -EFAULT; return -EFAULT;
return 0; 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; struct if_dqblk idq;
if (copy_from_user(&idq, addr, sizeof(idq))) if (copy_from_user(&idq, addr, sizeof(idq)))
return -EFAULT; return -EFAULT;
return sb->s_qcop->set_dqblk(sb, type, id, &idq); 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: static int quota_setxstate(struct super_block *sb, int cmd, void __user *addr)
case Q_XQUOTAOFF: {
case Q_XQUOTARM: {
__u32 flags; __u32 flags;
if (copy_from_user(&flags, addr, sizeof(flags))) if (copy_from_user(&flags, addr, sizeof(flags)))
return -EFAULT; return -EFAULT;
return sb->s_qcop->set_xstate(sb, flags, cmd); 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; struct fs_quota_stat fqs;
int ret;
if ((ret = sb->s_qcop->get_xstate(sb, &fqs))) ret = sb->s_qcop->get_xstate(sb, &fqs);
return ret; if (!ret && copy_to_user(addr, &fqs, sizeof(fqs)))
if (copy_to_user(addr, &fqs, sizeof(fqs)))
return -EFAULT; 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; struct fs_disk_quota fdq;
if (copy_from_user(&fdq, addr, sizeof(fdq))) if (copy_from_user(&fdq, addr, sizeof(fdq)))
return -EFAULT; return -EFAULT;
return sb->s_qcop->set_xquota(sb, type, id, &fdq); 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; struct fs_disk_quota fdq;
int ret;
ret = sb->s_qcop->get_xquota(sb, type, id, &fdq); ret = sb->s_qcop->get_xquota(sb, type, id, &fdq);
if (ret) if (!ret && copy_to_user(addr, &fdq, sizeof(fdq)))
return ret;
if (copy_to_user(addr, &fdq, sizeof(fdq)))
return -EFAULT; return -EFAULT;
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; 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: case Q_XQUOTASYNC:
return sb->s_qcop->quota_sync(sb, type); return sb->s_qcop->quota_sync(sb, type);
/* We never reach here unless validity check is broken */ /* We never reach here unless validity check is broken */
default: default:
BUG(); BUG();
} }
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment