Merge https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
[linux-2.6-microblaze.git] / drivers / net / tun.c
index 8867d39..fbed05a 100644 (file)
@@ -1921,12 +1921,15 @@ static ssize_t tun_chr_write_iter(struct kiocb *iocb, struct iov_iter *from)
        struct tun_file *tfile = file->private_data;
        struct tun_struct *tun = tun_get(tfile);
        ssize_t result;
+       int noblock = 0;
 
        if (!tun)
                return -EBADFD;
 
-       result = tun_get_user(tun, tfile, NULL, from,
-                             file->f_flags & O_NONBLOCK, false);
+       if ((file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAIT))
+               noblock = 1;
+
+       result = tun_get_user(tun, tfile, NULL, from, noblock, false);
 
        tun_put(tun);
        return result;
@@ -2137,10 +2140,15 @@ static ssize_t tun_chr_read_iter(struct kiocb *iocb, struct iov_iter *to)
        struct tun_file *tfile = file->private_data;
        struct tun_struct *tun = tun_get(tfile);
        ssize_t len = iov_iter_count(to), ret;
+       int noblock = 0;
 
        if (!tun)
                return -EBADFD;
-       ret = tun_do_read(tun, tfile, to, file->f_flags & O_NONBLOCK, NULL);
+
+       if ((file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAIT))
+               noblock = 1;
+
+       ret = tun_do_read(tun, tfile, to, noblock, NULL);
        ret = min_t(ssize_t, ret, len);
        if (ret > 0)
                iocb->ki_pos = ret;
@@ -3071,10 +3079,19 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
                                   "Linktype set failed because interface is up\n");
                        ret = -EBUSY;
                } else {
+                       ret = call_netdevice_notifiers(NETDEV_PRE_TYPE_CHANGE,
+                                                      tun->dev);
+                       ret = notifier_to_errno(ret);
+                       if (ret) {
+                               netif_info(tun, drv, tun->dev,
+                                          "Refused to change device type\n");
+                               break;
+                       }
                        tun->dev->type = (int) arg;
                        netif_info(tun, drv, tun->dev, "linktype set to %d\n",
                                   tun->dev->type);
-                       ret = 0;
+                       call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE,
+                                                tun->dev);
                }
                break;