]> Pileus Git - ~andy/linux/blobdiff - ipc/mqueue.c
Merge branch 'tpmdd-fixes-v3.6' of git://github.com/shpedoikal/linux into for-linus
[~andy/linux] / ipc / mqueue.c
index 9a08acc9e64923ea8af5bb9286d6f2ddd48c052e..6b97e2466fad3c82f50d914c4bbd1724eb8d2dec 100644 (file)
@@ -142,7 +142,6 @@ static int msg_insert(struct msg_msg *msg, struct mqueue_inode_info *info)
                leaf = kmalloc(sizeof(*leaf), GFP_ATOMIC);
                if (!leaf)
                        return -ENOMEM;
-               rb_init_node(&leaf->rb_node);
                INIT_LIST_HEAD(&leaf->msg_list);
                info->qsize += sizeof(*leaf);
        }
@@ -944,7 +943,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
                size_t, msg_len, unsigned int, msg_prio,
                const struct timespec __user *, u_abs_timeout)
 {
-       struct file *filp;
+       struct fd f;
        struct inode *inode;
        struct ext_wait_queue wait;
        struct ext_wait_queue *receiver;
@@ -967,21 +966,21 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
 
        audit_mq_sendrecv(mqdes, msg_len, msg_prio, timeout ? &ts : NULL);
 
-       filp = fget(mqdes);
-       if (unlikely(!filp)) {
+       f = fdget(mqdes);
+       if (unlikely(!f.file)) {
                ret = -EBADF;
                goto out;
        }
 
-       inode = filp->f_path.dentry->d_inode;
-       if (unlikely(filp->f_op != &mqueue_file_operations)) {
+       inode = f.file->f_path.dentry->d_inode;
+       if (unlikely(f.file->f_op != &mqueue_file_operations)) {
                ret = -EBADF;
                goto out_fput;
        }
        info = MQUEUE_I(inode);
-       audit_inode(NULL, filp->f_path.dentry);
+       audit_inode(NULL, f.file->f_path.dentry);
 
-       if (unlikely(!(filp->f_mode & FMODE_WRITE))) {
+       if (unlikely(!(f.file->f_mode & FMODE_WRITE))) {
                ret = -EBADF;
                goto out_fput;
        }
@@ -1013,7 +1012,6 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
 
        if (!info->node_cache && new_leaf) {
                /* Save our speculative allocation into the cache */
-               rb_init_node(&new_leaf->rb_node);
                INIT_LIST_HEAD(&new_leaf->msg_list);
                info->node_cache = new_leaf;
                info->qsize += sizeof(*new_leaf);
@@ -1023,7 +1021,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
        }
 
        if (info->attr.mq_curmsgs == info->attr.mq_maxmsg) {
-               if (filp->f_flags & O_NONBLOCK) {
+               if (f.file->f_flags & O_NONBLOCK) {
                        ret = -EAGAIN;
                } else {
                        wait.task = current;
@@ -1056,7 +1054,7 @@ out_free:
        if (ret)
                free_msg(msg_ptr);
 out_fput:
-       fput(filp);
+       fdput(f);
 out:
        return ret;
 }
@@ -1067,7 +1065,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
 {
        ssize_t ret;
        struct msg_msg *msg_ptr;
-       struct file *filp;
+       struct fd f;
        struct inode *inode;
        struct mqueue_inode_info *info;
        struct ext_wait_queue wait;
@@ -1084,21 +1082,21 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
 
        audit_mq_sendrecv(mqdes, msg_len, 0, timeout ? &ts : NULL);
 
-       filp = fget(mqdes);
-       if (unlikely(!filp)) {
+       f = fdget(mqdes);
+       if (unlikely(!f.file)) {
                ret = -EBADF;
                goto out;
        }
 
-       inode = filp->f_path.dentry->d_inode;
-       if (unlikely(filp->f_op != &mqueue_file_operations)) {
+       inode = f.file->f_path.dentry->d_inode;
+       if (unlikely(f.file->f_op != &mqueue_file_operations)) {
                ret = -EBADF;
                goto out_fput;
        }
        info = MQUEUE_I(inode);
-       audit_inode(NULL, filp->f_path.dentry);
+       audit_inode(NULL, f.file->f_path.dentry);
 
-       if (unlikely(!(filp->f_mode & FMODE_READ))) {
+       if (unlikely(!(f.file->f_mode & FMODE_READ))) {
                ret = -EBADF;
                goto out_fput;
        }
@@ -1121,7 +1119,6 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
 
        if (!info->node_cache && new_leaf) {
                /* Save our speculative allocation into the cache */
-               rb_init_node(&new_leaf->rb_node);
                INIT_LIST_HEAD(&new_leaf->msg_list);
                info->node_cache = new_leaf;
                info->qsize += sizeof(*new_leaf);
@@ -1130,7 +1127,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
        }
 
        if (info->attr.mq_curmsgs == 0) {
-               if (filp->f_flags & O_NONBLOCK) {
+               if (f.file->f_flags & O_NONBLOCK) {
                        spin_unlock(&info->lock);
                        ret = -EAGAIN;
                } else {
@@ -1160,7 +1157,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
                free_msg(msg_ptr);
        }
 out_fput:
-       fput(filp);
+       fdput(f);
 out:
        return ret;
 }
@@ -1174,7 +1171,7 @@ SYSCALL_DEFINE2(mq_notify, mqd_t, mqdes,
                const struct sigevent __user *, u_notification)
 {
        int ret;
-       struct file *filp;
+       struct fd f;
        struct sock *sock;
        struct inode *inode;
        struct sigevent notification;
@@ -1220,13 +1217,13 @@ SYSCALL_DEFINE2(mq_notify, mqd_t, mqdes,
                        skb_put(nc, NOTIFY_COOKIE_LEN);
                        /* and attach it to the socket */
 retry:
-                       filp = fget(notification.sigev_signo);
-                       if (!filp) {
+                       f = fdget(notification.sigev_signo);
+                       if (!f.file) {
                                ret = -EBADF;
                                goto out;
                        }
-                       sock = netlink_getsockbyfilp(filp);
-                       fput(filp);
+                       sock = netlink_getsockbyfilp(f.file);
+                       fdput(f);
                        if (IS_ERR(sock)) {
                                ret = PTR_ERR(sock);
                                sock = NULL;
@@ -1245,14 +1242,14 @@ retry:
                }
        }
 
-       filp = fget(mqdes);
-       if (!filp) {
+       f = fdget(mqdes);
+       if (!f.file) {
                ret = -EBADF;
                goto out;
        }
 
-       inode = filp->f_path.dentry->d_inode;
-       if (unlikely(filp->f_op != &mqueue_file_operations)) {
+       inode = f.file->f_path.dentry->d_inode;
+       if (unlikely(f.file->f_op != &mqueue_file_operations)) {
                ret = -EBADF;
                goto out_fput;
        }
@@ -1292,7 +1289,7 @@ retry:
        }
        spin_unlock(&info->lock);
 out_fput:
-       fput(filp);
+       fdput(f);
 out:
        if (sock) {
                netlink_detachskb(sock, nc);
@@ -1308,7 +1305,7 @@ SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
 {
        int ret;
        struct mq_attr mqstat, omqstat;
-       struct file *filp;
+       struct fd f;
        struct inode *inode;
        struct mqueue_inode_info *info;
 
@@ -1319,14 +1316,14 @@ SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
                        return -EINVAL;
        }
 
-       filp = fget(mqdes);
-       if (!filp) {
+       f = fdget(mqdes);
+       if (!f.file) {
                ret = -EBADF;
                goto out;
        }
 
-       inode = filp->f_path.dentry->d_inode;
-       if (unlikely(filp->f_op != &mqueue_file_operations)) {
+       inode = f.file->f_path.dentry->d_inode;
+       if (unlikely(f.file->f_op != &mqueue_file_operations)) {
                ret = -EBADF;
                goto out_fput;
        }
@@ -1335,15 +1332,15 @@ SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
        spin_lock(&info->lock);
 
        omqstat = info->attr;
-       omqstat.mq_flags = filp->f_flags & O_NONBLOCK;
+       omqstat.mq_flags = f.file->f_flags & O_NONBLOCK;
        if (u_mqstat) {
                audit_mq_getsetattr(mqdes, &mqstat);
-               spin_lock(&filp->f_lock);
+               spin_lock(&f.file->f_lock);
                if (mqstat.mq_flags & O_NONBLOCK)
-                       filp->f_flags |= O_NONBLOCK;
+                       f.file->f_flags |= O_NONBLOCK;
                else
-                       filp->f_flags &= ~O_NONBLOCK;
-               spin_unlock(&filp->f_lock);
+                       f.file->f_flags &= ~O_NONBLOCK;
+               spin_unlock(&f.file->f_lock);
 
                inode->i_atime = inode->i_ctime = CURRENT_TIME;
        }
@@ -1356,7 +1353,7 @@ SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
                ret = -EFAULT;
 
 out_fput:
-       fput(filp);
+       fdput(f);
 out:
        return ret;
 }