fs/quota: add kernel_quotactl() helper; remove in-kernel call to syscall

Using the fs-internal kernel_quotactl() helper allows us to get rid of
the fs-internal call to the sys_quotactl() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.GA17492@light.dominikbrodowski.net

Acked-by: Jan Kara <jack@suse.cz>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
This commit is contained in:
Dominik Brodowski 2018-03-17 16:26:56 +01:00
parent 183caa3c86
commit cb0b476ab1
3 changed files with 15 additions and 6 deletions

View file

@ -59,7 +59,7 @@ asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special,
case Q_GETQUOTA: case Q_GETQUOTA:
dqblk = compat_alloc_user_space(sizeof(struct if_dqblk)); dqblk = compat_alloc_user_space(sizeof(struct if_dqblk));
compat_dqblk = addr; compat_dqblk = addr;
ret = sys_quotactl(cmd, special, id, dqblk); ret = kernel_quotactl(cmd, special, id, dqblk);
if (ret) if (ret)
break; break;
if (copy_in_user(compat_dqblk, dqblk, sizeof(*compat_dqblk)) || if (copy_in_user(compat_dqblk, dqblk, sizeof(*compat_dqblk)) ||
@ -75,12 +75,12 @@ asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special,
get_user(data, &compat_dqblk->dqb_valid) || get_user(data, &compat_dqblk->dqb_valid) ||
put_user(data, &dqblk->dqb_valid)) put_user(data, &dqblk->dqb_valid))
break; break;
ret = sys_quotactl(cmd, special, id, dqblk); ret = kernel_quotactl(cmd, special, id, dqblk);
break; break;
case Q_XGETQSTAT: case Q_XGETQSTAT:
fsqstat = compat_alloc_user_space(sizeof(struct fs_quota_stat)); fsqstat = compat_alloc_user_space(sizeof(struct fs_quota_stat));
compat_fsqstat = addr; compat_fsqstat = addr;
ret = sys_quotactl(cmd, special, id, fsqstat); ret = kernel_quotactl(cmd, special, id, fsqstat);
if (ret) if (ret)
break; break;
ret = -EFAULT; ret = -EFAULT;
@ -113,7 +113,7 @@ asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special,
ret = 0; ret = 0;
break; break;
default: default:
ret = sys_quotactl(cmd, special, id, addr); ret = kernel_quotactl(cmd, special, id, addr);
} }
return ret; return ret;
} }

View file

@ -833,8 +833,8 @@ static struct super_block *quotactl_block(const char __user *special, int cmd)
* calls. Maybe we need to add the process quotas etc. in the future, * calls. Maybe we need to add the process quotas etc. in the future,
* but we probably should use rlimits for that. * but we probably should use rlimits for that.
*/ */
SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special, int kernel_quotactl(unsigned int cmd, const char __user *special,
qid_t, id, void __user *, addr) qid_t id, void __user *addr)
{ {
uint cmds, type; uint cmds, type;
struct super_block *sb = NULL; struct super_block *sb = NULL;
@ -885,3 +885,9 @@ out:
path_put(pathp); path_put(pathp);
return ret; return ret;
} }
SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special,
qid_t, id, void __user *, addr)
{
return kernel_quotactl(cmd, special, id, addr);
}

View file

@ -27,6 +27,9 @@ static inline bool is_quota_modification(struct inode *inode, struct iattr *ia)
(ia->ia_valid & ATTR_GID && !gid_eq(ia->ia_gid, inode->i_gid)); (ia->ia_valid & ATTR_GID && !gid_eq(ia->ia_gid, inode->i_gid));
} }
int kernel_quotactl(unsigned int cmd, const char __user *special,
qid_t id, void __user *addr);
#if defined(CONFIG_QUOTA) #if defined(CONFIG_QUOTA)
#define quota_error(sb, fmt, args...) \ #define quota_error(sb, fmt, args...) \