switch mqueue syscalls to fget_light()
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 27 Aug 2012 07:11:34 +0000 (03:11 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 27 Sep 2012 01:10:09 +0000 (21:10 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
ipc/mqueue.c

index 9a08acc9e64923ea8af5bb9286d6f2ddd48c052e..5db1b69500fd17660e07a614945466a473480787 100644 (file)
@@ -953,7 +953,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
        ktime_t expires, *timeout = NULL;
        struct timespec ts;
        struct posix_msg_tree_node *new_leaf = NULL;
-       int ret = 0;
+       int ret = 0, fput_needed;
 
        if (u_abs_timeout) {
                int res = prepare_timeout(u_abs_timeout, &expires, &ts);
@@ -967,7 +967,7 @@ 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);
+       filp = fget_light(mqdes, &fput_needed);
        if (unlikely(!filp)) {
                ret = -EBADF;
                goto out;
@@ -1056,7 +1056,7 @@ out_free:
        if (ret)
                free_msg(msg_ptr);
 out_fput:
-       fput(filp);
+       fput_light(filp, fput_needed);
 out:
        return ret;
 }
@@ -1074,6 +1074,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
        ktime_t expires, *timeout = NULL;
        struct timespec ts;
        struct posix_msg_tree_node *new_leaf = NULL;
+       int fput_needed;
 
        if (u_abs_timeout) {
                int res = prepare_timeout(u_abs_timeout, &expires, &ts);
@@ -1084,7 +1085,7 @@ 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);
+       filp = fget_light(mqdes, &fput_needed);
        if (unlikely(!filp)) {
                ret = -EBADF;
                goto out;
@@ -1160,7 +1161,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
                free_msg(msg_ptr);
        }
 out_fput:
-       fput(filp);
+       fput_light(filp, fput_needed);
 out:
        return ret;
 }
@@ -1173,7 +1174,7 @@ out:
 SYSCALL_DEFINE2(mq_notify, mqd_t, mqdes,
                const struct sigevent __user *, u_notification)
 {
-       int ret;
+       int ret, fput_needed;
        struct file *filp;
        struct sock *sock;
        struct inode *inode;
@@ -1220,13 +1221,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);
+                       filp = fget_light(notification.sigev_signo, &fput_needed);
                        if (!filp) {
                                ret = -EBADF;
                                goto out;
                        }
                        sock = netlink_getsockbyfilp(filp);
-                       fput(filp);
+                       fput_light(filp, fput_needed);
                        if (IS_ERR(sock)) {
                                ret = PTR_ERR(sock);
                                sock = NULL;
@@ -1245,7 +1246,7 @@ retry:
                }
        }
 
-       filp = fget(mqdes);
+       filp = fget_light(mqdes, &fput_needed);
        if (!filp) {
                ret = -EBADF;
                goto out;
@@ -1292,7 +1293,7 @@ retry:
        }
        spin_unlock(&info->lock);
 out_fput:
-       fput(filp);
+       fput_light(filp, fput_needed);
 out:
        if (sock) {
                netlink_detachskb(sock, nc);
@@ -1308,6 +1309,7 @@ SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
 {
        int ret;
        struct mq_attr mqstat, omqstat;
+       int fput_needed;
        struct file *filp;
        struct inode *inode;
        struct mqueue_inode_info *info;
@@ -1319,7 +1321,7 @@ SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
                        return -EINVAL;
        }
 
-       filp = fget(mqdes);
+       filp = fget_light(mqdes, &fput_needed);
        if (!filp) {
                ret = -EBADF;
                goto out;
@@ -1356,7 +1358,7 @@ SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
                ret = -EFAULT;
 
 out_fput:
-       fput(filp);
+       fput_light(filp, fput_needed);
 out:
        return ret;
 }