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:
Jiri Slaby 2011-07-26 16:08:46 -07:00 committed by Linus Torvalds
parent a64a26e822
commit 04715206c0

View file

@ -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;
} }