fs/fcntl: f_setown, allow returning error
authorJiri Slaby <jslaby@suse.cz>
Tue, 13 Jun 2017 11:35:50 +0000 (13:35 +0200)
committerJeff Layton <jlayton@redhat.com>
Wed, 14 Jun 2017 12:46:36 +0000 (08:46 -0400)
Allow f_setown to return an error value. We will fail in the next patch
with EINVAL for bad input to f_setown, so tile the path for the later
patch.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Cc: Jeff Layton <jlayton@poochiereds.net>
Cc: "J. Bruce Fields" <bfields@fieldses.org>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: linux-fsdevel@vger.kernel.org
Signed-off-by: Jeff Layton <jlayton@redhat.com>
fs/fcntl.c
include/linux/fs.h
net/socket.c

index bbf80344c125d27ef66c53c3e555078fc374dbed..313eba860346870265bf8a109a3a9c7091ca1864 100644 (file)
@@ -109,7 +109,7 @@ void __f_setown(struct file *filp, struct pid *pid, enum pid_type type,
 }
 EXPORT_SYMBOL(__f_setown);
 
-void f_setown(struct file *filp, unsigned long arg, int force)
+int f_setown(struct file *filp, unsigned long arg, int force)
 {
        enum pid_type type;
        struct pid *pid;
@@ -123,6 +123,8 @@ void f_setown(struct file *filp, unsigned long arg, int force)
        pid = find_vpid(who);
        __f_setown(filp, pid, type, force);
        rcu_read_unlock();
+
+       return 0;
 }
 EXPORT_SYMBOL(f_setown);
 
@@ -305,8 +307,7 @@ static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
                force_successful_syscall_return();
                break;
        case F_SETOWN:
-               f_setown(filp, arg, 1);
-               err = 0;
+               err = f_setown(filp, arg, 1);
                break;
        case F_GETOWN_EX:
                err = f_getown_ex(filp, arg);
index aa4affb38c39192f2878a26681b772c1dbf64ed1..25ee1ff6d45b2996b748838831fac3e8386e2466 100644 (file)
@@ -1249,7 +1249,7 @@ extern void fasync_free(struct fasync_struct *);
 extern void kill_fasync(struct fasync_struct **, int, int);
 
 extern void __f_setown(struct file *filp, struct pid *, enum pid_type, int force);
-extern void f_setown(struct file *filp, unsigned long arg, int force);
+extern int f_setown(struct file *filp, unsigned long arg, int force);
 extern void f_delown(struct file *filp);
 extern pid_t f_getown(struct file *filp);
 extern int send_sigurg(struct fown_struct *fown);
index c2564eb25c6b8faf5c99504ef1d3c90f9bb57c73..a30a1e324390f32c57898b69d3daf73d2dcc7aff 100644 (file)
@@ -950,8 +950,7 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
                        err = -EFAULT;
                        if (get_user(pid, (int __user *)argp))
                                break;
-                       f_setown(sock->file, pid, 1);
-                       err = 0;
+                       err = f_setown(sock->file, pid, 1);
                        break;
                case FIOGETOWN:
                case SIOCGPGRP: