ipc/mqueue.c: refactor failure handling
If new_inode fails to allocate an inode we need only to return with NULL. But now we test the opposite and have all the work in a nested block. So do the opposite to save one indentation level (and remove unnecessary line breaks). This is only a preparation/cleanup for the next patch where we fix up return values from mqueue_get_inode. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Cc: Manfred Spraul <manfred@colorfullife.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
a64a26e822
commit
04715206c0
111
ipc/mqueue.c
111
ipc/mqueue.c
|
@ -115,69 +115,70 @@ static struct inode *mqueue_get_inode(struct super_block *sb,
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
|
|
||||||
inode = new_inode(sb);
|
inode = new_inode(sb);
|
||||||
if (inode) {
|
if (!inode)
|
||||||
inode->i_ino = get_next_ino();
|
goto err;
|
||||||
inode->i_mode = mode;
|
|
||||||
inode->i_uid = current_fsuid();
|
|
||||||
inode->i_gid = current_fsgid();
|
|
||||||
inode->i_mtime = inode->i_ctime = inode->i_atime =
|
|
||||||
CURRENT_TIME;
|
|
||||||
|
|
||||||
if (S_ISREG(mode)) {
|
inode->i_ino = get_next_ino();
|
||||||
struct mqueue_inode_info *info;
|
inode->i_mode = mode;
|
||||||
struct task_struct *p = current;
|
inode->i_uid = current_fsuid();
|
||||||
unsigned long mq_bytes, mq_msg_tblsz;
|
inode->i_gid = current_fsgid();
|
||||||
|
inode->i_mtime = inode->i_ctime = inode->i_atime = CURRENT_TIME;
|
||||||
|
|
||||||
inode->i_fop = &mqueue_file_operations;
|
if (S_ISREG(mode)) {
|
||||||
inode->i_size = FILENT_SIZE;
|
struct mqueue_inode_info *info;
|
||||||
/* mqueue specific info */
|
struct task_struct *p = current;
|
||||||
info = MQUEUE_I(inode);
|
unsigned long mq_bytes, mq_msg_tblsz;
|
||||||
spin_lock_init(&info->lock);
|
|
||||||
init_waitqueue_head(&info->wait_q);
|
|
||||||
INIT_LIST_HEAD(&info->e_wait_q[0].list);
|
|
||||||
INIT_LIST_HEAD(&info->e_wait_q[1].list);
|
|
||||||
info->notify_owner = NULL;
|
|
||||||
info->qsize = 0;
|
|
||||||
info->user = NULL; /* set when all is ok */
|
|
||||||
memset(&info->attr, 0, sizeof(info->attr));
|
|
||||||
info->attr.mq_maxmsg = ipc_ns->mq_msg_max;
|
|
||||||
info->attr.mq_msgsize = ipc_ns->mq_msgsize_max;
|
|
||||||
if (attr) {
|
|
||||||
info->attr.mq_maxmsg = attr->mq_maxmsg;
|
|
||||||
info->attr.mq_msgsize = attr->mq_msgsize;
|
|
||||||
}
|
|
||||||
mq_msg_tblsz = info->attr.mq_maxmsg * sizeof(struct msg_msg *);
|
|
||||||
info->messages = kmalloc(mq_msg_tblsz, GFP_KERNEL);
|
|
||||||
if (!info->messages)
|
|
||||||
goto out_inode;
|
|
||||||
|
|
||||||
mq_bytes = (mq_msg_tblsz +
|
inode->i_fop = &mqueue_file_operations;
|
||||||
(info->attr.mq_maxmsg * info->attr.mq_msgsize));
|
inode->i_size = FILENT_SIZE;
|
||||||
|
/* mqueue specific info */
|
||||||
spin_lock(&mq_lock);
|
info = MQUEUE_I(inode);
|
||||||
if (u->mq_bytes + mq_bytes < u->mq_bytes ||
|
spin_lock_init(&info->lock);
|
||||||
u->mq_bytes + mq_bytes >
|
init_waitqueue_head(&info->wait_q);
|
||||||
task_rlimit(p, RLIMIT_MSGQUEUE)) {
|
INIT_LIST_HEAD(&info->e_wait_q[0].list);
|
||||||
spin_unlock(&mq_lock);
|
INIT_LIST_HEAD(&info->e_wait_q[1].list);
|
||||||
/* mqueue_evict_inode() releases info->messages */
|
info->notify_owner = NULL;
|
||||||
goto out_inode;
|
info->qsize = 0;
|
||||||
}
|
info->user = NULL; /* set when all is ok */
|
||||||
u->mq_bytes += mq_bytes;
|
memset(&info->attr, 0, sizeof(info->attr));
|
||||||
spin_unlock(&mq_lock);
|
info->attr.mq_maxmsg = ipc_ns->mq_msg_max;
|
||||||
|
info->attr.mq_msgsize = ipc_ns->mq_msgsize_max;
|
||||||
/* all is ok */
|
if (attr) {
|
||||||
info->user = get_uid(u);
|
info->attr.mq_maxmsg = attr->mq_maxmsg;
|
||||||
} else if (S_ISDIR(mode)) {
|
info->attr.mq_msgsize = attr->mq_msgsize;
|
||||||
inc_nlink(inode);
|
|
||||||
/* Some things misbehave if size == 0 on a directory */
|
|
||||||
inode->i_size = 2 * DIRENT_SIZE;
|
|
||||||
inode->i_op = &mqueue_dir_inode_operations;
|
|
||||||
inode->i_fop = &simple_dir_operations;
|
|
||||||
}
|
}
|
||||||
|
mq_msg_tblsz = info->attr.mq_maxmsg * sizeof(struct msg_msg *);
|
||||||
|
info->messages = kmalloc(mq_msg_tblsz, GFP_KERNEL);
|
||||||
|
if (!info->messages)
|
||||||
|
goto out_inode;
|
||||||
|
|
||||||
|
mq_bytes = (mq_msg_tblsz +
|
||||||
|
(info->attr.mq_maxmsg * info->attr.mq_msgsize));
|
||||||
|
|
||||||
|
spin_lock(&mq_lock);
|
||||||
|
if (u->mq_bytes + mq_bytes < u->mq_bytes ||
|
||||||
|
u->mq_bytes + mq_bytes > task_rlimit(p, RLIMIT_MSGQUEUE)) {
|
||||||
|
spin_unlock(&mq_lock);
|
||||||
|
/* mqueue_evict_inode() releases info->messages */
|
||||||
|
goto out_inode;
|
||||||
|
}
|
||||||
|
u->mq_bytes += mq_bytes;
|
||||||
|
spin_unlock(&mq_lock);
|
||||||
|
|
||||||
|
/* all is ok */
|
||||||
|
info->user = get_uid(u);
|
||||||
|
} else if (S_ISDIR(mode)) {
|
||||||
|
inc_nlink(inode);
|
||||||
|
/* Some things misbehave if size == 0 on a directory */
|
||||||
|
inode->i_size = 2 * DIRENT_SIZE;
|
||||||
|
inode->i_op = &mqueue_dir_inode_operations;
|
||||||
|
inode->i_fop = &simple_dir_operations;
|
||||||
}
|
}
|
||||||
|
|
||||||
return inode;
|
return inode;
|
||||||
out_inode:
|
out_inode:
|
||||||
iput(inode);
|
iput(inode);
|
||||||
|
err:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue