Commit 04db0dde authored by André Goddard Rosa's avatar André Goddard Rosa Committed by Al Viro

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: default avatarAndré Goddard Rosa <andre.goddard@gmail.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 8834cf79
...@@ -657,24 +657,28 @@ out: ...@@ -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,
......
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