Loading fs/quota/quota.c +146 −104 Original line number Diff line number Diff line Loading @@ -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)) Loading @@ -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); Loading @@ -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) Loading @@ -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; } Loading Loading
fs/quota/quota.c +146 −104 Original line number Diff line number Diff line Loading @@ -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)) Loading @@ -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); Loading @@ -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) Loading @@ -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; } Loading