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,
|
||||
struct dentry *dentry, int oflag)
|
||||
{
|
||||
int ret;
|
||||
const struct cred *cred = current_cred();
|
||||
|
||||
static const int oflag2acc[O_ACCMODE] = { MAY_READ, MAY_WRITE,
|
||||
MAY_READ | MAY_WRITE };
|
||||
|
||||
if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY)) {
|
||||
dput(dentry);
|
||||
mntput(ipc_ns->mq_mnt);
|
||||
return ERR_PTR(-EINVAL);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (inode_permission(dentry->d_inode, oflag2acc[oflag & O_ACCMODE])) {
|
||||
dput(dentry);
|
||||
mntput(ipc_ns->mq_mnt);
|
||||
return ERR_PTR(-EACCES);
|
||||
ret = -EACCES;
|
||||
goto err;
|
||||
}
|
||||
|
||||
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,
|
||||
|
Loading…
Reference in New Issue
Block a user