forked from Minki/linux
mqueue: simplify do_open() error handling
It reduces code size: text data bss dec hex filename 9925 72 16 10013 271d ipc/mqueue-BEFORE.o 9885 72 16 9973 26f5 ipc/mqueue-AFTER.o Signed-off-by: André Goddard Rosa <andre.goddard@gmail.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
8834cf796a
commit
04db0dde0e
16
ipc/mqueue.c
16
ipc/mqueue.c
@ -657,24 +657,28 @@ out:
|
|||||||
static struct file *do_open(struct ipc_namespace *ipc_ns,
|
static struct file *do_open(struct ipc_namespace *ipc_ns,
|
||||||
struct dentry *dentry, int oflag)
|
struct dentry *dentry, int oflag)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
const struct cred *cred = current_cred();
|
const struct cred *cred = current_cred();
|
||||||
|
|
||||||
static const int oflag2acc[O_ACCMODE] = { MAY_READ, MAY_WRITE,
|
static const int oflag2acc[O_ACCMODE] = { MAY_READ, MAY_WRITE,
|
||||||
MAY_READ | MAY_WRITE };
|
MAY_READ | MAY_WRITE };
|
||||||
|
|
||||||
if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY)) {
|
if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY)) {
|
||||||
dput(dentry);
|
ret = -EINVAL;
|
||||||
mntput(ipc_ns->mq_mnt);
|
goto err;
|
||||||
return ERR_PTR(-EINVAL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inode_permission(dentry->d_inode, oflag2acc[oflag & O_ACCMODE])) {
|
if (inode_permission(dentry->d_inode, oflag2acc[oflag & O_ACCMODE])) {
|
||||||
dput(dentry);
|
ret = -EACCES;
|
||||||
mntput(ipc_ns->mq_mnt);
|
goto err;
|
||||||
return ERR_PTR(-EACCES);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return dentry_open(dentry, ipc_ns->mq_mnt, oflag, cred);
|
return dentry_open(dentry, ipc_ns->mq_mnt, oflag, cred);
|
||||||
|
|
||||||
|
err:
|
||||||
|
dput(dentry);
|
||||||
|
mntput(ipc_ns->mq_mnt);
|
||||||
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, mode_t, mode,
|
SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, mode_t, mode,
|
||||||
|
Loading…
Reference in New Issue
Block a user